userzhl 发表于 2007-7-19 09:14:00

[求助]哪位高手请帮忙看看,做出这样一个程序

<p>一图中有好多名为BLOCK的块,如何可以把此名的块按最短距离进行连线,并且不要有重复连接,如图中红线</p><p>&nbsp;</p>

carrot1983 发表于 2007-7-19 11:19:00

<p>觉得可以自己动手.</p><p>1.选择第一个块,得到选择集ss1,得到块的定义点p1</p><p>2.选择第二个块,得到选择集ss2,得到块的定义点p2</p><p>3.(command ".line" p1 p2)如此循环.</p><p>这样可以省得复杂,不要重得连接,也不用去考虑点排序问题..</p>

nonsmall 发表于 2007-7-19 11:19:00

<p>我还以为简单呢,呵呵,还没成功,继续努力</p><p>写了一个小时,第一部分求出了点,第二部分的算法还是不行,我再看看,有哪位达人要是写了,我就不写了,</p><p>所有点求单线最短距离,这个算法不简单呢</p><p>(defun c:j ()<br/>&nbsp; (print "请选择要连线的块")<br/>&nbsp; (setq ss (ssget '((0 . "INSERT"))))<br/>&nbsp; (setq len (sslength ss))<br/>&nbsp; (setq lst (list '()))<br/>&nbsp; (setq i 0)<br/>&nbsp; (repeat len<br/>&nbsp;&nbsp;&nbsp; (setq ent (entget (ssname ss i)))<br/>&nbsp;&nbsp;&nbsp; (entmake ent)<br/>&nbsp;&nbsp;&nbsp; (setq temp (entlast))<br/>&nbsp;&nbsp;&nbsp; (command "explode" temp)<br/>&nbsp;&nbsp;&nbsp; (setq n1 (entnext temp))<br/>&nbsp;&nbsp;&nbsp; (setq sstemp (ssadd))<br/>&nbsp;&nbsp;&nbsp; (while n1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq sstemp (ssadd n1 sstemp))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq n1 (entnext n1))<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (setq j 0)<br/>&nbsp;&nbsp;&nbsp; (repeat (sslength sstemp)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (= "CIRCLE"<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (cdr (assoc 0 (setq ent1 (entget (ssname sstemp j)))))<br/>&nbsp;&nbsp; )<br/>&nbsp;(setq pcen (cdr (assoc 10 ent1)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq j (1+ j))<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (command "erase" sstemp "")<br/>&nbsp;&nbsp;&nbsp; (setq lst (cons pcen lst))<br/>&nbsp;&nbsp;&nbsp; (setq i (1+ i))<br/>&nbsp; )<br/>&nbsp; (print lst)</p><p><br/>(if (&gt; (setq len(length lst)) 2)<br/>&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp; (setq i 0)<br/>&nbsp;&nbsp;&nbsp; (repeat (- len 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq disa (distance (nth i lst) (nth (1+ i) lst)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq n2 (nth i lst))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq j (1+ i))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (repeat (- len i 3)<br/>&nbsp;(setq n3 (nth (1+ j) lst))<br/>&nbsp;(setq disb (distance n3 n2))<br/>&nbsp;(setq dis (min disb disa))<br/>&nbsp;(if (= dis disb)<br/>&nbsp;&nbsp; (setq pta n3)<br/>&nbsp;&nbsp; (setq pta (nth 2 lst))<br/>&nbsp;)<br/>&nbsp;(setq disa disb)<br/>&nbsp;(setq j (1+ j))<br/>&nbsp;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "line" pta n2 "")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq i (1+ i))<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>&nbsp; (print "选的太少")<br/>)<br/>)</p>

nonsmall 发表于 2007-7-19 11:42:00

<p>请问,交叉可不可以?</p><p>还是不允许交叉的?</p>

userzhl 发表于 2007-7-19 11:49:00

<p>是呀,正是因为我不知道求点与最近点如何求得</p><p>看到三楼中:(if (= "CIRCLE"。。。</p><p>我要相连的,并不一定是图中的块,也可以是其他的块,我是想用线把块的插入点相连起来</p>

zml84 发表于 2007-7-19 11:57:00

著名的旅行家问题,我也曾写过一段。

nonsmall 发表于 2007-7-19 12:06:00

<p>递归算法:</p><p>三点:循环距离判断可求</p><p>四点:任意三点链接,链接后的两个端点和第四点判断;调用三点判断,得距离a,然后再取别的三个点,调用三点判断,得距离b,</p><p>循环得c,d。然后取最小值</p><p>五点:任意四点链接,调用四点计算,循环得出</p><p>六点:……</p><p>……</p>

userzhl 发表于 2007-7-19 18:34:00

[求助]搞不定。

偶还是搞不定。

zml84 发表于 2007-7-19 21:21:00

我原来在“算法几何”版块中发过一个用lisp写的代码。可我现在怎么也找不到了。

phoenixdjq 发表于 2007-7-20 09:47:00

<p>第一个跟第二个连接后,要将第一个在选择集中删除</p><p>要不又可能会出错的</p>
页: [1] 2
查看完整版本: [求助]哪位高手请帮忙看看,做出这样一个程序