lht 发表于 2011-6-9 00:11:33

怎样去除坐标表内相同的坐标?

如题:有一坐标表ptn=((1235 255 140) (1258 230 150) (1258 230 150) (1263 262 160)),如何去掉一个(1258 230 150)坐标,结果为ptn=((1235 255 140) (1258 230 150) (1263 262 160)).请各位大侠赐教.

zhynt 发表于 2011-6-9 00:52:57

;;清理表中的重复项
(defun purge_lst (lst / n m lst1 tmplist)
(setq tmplist '()
tmplist (cons (car lst) tmplist)
lsttmp (cutnum_lst lst 0)
)
(setq n (length lsttmp)
m 0
)
(while (/= m n)
    (setq id   '()
   lst1 (nth m lsttmp)
    )
    (foreach na tmplist
      (if (= (eq_point na lst1) nil)
(setq id (cons 0 id))
(setq id (cons 1 id))
      )
    )
    (if (= (member '1 id) nil)
      (setq tmplist (cons lst1 tmplist))
    )
    (setq m (1+ m))
)
(setq tmplist (reverse tmplist))
)
;;去除表中指定索引处的表项
(defun cutnum_lst (oldlst num / k templst)
(setq k 0
templst '()
)
(foreach n oldlst
    (if (/= k num)
      (setq templst (cons n templst)
   k   (1+ k)
      )
    )
    (setq k (1+ k))
)
(setq newlst (reverse templst))
)
;;判断两点是否等
(defun eq_point (pt1 pt2)
(if (and (equal (car pt1) (car pt2) 1e-5)
    (equal (cadr pt1) (cadr pt2) 1e-5)
      )
    t
    nil
)
)

例子:
命令: (setq a (purge_lst'((1235 255 140) (1258 230 150) (1258 230 150) (1263
262 160))))
((1235 255 140) (1258 230 150) (1263 262 160))

if 发表于 2011-6-9 01:12:26

本帖最后由 if 于 2011-6-9 01:13 编辑

(defun test (lst / it lst2)
(while (setq lst2 (cons (setq it (car lst)) lst2)
         lst(vl-remove-if '(lambda (x) (equal it x 1e-6)) lst)
))
(reverse lst2)
)
------------------------------------------
(test '((1235 255 140) (1258 230 150) (1258 230 150)(1263 262 160)))
-------->
((1235 255 140) (1258 230 150) (1263 262 160))

lht 发表于 2011-6-9 09:22:36

      因才薄学浅,无法领会楼上俩位大侠的函数,现已自行解决,特别致谢俩位大侠的帮助!表内项需经排序后才能清理表中重复项.
;;清理表中的重复项
      (setq ptn'((1235 255 140) (1258 230 150) (1258 230 150)(1263 262 160)))
      (setq n 1 ptnk '())
      (setq p1 (nth 0 ptn))
      (setq ptnk (append ptnk (list p1)))
      (repeat (- (length ptn) 1)
            (setq p2 (nth n ptn))
            (if (/= (distance p1 p2) 0.0) (setq ptnk (append ptnk (list p2))))
            (setq n (+ n 1))
            (setq p1 p2)
      )
      (setq ptn ptnk)

yoyoho 发表于 2011-6-9 09:29:53

感谢分享 < 谢谢咯! >
页: [1]
查看完整版本: 怎样去除坐标表内相同的坐标?