明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 846|回复: 11

[讨论] 根据Z坐标高差值进行点表分组

  [复制链接]
发表于 2024-12-19 08:39:26 | 显示全部楼层 |阅读模式
本帖最后由 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))

"觉得好,就打赏"
还没有人打赏,支持一下
回复

使用道具 举报

发表于 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在一起。
回复 支持 反对

使用道具 举报

发表于 2024-12-19 11:18:20 | 显示全部楼层
本帖最后由 xyp1964 于 2024-12-19 18:26 编辑

  1. (defun abc (ptn dz)
  2.   ;; (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)
  3.   ;; → (((0 0 0) (0 0 100) (0 100 200)) ((0 500 400) (0 0 500)) ((100 0 800)) ((0 0 1200)) ((0 0 3200)))
  4.   (setq ptn (vl-sort ptn '(lambda (x y) (< (last x) (last y))))
  5.         ptn (mapcar '(lambda (x) (list (fix (/ (last x) dz)) x)) ptn)
  6.   )
  7.   (mapcar '(lambda (x) (apply 'append (cdr x))) (xyp-Count1 ptn))
  8. )

点评

没有达到要求的效果,分的组不对。  发表于 2024-12-19 15:14
回复 支持 反对

使用道具 举报

发表于 2024-12-19 18:25:41 | 显示全部楼层
  1. (defun abc (ptn dz / p1 p2 tmp new)
  2.   "以Z值差分组"
  3.   ;; (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)
  4.   ;; → (((0 0 0) (0 0 100) (0 100 200) (0 500 400) (0 0 500) (100 0 800)) ((0 0 1200)) ((0 0 3200)))
  5.   (setq ptn  (vl-sort ptn '(lambda (x y) (< (last x) (last y))))
  6.         p1   (car ptn)
  7.         ptn  (cdr ptn)
  8.         tmp (list p1)
  9.   )
  10.   (while (setq p2 (car ptn))
  11.     (setq ptn (cdr ptn))
  12.     (if (< (- (caddr p2) (caddr p1)) dz)
  13.       (setq tmp (cons p2 tmp))
  14.       (setq new  (cons (reverse tmp) new)
  15.             tmp (list p2)
  16.       )
  17.     )
  18.     (setq p1 p2)
  19.   )
  20.   (reverse (cons (reverse tmp) new))
  21. )

点评

(ABC'((0 0 500)(0 0 1200)(0 100 200)(0 0 3200)(100 0 800)(0 500 400))400) =>(((0 100 200) (0 500 400) (0 0 500) (100 0 800)) ((0 0 1200)) ((0 0 3200)))  发表于 2024-12-21 19:21
非常感谢大佬的帮助。  发表于 2024-12-20 13:56
回复 支持 反对

使用道具 举报

发表于 2024-12-20 09:15:10 | 显示全部楼层
不错,想的很周到,高手在民间啊
回复 支持 反对

使用道具 举报

发表于 2024-12-21 19:10:11 | 显示全部楼层
感谢分享,学习一下。
回复 支持 反对

使用道具 举报

发表于 2024-12-21 19:35:07 | 显示全部楼层
本帖最后由 llsheng_73 于 2024-12-21 19:46 编辑

  1. (defun tt(lst n / l)
  2.   (foreach a(setq lst(vl-sort lst(function(lambda(a b)(<(last a)(last b))))))
  3.     (if(and l(equal(last(caar l))(last a)n))
  4.       (setq l(cons(cons a(car l))(cdr l)))
  5.       (setq l(cons(list a)l))))
  6.   (mapcar(function reverse)(reverse l))
  7.   )
回复 支持 反对

使用道具 举报

发表于 2024-12-21 19:37:08 | 显示全部楼层

看错要求了,院长这个是对的。。。

点评

哈哈……  发表于 2024-12-22 18:26
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-4-7 06:36 , Processed in 0.228276 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表