怎样去除坐标表内相同的坐标?
如题:有一坐标表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)).请各位大侠赐教. ;;清理表中的重复项(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: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)) 因才薄学浅,无法领会楼上俩位大侠的函数,现已自行解决,特别致谢俩位大侠的帮助!表内项需经排序后才能清理表中重复项.
;;清理表中的重复项
(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) 感谢分享 < 谢谢咯! >
页:
[1]