【点排序】已知txt点文件,怎么给点排序?
【点排序】已知txt点文件,怎么给点排序?txt点文件的格式为:……
想给点排序的原则是:
1. 判断x,x小在前,如果x相等,判断y
2. 判断y,y小在前,如果y相等,判断z
3. 判断z,z小在前,如果z相等,删除重复点。
输出文件:
txt点文件的格式为:……
考虑到小数点关系,误差在0.005内算作相等。 或者不用文件,只对list=(pt1 pt2 ……)排序也可以啊,排序方式也是按先X,在Y,在Z方式,各自从小到大。 论坛上秋风的程序,但是没有误差0.005判断,求改进
Sort_and_Write_pList :见附件
(defun Sort_and_Write_pList (fname plist / fp pt)
;; sort plist first
(setq plist (vl-sort plist
'(lambda (p1 p2)
(cond ((< (car p1) (car p2)) T)
((and (= (car p1) (car p2))
(< (cadr p1) (cadr p2))
)
T
)
((and (= (car p1) (car p2))
(= (cadr p1) (cadr p2))
(< (caddr p1) (caddr p2))
)
T
)
(T nil)
)
)
)
) 还有这个,都没有误差判断,而是直接判断 ;坐标表排序,By xiao_longxin
(defun order (/ coord_list coord_ord x y z bl_1 bl_2 i j k n)
(setq coord_list
'(
(1 2 3)
(1 1 1)
(1 1 3)
(1 2 2)
(3 3 1)
(2 2 2)
(3 3 3)
(2 2 2)
(1 2 2)
(1 1 1)
)
)
(setq n (length coord_list))
(setq i 0)
(repeat n
(setq
coord_ord (append coord_ord (list (cons i (nth i coord_list))))
)
(setq i (1+ i))
)
;排序x
(setq i 1)
(repeat (- n 1)
(setq j i)
(setq pd t)
(while (and (/= j 0) pd)
(if (< (nth 1 (nth j coord_ord))
(nth 1 (nth (- j 1) coord_ord))
)
(progn
(setq bl_1 (nth j coord_ord))
(setq bl_2 (nth (- j 1) coord_ord))
(setq coord_ord (subst -99 bl_1 coord_ord))
(setq coord_ord (subst bl_1 bl_2 coord_ord))
(setq coord_ord (subst bl_2 -99 coord_ord))
)
(setq pd nil)
)
(setq j (1- j))
)
(setq i (1+ i))
)
;排序y
(setq i 1)
(repeat (- n 1)
(setq j i)
(setq pd t)
(while (and (/= j 0) pd)
(if (and (= (nth 1 (nth j coord_ord))
(nth 1 (nth (- j 1) coord_ord))
)
(< (nth 2 (nth j coord_ord))
(nth 2 (nth (- j 1) coord_ord))
)
)
(progn
(setq bl_1 (nth j coord_ord))
(setq bl_2 (nth (- j 1) coord_ord))
(setq coord_ord (subst -99 bl_1 coord_ord))
(setq coord_ord (subst bl_1 bl_2 coord_ord))
(setq coord_ord (subst bl_2 -99 coord_ord))
)
(setq pd nil)
)
(setq j (1- j))
)
(setq i (1+ i))
)
;排序z
(setq i 1)
(repeat (- n 1)
(setq j i)
(setq pd t)
(while (and (/= j 0) pd)
(if (and (= (nth 1 (nth j coord_ord))
(nth 1 (nth (- j 1) coord_ord))
)
(= (nth 2 (nth j coord_ord))
(nth 2 (nth (- j 1) coord_ord))
)
(< (nth 3 (nth j coord_ord))
(nth 3 (nth (- j 1) coord_ord))
)
)
(progn
(setq bl_1 (nth j coord_ord))
(setq bl_2 (nth (- j 1) coord_ord))
(setq coord_ord (subst -99 bl_1 coord_ord))
(setq coord_ord (subst bl_1 bl_2 coord_ord))
(setq coord_ord (subst bl_2 -99 coord_ord))
)
(setq pd nil)
)
(setq j (1- j))
)
(setq i (1+ i))
)
(setq coord_list nil)
(setq i 0)
(repeat n
(setq
coord_list
(append coord_list (list (cdr (nth i coord_ord))))
)
(setq i (1+ i))
)
) 回复 tm20038175 的帖子
;;;==================================================================
;;;Sort_pList 点表按照xyz升序排序,并删除重点,参数:点表 容差精度
;;;用法: (Sort_pList '((1.005 2.007 3.002)(1 2 3) (1.001 2.002 3.001) (1.005 2.005 3.002)(1.005 2.008 3.002) (1.005 2.006 3.002)) 0.001)
;;;==================================================================
(defun Sort_pList (plist fuzz / result p)
(setq plist
(vl-sort plist
'(lambda (p1 p2)
(cond ((and
(< (car p1) (car p2))
(not (equal (car p1) (car p2) fuzz))
) ;_ and
T
)
((and (equal (car p1) (car p2) fuzz)
(< (cadr p1) (cadr p2))
(not (equal (cadr p1) (cadr p2) fuzz))
) ;_ and
T
)
((and (equal (car p1) (car p2) fuzz)
(equal (cadr p1) (cadr p2) fuzz)
(< (caddr p1) (caddr p2))
(not (equal (caddr p1) (caddr p2) fuzz))
) ;_ and
T
)
(T nil)
) ;_ cond
) ;_ lambda
) ;_ vl-sort
) ;_ setq
(while plist
(setq p (car plist)
result (cons p result)
plist (cdr plist)
)
(while (and plist (equal p (car plist) fuzz))
(setq plist (cdr plist))
)
)
(reverse result)
) ;_ defun
十分感谢版主热心回复!!!
另外问一下:fuzz就是容差
吗? (setq a '((3 5 0)(3 5 0)(3 5 1)(3 2 4)(3 2 4)(3 2 3)(4 2 1)(4 2 1) (4 2 2) (6 4 3)))
(vl-sort (listxx a)
(function (lambda (e1 e2)
(cond ((/= (car e1) (car e2))(< (car e1) (car e2)))
((/= (cadr e1) (cadr e2))(< (cadr e1) (cadr e2)) )
((< (caddr e1) (caddr e2)) )
) ))
)
(defun listxx ( a / b) ;删除表中重复元素1
(foreach x a (if(not(member x b))(setq b(append b(list x)))))
) 回复 Gu_xl 的帖子
(reverse result) 好像这句话不行啊,得到的结果是从大到小的排列~~~~