wide 发表于 2024-12-19 08:39:26

根据Z坐标高差值进行点表分组

本帖最后由 wide 于 2024-12-19 18:14 编辑

请教各位大佬,如何根据Z坐标高差值进行点表分组,比如下表,根据Z坐标高差是400(可更改)进行分组,分组后为'( ( (0 0 0) (0 0 100) (0 100 200)(0 500 400)(0 0 500)(100 0 800)) ((0 0 1200)(0 0 1500)) ((0 0 3200)(0 0 3300)) ),即( (0 0 0) (0 0 100) (0 100 200)(0 500 400)(0 0 500)(100 0 800))为一组,((0 0 1200)(0 0 1500))为一组,((0 0 3200)(0 0 3300))为一组,共3组组成的新表。


[*]'((0 0 0) (0 0 100)(0 0 500)(0 0 1200)(0 100 200)(0 0 1500)(0 0 3200)(100 0 800)(0 500 400)(0 0 3300))

luqzcm 发表于 2024-12-19 09:03:25

本帖最后由 luqzcm 于 2024-12-19 09:11 编辑

http://bbs.mjtd.com/forum.php?mo ... 0%F2%2B%D6%B1%CF%DF
这里楼主发的源码中的排序子函数可用

看错了,没看到还要分组。

补充一下我的想法:先排序,然后根据各元素Z的差值分割数若干个子表,然后在list在一起。

xyp1964 发表于 2024-12-19 11:18:20

本帖最后由 xyp1964 于 2024-12-19 18:26 编辑

(defun abc (ptn dz)
;; (abc '((0 0 0) (0 0 100)(0 0 500)(0 0 1200)(0 100 200)(0 0 3200)(100 0 800)(0 500 400)) 400)
;; → (((0 0 0) (0 0 100) (0 100 200)) ((0 500 400) (0 0 500)) ((100 0 800)) ((0 0 1200)) ((0 0 3200)))
(setq ptn (vl-sort ptn '(lambda (x y) (< (last x) (last y))))
      ptn (mapcar '(lambda (x) (list (fix (/ (last x) dz)) x)) ptn)
)
(mapcar '(lambda (x) (apply 'append (cdr x))) (xyp-Count1 ptn))
)

xyp1964 发表于 2024-12-19 18:25:41

(defun abc (ptn dz / p1 p2 tmp new)
"以Z值差分组"
;; (abc '((0 0 0) (0 0 100)(0 0 500)(0 0 1200)(0 100 200)(0 0 3200)(100 0 800)(0 500 400)) 400)
;; → (((0 0 0) (0 0 100) (0 100 200) (0 500 400) (0 0 500) (100 0 800)) ((0 0 1200)) ((0 0 3200)))
(setq ptn(vl-sort ptn '(lambda (x y) (< (last x) (last y))))
      p1   (car ptn)
      ptn(cdr ptn)
      tmp (list p1)
)
(while (setq p2 (car ptn))
    (setq ptn (cdr ptn))
    (if (< (- (caddr p2) (caddr p1)) dz)
      (setq tmp (cons p2 tmp))
      (setq new(cons (reverse tmp) new)
            tmp (list p2)
      )
    )
    (setq p1 p2)
)
(reverse (cons (reverse tmp) new))
)

香远益清 发表于 2024-12-20 09:15:10

不错,想的很周到,高手在民间啊

tangweinbs 发表于 2024-12-21 19:10:11

感谢分享,学习一下。

llsheng_73 发表于 2024-12-21 19:35:07

本帖最后由 llsheng_73 于 2024-12-21 19:46 编辑

(defun tt(lst n / l)
(foreach a(setq lst(vl-sort lst(function(lambda(a b)(<(last a)(last b))))))
    (if(and l(equal(last(caar l))(last a)n))
      (setq l(cons(cons a(car l))(cdr l)))
      (setq l(cons(list a)l))))
(mapcar(function reverse)(reverse l))
)

llsheng_73 发表于 2024-12-21 19:37:08

xyp1964 发表于 2024-12-19 18:25


看错要求了,院长这个是对的。。。
页: [1]
查看完整版本: 根据Z坐标高差值进行点表分组