tm20038175 发表于 2011-6-11 14:48:16

【点排序】已知txt点文件,怎么给点排序?

【点排序】已知txt点文件,怎么给点排序?
txt点文件的格式为:……
想给点排序的原则是:
1. 判断x,x小在前,如果x相等,判断y
2. 判断y,y小在前,如果y相等,判断z
3. 判断z,z小在前,如果z相等,删除重复点。
输出文件:
txt点文件的格式为:……

tm20038175 发表于 2011-6-11 14:49:54

考虑到小数点关系,误差在0.005内算作相等。

tm20038175 发表于 2011-6-11 14:57:46

或者不用文件,只对list=(pt1 pt2 ……)排序也可以啊,排序方式也是按先X,在Y,在Z方式,各自从小到大。

tm20038175 发表于 2011-6-11 15:19:56

论坛上秋风的程序,但是没有误差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)
         )
   )
             )
   )

tm20038175 发表于 2011-6-11 15:33:29

还有这个,都没有误差判断,而是直接判断

tm20038175 发表于 2011-6-11 15:34:27

;坐标表排序,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))
)

)

Gu_xl 发表于 2011-6-11 15:51:02

回复 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

tm20038175 发表于 2011-6-11 16:05:04

十分感谢版主热心回复!!!

另外问一下:fuzz就是容差
吗?

198526 发表于 2011-6-11 16:39:22

(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)))))
)

tm20038175 发表于 2011-6-11 21:38:31

回复 Gu_xl 的帖子

(reverse result) 好像这句话不行啊,得到的结果是从大到小的排列~~~~
页: [1] 2 3
查看完整版本: 【点排序】已知txt点文件,怎么给点排序?