根据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:11 编辑
http://bbs.mjtd.com/forum.php?mo ... 0%F2%2B%D6%B1%CF%DF
这里楼主发的源码中的排序子函数可用
看错了,没看到还要分组。
补充一下我的想法:先排序,然后根据各元素Z的差值分割数若干个子表,然后在list在一起。
本帖最后由 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))
) (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))
) 不错,想的很周到,高手在民间啊 感谢分享,学习一下。 本帖最后由 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))
) xyp1964 发表于 2024-12-19 18:25
看错要求了,院长这个是对的。。。
页:
[1]