明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1244|回复: 33

[提问] lisp能否实现四叉树算法?

[复制链接]
发表于 2024-3-8 11:38 | 显示全部楼层 |阅读模式
最近有个需求,不知如何实现,情况如下:



dwg中有一万个点,指定某点,找出至该点特定距离范围内的所有点。


使用lisp直接进行遍历,再判断距离肯定可以解决问题,但是效率太低下。


经过了解,发现四叉树之类的算法可以进行快速计算,但不知道用lisp能否实现四叉树算法呢?

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-3-8 13:15 | 显示全部楼层
  1. (defun abc (pt dd / i p1 p2 s1 ss ss1)
  2.   (setq p1 (mapcar '+ pt (list (- dd) (- dd)))
  3.         p2 (mapcar '+ pt (list dd dd))
  4.         ss1(ssadd)
  5.         i  -1
  6.   )
  7.   (if (setq ss (ssget "c" p1 p2 '((0 . "point"))))
  8.     (while (setq s1 (ssname ss (setq i (1+ i))))
  9.       (if (<= (distance (cdr (assoc 10 (entget s1))) pt) dd)
  10.         (ssadd s1 ss1)
  11.       )
  12.     )
  13.   )
  14.   ss1
  15. )
回复 支持 1 反对 0

使用道具 举报

发表于 2024-3-8 12:36 | 显示全部楼层
lisp可以根据已知的点计算获取范围的矩形角点直接选点,没必要遍历所有点。
回复 支持 1 反对 0

使用道具 举报

发表于 2024-3-14 14:37 | 显示全部楼层
(defun c:zdlj (/     a           b         dxf   dxf2  ents  ents2 es    jb
               jb2   jb-ks jb-pt jdcds l     old   old-cdr     p
               p2    ss
              )
        ;最短路径
  (vl-catch-all-apply 'load (list (findfile "zdlj.vlx")))
                                        ;声明引用zdlj.vlx这个模块
  (vl-catch-all-apply 'vl-doc-import (list "zdlj")) ;声明引用函数
  (SETQ JDCDS NIL)
  (SETQ ES NIL)
  (setq jb-pt nil)
  (SETQ SS (SSGET))
  (and ss(setq        ents (vl-remove-if
               (function listp)
               (mapcar (function cadr) (ssnamex SS))
             )
  ))
  (setq jb-ks nil)
  (while (setq a (car ents))
    (setq dxf nil)
    (setq jb nil)
    (setq p nil)
    (setq ents2 nil)
    (setq dxf (entget a))
    (setq jb (cdr (assoc 5 dxf)))
    (setq p (cdr (assoc 10 dxf)))
    (setq ents2 (cdr ents))
    (while (setq b (car ents2))
      (setq dxf2 nil)
      (setq jb2 nil)
      (setq p2 nil)
      (setq l nil)
      (setq old nil)
      (setq old-cdr nil)
      (setq dxf2 (entget B))
      (setq jb2 (cdr (assoc 5 dxf2)))
      (setq p2 (cdr (assoc 10 dxf2)))
      (SETQ L (DISTANCE P P2))
      (SETQ L (VL-PRINC-TO-STRING L))
      (setq old (assoc jb jb-ks));建立索引
      (setq old-cdr (cdr old))
      (setq old-cdr (cons (CONS (cons JB JB2) L) old-cdr))
      (setq jb-ks (vl-remove old jb-ks))
      (setq jb-ks (cons (cons jb old-cdr) jb-ks)) ;建立数据库索引
      (setq ents2 (cdr ents2))
    )
    (setq jb-pt (cons (cons jb p) jb-pt)) ;建立数据库索引
    (setq ents (cdr ents))
  )
  (setq
    jb-ks
     (mapcar
       (function
         (lambda (a)
           (cons
             (car a)
             (vl-sort (cdr a)
                      (function (lambda (x y) (< (cdr x) (cdr y))))
             )
           )
         )
       )
       jb-ks
     )
  )
  (setq jb-ks (reverse jb-ks))
  (mapcar (function (lambda (a / e1 e2 p1 p2)
                      (setq e1 (car a))
                      (setq e2 (cdr (car (car (cdr a)))))
                      (setq p1 (cdr (assoc e1 jb-pt))) ;启用索引
                      (setq p2 (cdr (assoc e2 jb-pt))) ;启用索引
                      (and p1
                           p2
                           (vla-addLine
                             (vla-Get-ModelSpace
                               (vla-get-ActiveDocument
                                 (vlax-get-acad-object)
                               )
                             )
                             (vlax-3D-Point p1)
                             (vlax-3D-Point p2)
                           )
                      )
                    )
          )
          jb-ks
  )
)
发表于 2024-3-8 12:11 | 显示全部楼层
可以实现,但是不建议,因为会卡死
 楼主| 发表于 2024-3-8 14:50 | 显示全部楼层
谢谢,ssget的方法我也知道,只是对这个四叉树比较好奇,还以为可以大幅加快计算速度。
我看arx的四叉树算法计算速度就挺快的啊,网址:http://bbs.mjtd.com/forum.php?mo ... E6%CA%F7&page=1
 楼主| 发表于 2024-3-8 14:52 | 显示全部楼层
https://zhuanlan.zhihu.com/p/93423676
看这个网址的介绍,四叉树遍历与全图遍历相比,时间会大幅度节省。
难道是lisp实现四叉树本身,就比较浪费时间么?
发表于 2024-3-8 17:22 来自手机 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2024-3-8 17:25 编辑


不是lisp实现不了,只是这个数据结构写起来麻烦,
c#和arx的都写好了,抄抄就好了
https://www.cnblogs.com/JJBox/p/15512317.html
而且为什么说麻烦,因为你之后还有红黑树,还有hashmap,还有hashset,还有多线程...
不要想不开在lisp实现,lisp讲的就是暴力遍历
 楼主| 发表于 2024-3-8 17:40 | 显示全部楼层
你有种再说一遍 发表于 2024-3-8 17:22
不是lisp实现不了,只是这个数据结构写起来麻烦,
c#和arx的都写好了,抄抄就好了
https://www.cnblogs.co ...

好的,了解了,杀鸡不用牛刀,反之亦然。
发表于 2024-3-8 20:22 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2024-3-8 22:07 编辑
20060510412 发表于 2024-3-8 17:40
好的,了解了,杀鸡不用牛刀,反之亦然。

是的,如果你想学,那我就告诉你抄多方便,去哪里抄?换一个语言抄,趁机学一门新语言吧...如果你非要在lisp实现,那么我还得告诉你一些弊端,例如递归层数和树高控制(lisp在递归太深会溢出栈,这个栈大小没法设置)...然后看看测试代码行数,会得到一个结论:优化和测试才是关键,功能谁不会写...
发表于 2024-3-8 21:17 | 显示全部楼层
一行代码,10W点秒出,


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

不合题意  发表于 2024-3-9 12:03
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 12:41 , Processed in 2.034389 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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