明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: yjr111

G版和HIGHFLYBIRD及高人请进!如何能求出所有的路径呢?

    [复制链接]
 楼主| 发表于 2012-2-22 17:31:38 | 显示全部楼层
Gu_xl 发表于 2012-2-22 16:58
先发个演示图和编译的程序,程序仅对Line有效!

G版,简直爱死你了,太棒了!
回复

使用道具 举报

 楼主| 发表于 2012-2-22 23:32:55 | 显示全部楼层
安静等待G版的核心代码!
回复

使用道具 举报

发表于 2012-2-23 10:47:39 | 显示全部楼层
学习了 非常感谢
回复

使用道具 举报

发表于 2012-2-23 19:51:23 | 显示全部楼层
思路和核心代码在二楼公布!

评分

参与人数 2明经币 +2 金钱 +30 收起 理由
yjr111 + 1 + 30
flytoday + 1 膜拜。。太强大了

查看全部评分

回复

使用道具 举报

发表于 2012-2-23 20:56:07 | 显示全部楼层
G版
(GXL-BREAK_SSFuzz ss Fuzz)子程序没有发上来,出错

点评

授人以鱼不如授人以渔!  发表于 2012-2-23 21:17
回复

使用道具 举报

 楼主| 发表于 2012-2-23 23:20:09 | 显示全部楼层
Gu_xl 发表于 2012-2-23 19:51
思路和核心代码在二楼公布!

现在才能轻松打开网页,对G版感激涕零,老泪纵横啊
回复

使用道具 举报

发表于 2012-2-25 01:26:58 | 显示全部楼层
本帖最后由 chlh_jd 于 2012-2-25 01:32 编辑

之前有见过求2点间的最短距离,效率非常高,也用了穷举法了,稍微修改下应该能满足楼主的要求。
  1. ;;;来自网络,谁写的,我回头查下补上
  2. (defun c:2pt-min-dis (/ show getss@ getconnect main getconnect pt1 pt2 ss1 ss2 complete zhf_time_dot)
  3.   ;;;相关函数
  4. (defun show (lst stop)
  5.   (mapcar (function(lambda (x) (redraw (vlax-vla-object->ename x) 3)))
  6.    lst
  7.   )
  8.   (if stop
  9.     (progn (getpoint)
  10.     (mapcar (function (lambda (x) (redraw (vlax-vla-object->ename x) 4)))
  11.      lst
  12.     )
  13.     )
  14.   )
  15. )
  16. (defun getss@ (p)
  17.   (ssget "c"
  18.   p
  19.   (polar p (/ pi 4) (/ (getvar "viewsize") 5000))
  20.   (list (cons 0 "arc,ellipse,*line"))
  21.   )
  22. )
  23. (defun getconnect (e)
  24.   (vl-remove e
  25.       (append (ss2lst (getss@ (vlax-curve-getStartpoint e)) t)
  26.        (ss2lst (getss@ (vlax-curve-getEndpoint e)) t)
  27.       )
  28.   )
  29. )
  30. (defun getconnect (e)
  31.   (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e))
  32. )
  33.   ;;;________________________________________________
  34. (defun main (pt1 pt2 show / ss sse line path paths shortlen shortlst ss1
  35.       shortest)
  36.   (setq count 0)
  37.   (setq ss  (ss2lst (getss@ pt1) t)
  38. sse (ss2lst (getss@ pt2) t)
  39.   )
  40.   (if (and ss sse)
  41.     (progn
  42.       (setq passed-ss ss
  43.      path-ss   (mapcar '(lambda (x) (list x)) ss)
  44.      dist-ss   (mapcar '(lambda (x) (list x (get:len x))) ss)
  45.      dist-ss   (vl-sort dist-ss '(lambda (a b) (< (cadr a) (cadr b))))
  46.      complete  nil
  47.       )
  48.       (mapcar
  49. (function(lambda (x)
  50.     (if (member x sse)
  51.       (setq
  52.         complete (append complete (list (list x (get:len x))))
  53.       )
  54.     )
  55.   ))
  56. ss
  57.       )
  58.       (if complete
  59. (setq complete (vl-sort complete
  60.     (function (lambda (a b) (< (cadr a) (cadr b))))
  61.          )
  62.        shortest (cadar complete)
  63. )
  64.       )
  65.       (if (and shortest (= shortest (distance pt1 pt2)))
  66. (progn
  67.    (list (cadar complete) (list (caar complete)))
  68. )
  69. (progn
  70.    (while (and dist-ss (> (length sse) (length complete)))
  71.      (setq now   (car dist-ss)
  72.     dist-ss (cdr dist-ss)
  73.      )
  74. ;;;_____________________________
  75. ;;;_____________________________
  76. ;;;_____________________________
  77.      (if show
  78.        (progn
  79.   (vlax-put (car now) (quote color) (+ 21 (* 10 (rem count 20))))
  80.   (vla-update (car now))
  81.        )
  82.      )
  83. ;;;_____________________________
  84. ;;;_____________________________
  85. ;;;_____________________________
  86.      (if (member (car now) sse)
  87.        (progn
  88.   (setq complete (append complete (list now)))
  89. ;;;__________________________________________________
  90. ;;;到达终点后剔出所有距离已经超出最小路由长度的未完成方向
  91.   (setq complete
  92.           (vl-sort complete
  93.      (function (lambda (a b) (< (cadr a) (cadr b))))
  94.           )
  95.         shortest (cadar complete)
  96.         dist-ss  (mapcar (function (lambda (x)
  97.        (if (< (cadr x) shortest)
  98.          x
  99.          nil
  100.        )
  101.      ))
  102.            dist-ss
  103.           )
  104.         dist-ss  (vl-remove nil dist-ss)
  105.   )
  106. ;;;__________________________________________________
  107. ;;;__________________________________________________
  108.        )
  109.        (progn
  110.   (setq count (1+ count))
  111.   (setq ss (getconnect (car now)))
  112.   (mapcar '(lambda (x) (setq ss (vl-remove x ss)))
  113.    passed-ss
  114.   )
  115.   (setq passed-ss (append passed-ss ss)
  116.         path-ss (append
  117.       path-ss
  118.       (mapcar (function (lambda (x) (list x (car now)))) ss)
  119.     )
  120.         dist-ss (append
  121.       dist-ss
  122.       (mapcar
  123.         (function (lambda (x)
  124.            (if (or (not shortest)
  125.             (< (get:len x) shortest)
  126.         )
  127.       (list x (+ (cadr now) (get:len x)))
  128.            )
  129.          ))
  130.         ss
  131.       )
  132.     )
  133.         dist-ss (vl-remove nil dist-ss)
  134.         dist-ss (vl-sort dist-ss
  135.       (function (lambda (a b) (< (cadr a) (cadr b))))
  136.     )
  137.   )
  138.        )
  139.      )
  140.    )
  141. ;;;_____________________________
  142. ;;;_____________________________
  143. ;;;_____________________________
  144.    (if show
  145.      (progn
  146.        (mapcar (function (lambda (x) (vlax-put x (quote color) 0))) passed-ss)
  147.        (mapcar (function (lambda (x) (vla-update x))) passed-ss)
  148.      )
  149.    )
  150. ;;;_____________________________
  151. ;;;_____________________________
  152. ;;;_____________________________
  153.    (if complete
  154.      (progn
  155.        (setq
  156.   complete (vl-sort complete
  157.       (function(lambda (a b) (< (cadr a) (cadr b))))
  158.     )
  159.   n  (car complete)
  160.        )
  161.        (setq len (cadr n)
  162.       n (car n)
  163.        )
  164.        (while n
  165.   (setq ss1 (append ss1 (list n)))
  166.   (setq n (cadr (assoc n path-ss)))
  167.        )
  168.        (list len (reverse ss1))
  169.      )
  170.      nil
  171.    )
  172. )
  173.       )
  174.     )
  175.     nil
  176.   )
  177. )
  178. ;;;___________________________________________
  179.   (redraw)
  180.   (setq pt1 (getpoint "\n起点:")
  181. pt2 (getpoint "\n终点:")
  182.   )
  183.   (mapcar
  184.     (function(lambda (pt)
  185.        (grdraw (polar pt (* pi 0.25) (/ (getvar "viewsize") 40))
  186.         (polar pt (* pi -0.75) (/ (getvar "viewsize") 40))
  187.         1
  188.        )
  189.        (grdraw (polar pt (* pi 0.75) (/ (getvar "viewsize") 40))
  190.         (polar pt (* pi -0.25) (/ (getvar "viewsize") 40))
  191.         1
  192.        )
  193.      ))
  194.     (list pt1 pt2)
  195.   )  
  196.   (setq ss1 (main pt1 pt2 t))
  197.   (if ss1
  198.     (progn
  199.       (setq ss2 (ssadd))
  200.       (mapcar (function(lambda (x)
  201.    (setq ss2 (ssadd (vlax-vla-object->ename x) ss2))
  202.         ))
  203.        (cadr ss1)
  204.       )
  205.       (princ (strcat "\n虚线显示最短路线, 共需"
  206.        (itoa (sslength ss2))
  207.        "步,总长度为:"
  208.        (rtos (car ss1))
  209.        "  历时:"
  210.        (z_timer)
  211.       )
  212.       )
  213.       (show (cadr ss1) nil)
  214.     )   
  215.   )
  216.   (princ)
  217. )
  218. ;;;两点最短路径结束
  219. ;;;---------------------------------------------------------------------;;;

点评

大师,还是运行不了,去掉重复定义的getconnect也不行!  发表于 2013-4-12 10:52
楼主你好,不能应用啊,是不是有的函数不全,如 SS2LST 请楼主一并公布,好人做到底啊,衷心感谢了  发表于 2012-11-6 13:48
错误: no function definition: SS2LST,请chlh_jd帮忙补全  发表于 2012-2-25 08:42

评分

参与人数 1明经币 +1 收起 理由
yjr111 + 1 很给力!

查看全部评分

回复

使用道具 举报

发表于 2012-2-25 15:42:07 | 显示全部楼层
chlh_jd的程序好像缺了两个函数,get:len和z_timer,先找个替代一下,z_timer就直接删了吧。
(defun get:len (en / len)
  (if (vl-catch-all-error-p
        (setq len (vl-catch-all-apply
                    'vlax-curve-getdistatparam
                    (list en
                          (vl-catch-all-apply
                            'vlax-curve-getendparam
                            (list en)
                          )
                    )
                  )
        )
      )
    nil
    len
  )
)

评分

参与人数 1明经币 +1 收起 理由
yjr111 + 1 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2012-2-25 20:15:21 | 显示全部楼层
干啥用的                    

点评

配线  发表于 2012-2-26 00:46
回复

使用道具 举报

发表于 2012-2-26 13:42:25 | 显示全部楼层
这样子啊,回复只为看贴,神奇的代码
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-19 05:06 , Processed in 0.154519 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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