找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 857|回复: 7

[求助] [求助]:关于路由的问题?

[复制链接]

已领礼包: 1个

财富等级: 恭喜发财

发表于 2005-3-27 11:33:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
不知道 大家有没遇到这个问题,已经知道路由曲线(多段线)和
线上2个点的坐标,如何根据这两点找出最短的路由 并建立一条最短路由的多段线, 我写了点程序,写的非常的复杂,特别的多次处理后点的坐标的小数点后面的后有点相差, 所有老是出问题,希望高手能出手.
我是刚到这个论坛的,希望和大家多交流,我是杭州的,如果有杭州的朋友更好,可以一起喝酒 一起交流,我的QQ是156558475
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 488个

财富等级: 日进斗金

发表于 2005-3-27 19:57:37 | 显示全部楼层
画个图比较好,不好理解
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

 楼主| 发表于 2005-3-28 14:08:01 | 显示全部楼层
我不知道 如何贴图,只好上传一个附件.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-3-29 15:06:27 | 显示全部楼层
没看懂是什么意思,说的明白点.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

 楼主| 发表于 2005-3-29 17:37:20 | 显示全部楼层
也可以这么说 有好多根交叉的多段线,好比公交车的路由,我现在知道线上是2个点的坐标,好比知道2个公交车站,就想知道沿公交车的路线,得到两个点的最短路由.
不过我是线路没有不会有很多种路由,不知道这样说 有没有把问题说清楚,还希望各位能指点一下如何贴图.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

 楼主| 发表于 2005-3-30 17:04:29 | 显示全部楼层
郁闷  这个可能真的比较难,不然我自己也可以做出来拉
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-3-30 21:04:54 | 显示全部楼层
有人提到过用(Dijkstra算法),我在网上找了一下,看得我是云里雾里的,最关键是思路问题。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

 楼主| 发表于 2005-4-3 19:30:52 | 显示全部楼层
还是自己写了个,初次写程序,希望大家给修改一下,程序运行的结果是:选择一个点(只能是边上的点)得到路由上的任何一点到该点的路由:



(defun c:test()
  (vl-load-com)
  (setq aline (ssget "X" '((0 . "*LINE"))) )
  (bleakpline aline)
  (setq aline (ssget "X" '((0 . "*LINE"))) )
  (bleakp aline)
  (setq aline (ssget "X" '((0 . "*LINE"))) )
  (getzonglist aline);得到APINT
  (zhenlilist APINT);得到APINT
  
  (setq p1 (getpoint "选择点..."))
  (setq p1 (list (atof (rtos (car p1) 2 0))
                 (atof (rtos (cadr p1) 2 0))
                 ))

  (setq i 0 aplist '())
  (while (< i (length apint))
    (if (equal (car (nth i apint)) p1)
      (setq aplist (cons (nth i apint) aplist))
      )
    (setq i (1+ i))
    )
  (setq aaa aplist aplist nil)
  (setq bbb apint aplist nil)
  (gettlist aaa bbb)
    (setq lastlist plist)
  (princ)
)

(defun zhenlilist(aline /);整理表 保留整数
(setq i 0)
  (setq llst apint)
  (setq        apint '())
  (while (< i (length llst))
    (setq ename1x (car (nth 0 (nth i llst))))
    (setq ename1y (cadr (nth 0 (nth i llst))))
    (setq ename2x (car (nth 1 (nth i llst))))
    (setq ename2y (cadr (nth 1 (nth i llst))))
    (setq newxy (list (list (atof (rtos ename1x 2 0)) (atof (rtos ename1y 2 0)))
                      (list (atof (rtos ename2x 2 0)) (atof (rtos ename2y 2 0))))
          )
    (setq apint (cons newxy apint))
    (setq i (1+ i))
    )
    (princ)
)





(defun getzonglist(aline /);取得所有线的交点并组成表
  (setq i 0 apint '())
  (while (< i (sslength aline))
    (setq ename (ssname aline i))
    (vertexs ename)
    (setq apint (cons pp apint))
    (setq apint (cons (reverse pp) apint))
    (setq i (1+ i))
    )
    (princ)
)



(defun bleakp(aline /);以线的交点打断
(setq i 0 )
  (while (< i (sslength aline))
    (setq one (ssname aline i))
    (setq n 0)
    (while (< n (sslength aline))
      (setq two (ssname aline n))
      (if (/= n i) (GetInterPoint one two))
      (setq n (1+ n))
      )
    (setq i (1+ i))
    )
    (princ)
)


(defun bleakpline(aline /);打断多义线的各个顶点
  (setq ssa aline alist '())
  (setq i 0)
  (while (< i (sslength ssa))
    (setq ename (ssname ssa i))
    (vertexs ename)
    (setq k 0)
    (repeat (length pp)
      (setq ppt (nth k pp))
      (COMMAND "break" ppt ppt)
      (setq k (1+ k))
      )
    (setq i (1+ i))
    )
    (princ)
)



;得到所有多段线的各个顶点的坐标
(defun vertexs (ename /)
  (vl-load-com)
  (setq obj (vlax-ename->vla-object ename))
  (setq        plist (vlax-safearray->list
                (vlax-variant-value
                  (vla-get-coordinates obj)
                )
              )
  )
  (setq n 0 pp '())
  (repeat (/ (length plist) 2)
    (setq pp (append pp (list (list (nth n plist) (nth (1+ n) plist)))))
    (setq n (+ n 2))
  )
    (princ)
)




;得到2根曲线的交点坐标,并打断该线。
(defun GetInterPoint (ent_1    ent_2 /        ent1     ent2     
                        ax_ent_1 ax_ent_2 intpoints         i
                        j        k        disp
                       )
  ;(setq ent1 (entsel "\n选择第一条曲线:"))
  ;(setq ent2 (entsel "\n选择第二条曲线:"))
  ;(setq ent_1 (car ent1)
       ; ent_2 (car ent2)
  ;)
  (setq ax_ent_1 (vlax-ename->vla-object ent_1)
        ax_ent_2 (vlax-ename->vla-object ent_2)
        )
  (setq intpoints (vla-intersectwith ax_ent_1 ax_ent_2 acextendnone))
  (setq intpoints (vlax-variant-value intpoints))
  (if (> (vlax-safearray-get-u-bound intpoints 1) 0)
    (progn
      (setq i 0)
      (setq j 0)
      (setq k 0 cp nil)
      (repeat (/ (+ 1 (- (vlax-safearray-get-u-bound intpoints 1) (vlax-safearray-get-l-bound intpoints 1)))3)
         (setq cp (list (vlax-safearray-get-element intpoints j)
                        (vlax-safearray-get-element intpoints (+ 1 j))
                        (vlax-safearray-get-element intpoints (+ 2 j))
                        )
               )
       
         (COMMAND "_break" ent_1 cp cp);打断该线
         (COMMAND "_break" ent_2 cp cp);打断该线
         (setq i (+ 2 i)
               j (+ 3 j)
               k (+ 1 k)
         )

      )

    )

  )

  (princ)
)



(defun gettlist(aplist apint /);得到路由表。
  (setq p apint)
  (setq plist (list aplist))
  (setq ss (list (caar aplist)))

  (REPEAT  10
  (setq k 0 )
  (setq temlist plist)
  (WHILE (< k (LENGTH temlist))
    (setq one (cadr (last (nth k temlist))))
    (seelist one ss)
    (if (= jie "n" )
      (progn
        (getlist (nth k temlist) one )
        (setq r 0 )
        (while (< r (length alist))
          (setq plist (cons (nth r alist) plist))
          (setq r (1+ r))
          )
        (setq ss (cons one ss))
        )      
      )
    (setq k (1+ k))
    )
    )
  (princ)
  )

;(setq pp (nth k temlist))
;(setq yuan one)
(defun getlist (pp yuan /);根据一个路由表的最后一个点判断后面是否有点有的话增加。
  (setq m 0  alist '())
  (WHILE (< m (LENGTH p))
    ;(bijiao yuan (car (nth m p)))
    ;(if (= tr "t")
    (if (equal yuan (car (nth m p)))
      (if (equal (REVERSE (last pp)) (nth m p))
        (setq dshfi 'sdilfuhg)
        (progn
          (setq ttlist '())
          (setq ttlist (REVERSE (cons (nth m p) (REVERSE pp))))
          (setq alist (cons ttlist alist ))
          )
        )
      )
    (setq m (1+ m))
    )

    (princ)
)


(defun seelist (item lst /);比较两个表是否相同
  (setq m 0 jie "n" )
  (while (< m (length ss))
    (if (equal item (nth m ss))
      (setq jie "t" )
      )
    (setq m (1+ m))
    )

    (princ)
)


这里有个问题就是,打断了线,而且没有考虑到曲线,还有一个坐标比较的时候直接比较好像老是不对,所以就改用保留2位小数,   我主要是考虑这个思路对不对,对好的话就可以继续改了,如果不对各位就指点一下,我的QQ156558475
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-18 16:55 , Processed in 0.208830 second(s), 46 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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