[求助]哪位高手请帮忙看看,做出这样一个程序
<p>一图中有好多名为BLOCK的块,如何可以把此名的块按最短距离进行连线,并且不要有重复连接,如图中红线</p><p> </p> <p>觉得可以自己动手.</p><p>1.选择第一个块,得到选择集ss1,得到块的定义点p1</p><p>2.选择第二个块,得到选择集ss2,得到块的定义点p2</p><p>3.(command ".line" p1 p2)如此循环.</p><p>这样可以省得复杂,不要重得连接,也不用去考虑点排序问题..</p> <p>我还以为简单呢,呵呵,还没成功,继续努力</p><p>写了一个小时,第一部分求出了点,第二部分的算法还是不行,我再看看,有哪位达人要是写了,我就不写了,</p><p>所有点求单线最短距离,这个算法不简单呢</p><p>(defun c:j ()<br/> (print "请选择要连线的块")<br/> (setq ss (ssget '((0 . "INSERT"))))<br/> (setq len (sslength ss))<br/> (setq lst (list '()))<br/> (setq i 0)<br/> (repeat len<br/> (setq ent (entget (ssname ss i)))<br/> (entmake ent)<br/> (setq temp (entlast))<br/> (command "explode" temp)<br/> (setq n1 (entnext temp))<br/> (setq sstemp (ssadd))<br/> (while n1<br/> (setq sstemp (ssadd n1 sstemp))<br/> (setq n1 (entnext n1))<br/> )<br/> (setq j 0)<br/> (repeat (sslength sstemp)<br/> (if (= "CIRCLE"<br/> (cdr (assoc 0 (setq ent1 (entget (ssname sstemp j)))))<br/> )<br/> (setq pcen (cdr (assoc 10 ent1)))<br/> )<br/> (setq j (1+ j))<br/> )<br/> (command "erase" sstemp "")<br/> (setq lst (cons pcen lst))<br/> (setq i (1+ i))<br/> )<br/> (print lst)</p><p><br/>(if (> (setq len(length lst)) 2)<br/> (progn<br/> (setq i 0)<br/> (repeat (- len 1)<br/> (setq disa (distance (nth i lst) (nth (1+ i) lst)))<br/> (setq n2 (nth i lst))<br/> (setq j (1+ i))<br/> (repeat (- len i 3)<br/> (setq n3 (nth (1+ j) lst))<br/> (setq disb (distance n3 n2))<br/> (setq dis (min disb disa))<br/> (if (= dis disb)<br/> (setq pta n3)<br/> (setq pta (nth 2 lst))<br/> )<br/> (setq disa disb)<br/> (setq j (1+ j))<br/> )<br/> (command "line" pta n2 "")<br/> (setq i (1+ i))<br/> )<br/> )<br/> (print "选的太少")<br/>)<br/>)</p> <p>请问,交叉可不可以?</p><p>还是不允许交叉的?</p> <p>是呀,正是因为我不知道求点与最近点如何求得</p><p>看到三楼中:(if (= "CIRCLE"。。。</p><p>我要相连的,并不一定是图中的块,也可以是其他的块,我是想用线把块的插入点相连起来</p> 著名的旅行家问题,我也曾写过一段。 <p>递归算法:</p><p>三点:循环距离判断可求</p><p>四点:任意三点链接,链接后的两个端点和第四点判断;调用三点判断,得距离a,然后再取别的三个点,调用三点判断,得距离b,</p><p>循环得c,d。然后取最小值</p><p>五点:任意四点链接,调用四点计算,循环得出</p><p>六点:……</p><p>……</p>[求助]搞不定。
偶还是搞不定。 我原来在“算法几何”版块中发过一个用lisp写的代码。可我现在怎么也找不到了。 <p>第一个跟第二个连接后,要将第一个在选择集中删除</p><p>要不又可能会出错的</p>
页:
[1]
2