dcl1214
发表于 2024-3-14 12:30:44
本帖最后由 dcl1214 于 2024-3-14 12:42 编辑
你有种再说一遍 发表于 2024-3-13 16:40
要把优化进行到底,想想导航软件要是20秒出结果,那你也不用了,所以太长时间的操作只能是玩具,图算法不就是 ...
地图导航的时候,你从起点到终点,就一条数据,我说的四万是不同的起点和终点,单线程共计耗时20秒,仔细用脑想想
地图导航的方法可能更加简单了,比如说,你从北京到上海,那么可以在程序里面先导航省份到省份,因为省份到省份就几个高速路口,然后进入到省份的高速路口以后,再次调用城市的出入口,意思是可以区块化导航,该省略的节点信息可以省略掉,只用关键节点作为寻址
dcl1214
发表于 2024-3-14 14:37:26
(defun c:zdlj (/ a b dxf dxf2entsents2 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
)
)
Gu_xl
发表于 2024-3-14 16:09:08
本帖最后由 Gu_xl 于 2024-3-14 17:17 编辑
我觉得根据楼主题意,既然是在AutoCAD 的图上,那我们首要就是要充分利用AutoCAD本身的功能来实现目标,而不是去讨论算法什么的,这不是它的强项!下面是实现按半径查找代码,不管图上有多少个点,速度都很快!
;;参数 pt 位置点坐标
;; jd 查找半径
(defun gxl-sel-SSgetByPoint (pt jd / px py px0 px1 py0 py1 ss pz rtn e)
(setqpx(car pt)
px0 (- px jd)
px1 (+ px jd)
py(cadr pt)
py0 (- py jd)
py1 (+ py jd)
pz 1e99
)
(setqss
(ssget"x"
(list '(0 . "point")
'(-4 . "<and")
'(-4 . ">=,>=,<>")
(list 10 px0 py0 pz)
'(-4 . "<=,<=,<>")
(list 10 px1 py1 pz)
'(-4 . "and>")
)
)
)
(if ss
(progn
(repeat (setq n (sslength ss))
(if (<= (distance (list (car pt) (cadr pt)) (cdr (assoc 10 (entget (setq e (ssname ss (setq n (1- n)))))))) jd)
(setq rtn (cons e rtn))
)
)
)
)
;;颜色变红提示
(foreach e rtn (entmod (append (entget e) '((62 . 1)))))
;;返回选中点图元名列表
rtn
)
;;测试
(defun c:tt (/ pt jd)
(setq rtn (gxl-sel-SSgetByPoint (setq pt (getpoint "\n位置点:")) (setq jd (getdist pt "\n半径:"))))
(command "circle" "_non" pt jd)
(princ (strcat "\n选中" (itoa (length rtn)) "个点."))
(princ)
)
你有种再说一遍
发表于 2024-3-14 16:14:33
dcl1214 发表于 2024-3-14 12:30
地图导航的时候,你从起点到终点,就一条数据,我说的四万是不同的起点和终点,单线程共计耗时20秒,仔细 ...
那你试试double改float能快多少
20060510412
发表于 2024-3-14 19:09:07
本帖最后由 20060510412 于 2024-3-14 19:10 编辑
Gu_xl 发表于 2024-3-14 16:09
我觉得根据楼主题意,既然是在AutoCAD 的图上,那我们首要就是要充分利用AutoCAD本身的功能来实现目标,而 ...
顾版好,其实我本来的目的,是想找出距离某多段线特定距离范围内的点。
本来想的是对多段线进行偏移,使用形成的封闭区域再配合ssget,进行筛选。但是该方法的弊端,就是有时候多段线偏移之后无法形成有效的封闭区域。
全部遍历,根据每个点到多段线的距离进行筛选,效率又不高,所以才想到能否用四叉树的算法。
Gu_xl
发表于 2024-3-15 08:54:25
20060510412 发表于 2024-3-14 19:09
顾版好,其实我本来的目的,是想找出距离某多段线特定距离范围内的点。
本来想的是对多段线进行偏移, ...
先按直线包围框用(ssget "x" )方法选出点,然后再逐点判断距离,可以大大减小计算量。
20060510412
发表于 2024-3-15 09:10:32
Gu_xl 发表于 2024-3-15 08:54
先按直线包围框用(ssget "x" )方法选出点,然后再逐点判断距离,可以大大减小计算量。
谢谢顾版,目前用lisp的话,应该只能通过ssget的方式,减小计算量。
肯定比全部遍历要高效得多。
guosheyang
发表于 2024-3-16 12:59:33
本帖最后由 guosheyang 于 2024-3-16 13:17 编辑
多段线偏移之后无法形成有效的封闭区域 的情况 应该是偏移距离过大造成自相交了 将偏移距离减小些就可以
20060510412
发表于 2024-3-16 20:12:35
guosheyang 发表于 2024-3-16 12:59
多段线偏移之后无法形成有效的封闭区域 的情况 应该是偏移距离过大造成自相交了 将偏移距离减小些 ...
是的,所以说偏移多段线的方法不通用。
还是取最小包围盒,更通用一些。
dcl1214
发表于 2024-3-17 19:16:58
你有种再说一遍 发表于 2024-3-14 16:14
那你试试double改float能快多少
跟这个没关系的,路径计算一定是先找到路径,最后计算,而不是一边找路径,一边计算