找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: st788796

[教学] 关于连线的一种方法

  [复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-6-7 21:38:02 | 显示全部楼层
杜流浪人 发表于 2016-6-7 20:25
xdrx_getpropertyvalue这个函数是什么功能啊

强大的函数, 几乎可以查询所有AUTOCAD对象的各种属性。更多去看XDRX_API用户手册吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8611个

财富等级: 富甲天下

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2016-6-8 10:14:45 来自手机 | 显示全部楼层
Lisphk 发表于 2016-6-6 22:16
这个依据是什么,ST大师,是最短路径吗? 还有其他的连法吗?


这个算法简单,效率高,没有特殊要求只是联在一起够用了
别的算法复杂
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1861个

财富等级: 堆金积玉

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2016-6-8 10:42:39 来自手机 | 显示全部楼层
aimisiyou 发表于 2016-6-8 10:38
如果同时满足最短路径那就更好了

最短路径在mjtd上有个帖子可以,其中影响效率的是凸包计算,这部分可以用api函数
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2016-6-8 22:40:53 | 显示全部楼层
源帖 http://bbs.mjtd.com/thread-96730-1-1.html

用 XDRXAPI 修改后如下(未经测试)

  1. ;;;------------------------TSP------------------------------------------------------------;;;
  2. ;;;---------------------------------------------------------------------------------------;;;
  3. (defun c:test (/ foo f2 ptl lst l n i d0 l0 l1 d1 ss)
  4.   ;;by GSLS(SS)
  5.   ;;refer ElpanovEvgeniy's method from  http://www.theswamp.org/index.php?topic=30434.75
  6.   ;;2012-8-10
  7.   (defun foo (l / D D0 D1)
  8.     (setq l0 (mapcar (function list) (cons (last l) l) l))
  9.     (setq d0 (pnts:length l))
  10.     (while (> d0
  11.               (progn
  12.                 (foreach a l0
  13.                   (setq        d  (pnts:length l)
  14.                         l1 (vl-remove (car a) (vl-remove (cadr a) l))
  15.                         l1 (f1 (car a) l1)
  16.                         l1 (f1 (cadr a) l1)
  17.                   )
  18.                   (if (> d (setq d1 (pnts:length l1)))
  19.                     (setq d d1
  20.                           l l1
  21.                     ) ;_  setq
  22.                   ) ;_  if
  23.                   (setq        l1 (vl-remove (car a) (vl-remove (cadr a) l))
  24.                         l1 (f1 (cadr a) l1)
  25.                         l1 (f1 (car a) l1)
  26.                   )
  27.                   (if (> d
  28.                          (setq d1 (pnts:length l1))
  29.                       )
  30.                     (setq d d1
  31.                           l l1
  32.                     )
  33.                   )
  34.                 )
  35.                 d
  36.               ) ;_  progn
  37.            ) ;_  <
  38.       (setq d0 d)
  39.     ) ;_  while   
  40.     (setq d (pnts:length l))
  41.     l
  42.   )
  43.   (defun f1 (a l) (ins-lst a (get-closest-i l a) l))
  44.   (defun f2 (lst)
  45.     (mapcar (function (lambda (p0 p p1 / a)
  46.                         (setq a (- (angle p p0) (angle p p1)))
  47.                         (if (< a (- pi))
  48.                           (abs (+ a pi pi))
  49.                           (if (> a pi)
  50.                             (abs (- a pi pi))
  51.                             (abs a)
  52.                           )
  53.                         )
  54.                       )
  55.             )
  56.             (cons (last lst) lst)
  57.             lst
  58.             (reverse (cons (car lst) (reverse (cdr lst))))
  59.     )
  60.   )
  61.   (if (setq ss (ssget '((0 . "point"))))
  62.     (progn
  63.       (setq ptl        (mapcar        (function (lambda (x) (xdrx_getpropertyvalue x "Position")))
  64.                         (xdrx_pickset->ents ss)
  65.                 )
  66.             ptl        (mapcar (function (lambda (p) (list (car p) (cadr p)))) ptl)
  67.             t1        (getvar "MilliSecs")
  68.             lst        (apply 'xdrx_points_ghull ptl)
  69.       )
  70.       (foreach a lst (setq ptl (vl-remove a ptl)))
  71.       (while (and (> (length ptl) 2)
  72.                   (setq l (apply 'xdrx_points_ghull ptl))
  73.              )
  74.         (foreach p l
  75.           (setq ptl (vl-remove p ptl))
  76.           (setq n (get-minadddist-i lst p))
  77.           (setq lst (ins-lst p n lst))
  78.         )
  79.       )
  80.       (if ptl
  81.         (foreach p ptl
  82.           (setq n (get-minadddist-i lst p))
  83.           (setq lst (ins-lst p n lst))
  84.         )
  85.       )
  86.       (setq lst (foo lst))
  87.       (setq l (f2 lst))
  88.       (setq i  0
  89.             l0 lst
  90.             n  (length lst)
  91.             d0 (pnts:length lst)
  92.       )
  93.       (foreach a l
  94.         (if (and (< a _pi3) (= (setq p (nth i lst)) (nth i l0)))
  95.           (progn
  96.             (if        (= i 0)
  97.               (setq p0 (last lst))
  98.               (setq p0 (nth (1- i) lst))
  99.             )
  100.             (if        (= i (1- n))
  101.               (setq p1 (car lst))
  102.               (setq p1 (nth (1+ i) lst))
  103.             )
  104.             (setq m (list (list p0 p1 p)
  105.                           (list p1 p p0)
  106.                           (list p1 p0 p)
  107.                           (list p p0 p1)
  108.                           (list p p1 p0)
  109.                     )
  110.             )
  111.             (setq l1
  112.                    (car        (vl-sort (mapcar (function (lambda (x)
  113.                                                      (ch-para-lst x i lst)
  114.                                                    )
  115.                                          )
  116.                                          m
  117.                                  )
  118.                                  (function (lambda (e1 e2)
  119.                                              (<        (pnts:length e1)
  120.                                                 (pnts:length e2)
  121.                                              )
  122.                                            )
  123.                                  )
  124.                         )
  125.                    )
  126.             )
  127.             (setq d1 (pnts:length l1))
  128.             (if        (< d1 d0)
  129.               (setq d0        d1
  130.                     lst        l1
  131.               )
  132.             )
  133.           )
  134.         )
  135.         (setq i (1+ i))
  136.       )
  137.       (setq l  (f2 lst)
  138.             i  0
  139.             l0 lst
  140.             d0 (pnts:length lst)
  141.       )
  142.       (foreach a l
  143.         (if (and (< a _pi2) (setq p (nth i l0)))
  144.           (progn
  145.             (setq l1 (f1 p (vl-remove p lst)))
  146.             (setq d1 (pnts:length l1))
  147.             (if        (< d1 d0)
  148.               (setq d0        d1
  149.                     lst        l1
  150.               )
  151.             )
  152.           )
  153.         )
  154.         (setq i (1+ i))
  155.       )
  156.       (apply 'xdrx_polyline_make lst)
  157.       (setq t2 (getvar "MilliSecs"))
  158.       (princ (strcat "\nTSP Length :" (rtos d0 2 0) "."))
  159.       (princ (strcat "\nUse Time :" (rtos (- t2 t1) 2 0) "ms."))
  160.     )
  161.   )
  162.   (princ)
  163. )
  164. ;;;以最下面的点为基点,按照角度和距离分类点集
  165. (defun sort-ad (pl pt)
  166.   (vl-sort pl
  167.            (function (lambda (e1 e2 / an1 an2)
  168.                        (setq an1 (angle pt e1)
  169.                              an2 (angle pt e2)
  170.                        )
  171.                        (if (equal an1 an2 1e-6) ;_这里降低误差,以适应工程需求
  172.                          (< (distance pt e1) (distance pt e2))
  173.                          (< an1 an2)
  174.                        )
  175.                      )
  176.            )
  177.   )
  178. )
  179. ;;;------------------------
  180. ;;(ins-lst 10 5 '(1 2 3 4 5))
  181. ;; i 为新插入元素的位置
  182. (defun ins-lst (new i lst / len fst)
  183.   (cond
  184.     ((minusp i)
  185.      lst
  186.     )
  187.     ((> i (setq len (length lst)))
  188.      lst
  189.     )
  190.     ((> i (/ len 2))
  191.      (reverse (ins-lst new (- len i) (reverse lst)))
  192.     )
  193.     (t
  194.      (append
  195.        (progn
  196.          (setq fst nil)
  197.          (repeat (rem i 4)
  198.            (setq fst (cons (car lst) fst)
  199.                  lst (cdr lst)
  200.            )
  201.          )
  202.          (repeat (/ i 4)
  203.            (setq fst (cons (cadddr lst)
  204.                            (cons (caddr lst)
  205.                                  (cons
  206.                                    (cadr lst)
  207.                                    (cons
  208.                                      (car lst)
  209.                                      fst
  210.                                    )
  211.                                  )
  212.                            )
  213.                      )
  214.                  lst (cddddr lst)
  215.            )
  216.          )
  217.          (reverse fst)
  218.        )
  219.        (list new)
  220.        lst
  221.      )
  222.     )
  223.   )
  224. )
  225. ;;;------------------------
  226. ;;(ch-para-lst '(7 8 9) 3 '(1 2 3 4 5))
  227. (defun ch-para-lst (para i lst / len fst)
  228.   (setq len (length lst))
  229.   (cond
  230.     ((minusp i)
  231.      lst
  232.     )
  233.     ((> i (1- len))
  234.      lst
  235.     )
  236.     ((= i 0)
  237.      (cons (cadr para)
  238.            (cons (caddr para)
  239.                  (reverse (cons (car para) (cdr (reverse (cddr lst)))))
  240.            )
  241.      )
  242.     )
  243.     ((= i (1- len))
  244.      (reverse
  245.        (append (cdr (reverse para))
  246.                (cddr (reverse (cons (last para) (cdr lst))))
  247.        )
  248.      )
  249.     )
  250.     ((> i (/ len 2))
  251.      (reverse
  252.        (ch-para-lst (reverse para) (- len i 1) (reverse lst))
  253.      )
  254.     )
  255.     (t
  256.      (append
  257.        (progn
  258.          (setq fst nil)
  259.          (repeat (rem i 4)
  260.            (setq fst (cons (car lst) fst)
  261.                  lst (cdr lst)
  262.            )
  263.          )
  264.          (repeat (/ i 4)
  265.            (setq fst (cons (cadddr lst)
  266.                            (cons (caddr lst)
  267.                                  (cons
  268.                                    (cadr lst)
  269.                                    (cons
  270.                                      (car lst)
  271.                                      fst
  272.                                    )
  273.                                  )
  274.                            )
  275.                      )
  276.                  lst (cddddr lst)
  277.            )
  278.          )
  279.          (reverse
  280.            (cons (caddr para)
  281.                  (cons (cadr para) (cons (car para) (cdr fst)))
  282.            )
  283.          )
  284.        )
  285.        (cdr lst)
  286.      )
  287.     )
  288.   )
  289. )

  290. ;;;------------------------
  291. ;;两边长度和减去第三边,差最小的位置
  292. (defun get-minadddist-i        (lst p)
  293.   (car
  294.     (vl-sort-i
  295.       (mapcar (function        (lambda        (p1 p2)
  296.                           (- (+ (distance p p1) (distance p p2))
  297.                              (distance p1 p2)
  298.                           )
  299.                         )
  300.               )
  301.               (cons (last lst) lst)
  302.               lst
  303.       )
  304.       '<
  305.     )
  306.   )
  307. )
  308. ;;;------------------------
  309. ;;最近的点位置
  310. (defun get-closest-i (lst p)
  311.   (car
  312.     (vl-sort-i
  313.       (mapcar
  314.         (function
  315.           (lambda (p1 p2 / v)
  316.             (if        (or (equal p p1 1e-8) (equal p p2 1e-8))
  317.               1e99
  318.               (progn
  319.                 (setq v (trans (mapcar '- p p1) 0 (mapcar '- p2 p1)))
  320.                 (if (< (abs (car v)) 1e-8)
  321.                   0.0
  322.                   (distance p p2)
  323.                 )
  324.               )
  325.             )
  326.           )
  327.         )
  328.         (cons (last lst) lst)
  329.         lst
  330.       )
  331.       '<
  332.     )
  333.   )
  334. )
  335. ;;;------------------------
  336. (defun pnts:length (l / dis)
  337.   (setq dis (distance (car l) (last l)))
  338.   (while l
  339.     (setq dis (+ (distance (car l) (cadr l)))
  340.           l   (cddr l)
  341.     )
  342.   )
  343.   dis
  344. )

点评

初略看了下,可以优化的函数有: ins-list ----> xd::list:insert get-closest-i ---> 最近点?  详情 回复 发表于 2016-6-9 16:33
用XD API 竟然写了这么长的代码?不纯的吧。  详情 回复 发表于 2016-6-9 02:06
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2016-6-8 23:45:38 | 显示全部楼层
-----发表于 1 小时前-----
:lol:lol:lol:lol

悠着点
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2016-6-8 23:55:41 | 显示全部楼层
回复后看了下算法,我觉得你的算法是赶巧了吧。
随机测试出现错误的概率反而比较低,
平时画的图,因为都是"特殊情况",所以出现问题的概率比较高。(我指自相交)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2016-6-8 23:58:45 | 显示全部楼层
aeo 发表于 2016-6-8 23:55
回复后看了下算法,我觉得你的算法是赶巧了吧。
随机测试出现错误的概率反而比较低,
平时画的图,因为都 ...

你发个不赶巧的图测试下
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2016-6-9 02:06:13 | 显示全部楼层
st788796 发表于 2016-6-8 22:40
源帖 http://bbs.mjtd.com/thread-96730-1-1.html

用 XDRXAPI 修改后如下(未经测试)

用XD API 竟然写了这么长的代码?不纯的吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2016-6-9 02:27:54 来自手机 | 显示全部楼层
LoveArx 发表于 2016-6-9 02:06
用XD API 竟然写了这么长的代码?不纯的吧。

API主要是处理Autocad实体简化代码,这个是有区别的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 12个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2016-6-9 10:55:56 来自手机 | 显示全部楼层
学习了下mjtd那个帖子算法,大致是搜出凸包后逐渐向内“塌陷”连接,测试中也会出现多义线自交情况
一楼算法仅仅用了扫描法凸包的一个预处理函数,所以从效率上应该是最高的了,而且具有对称性和放射性,绝对不会出现自相交

点评

也是哈,最短路径算法只是要求不走重复路和路径最短,但没限制两个路不能自交啊。  详情 回复 发表于 2016-6-9 13:35
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-6-9 13:35:01 | 显示全部楼层
st788796 发表于 2016-6-9 10:55
学习了下mjtd那个帖子算法,大致是搜出凸包后逐渐向内“塌陷”连接,测试中也会出现多义线自交情况
一楼算 ...

也是哈,最短路径算法只是要求不走重复路和路径最短,但没限制两个路不能自交啊。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-6-9 16:33:34 | 显示全部楼层
st788796 发表于 2016-6-8 22:40
源帖 http://bbs.mjtd.com/thread-96730-1-1.html

用 XDRXAPI 修改后如下(未经测试)

初略看了下,可以优化的函数有:

ins-list  ----> xd::list:insert
get-closest-i ---> 最近点?


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 18:55 , Processed in 0.213385 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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