fengyong88 发表于 2007-8-13 19:05:00

大家讨论下关于处理回头线的算法^

本帖最后由 作者 于 2007-8-13 19:36:24 编辑 <br /><br /> <p>目前的工作遇到了需要处理大量回头线的工作,不知道各位同仁目前为止有什么好的办法可以处理一下!</p><p>如果有好的算法也可以提出来看看!</p><p>比如附件中的图形,2-8号点的连线出现了往复的现象.</p>

i-Stone 发表于 2007-8-13 19:08:00

算啥子东西?长度?角度?面积?布线?....

ZZXXQQ 发表于 2007-8-14 09:57:00

<p>1、炸开复线;</p><p>2、删重线;</p><p>3、重新生成复线。</p>

fengyong88 发表于 2007-8-15 11:10:00

<p>我起初也考虑了这种方法,最主要的弊端就是速度太慢了,大部分的时间都在查询并删除重复线消耗了,一副山区的地形图,等高线处理起来,大约5个小时左右的时间。另外对于1-2-3-2-4-5这种线还是不能从根本上消除掉。</p><p>还有没有别的好点的办法?如果使用编程来实现,如何查询存在有回头线的对象呢?我想单独挑出来处理的话要比全幅处理的要节省很多时间。</p>

龙龙仔 发表于 2007-8-15 13:15:00

<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><strong>指令<font face="新細明體">: _explode<p></p></font></strong></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><strong>選取物件<font face="新細明體">: ALL<p></p></font></strong></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><strong>找到<font face="新細明體"> 6 </font>個<p></p></strong></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><strong>選取物件<font face="新細明體">:<p></p></font></strong></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><strong>指令<font face="新細明體">: -OVERKILL<p></p></font></strong></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><strong>選取物件<font face="新細明體">: ALL<p></p></font></strong></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><strong>找到<font face="新細明體"> 48 </font>個<p></p></strong></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><strong>選取物件<font face="新細明體">:<p></p></font></strong></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>IGNORE=none<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>Fuzz=0.000001, Optimize PLINES=Y, combine PARTIAL overlap=Y, combine ENDTOEND=Y<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>Enter an option to change &lt;done&gt;: E<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>Combine co-linear objects when aligned end to end &lt;Yes&gt;:<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>IGNORE=none<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>Fuzz=0.000001, Optimize PLINES=Y, combine PARTIAL overlap=Y, combine ENDTOEND=Y<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>Enter an option to change &lt;done&gt;: T<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>Combine co-linear objects that partially overlap &lt;Yes&gt;:<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>IGNORE=none<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>Fuzz=0.000001, Optimize PLINES=Y, combine PARTIAL overlap=Y, combine ENDTOEND=Y<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>Enter an option to change &lt;done&gt;: P<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>Optimize segments within plines &lt;Yes&gt;:<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>IGNORE=none<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>Fuzz=0.000001, Optimize PLINES=Y, combine PARTIAL overlap=Y, combine ENDTOEND=Y<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>Enter an option to change &lt;done&gt;: F<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>Specify Fuzz for numeric comparisons &lt;0.000001&gt;:<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>IGNORE=none<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>Fuzz=0.000001, Optimize PLINES=Y, combine PARTIAL overlap=Y, combine ENDTOEND=Y<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>Enter an option to change &lt;done&gt;: I<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>IGNORE=none<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>Specify properties to ignore when comparing objects...<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong> or "." for none &lt;default&gt;:<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>IGNORE=none<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>Fuzz=0.000001, Optimize PLINES=Y, combine PARTIAL overlap=Y, combine ENDTOEND=Y<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>Enter an option to change &lt;done&gt;:<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="新細明體"><strong>24 duplicate(s) deleted.<p></p></strong></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><strong>指令<font face="新細明體">:<p></p></font></strong></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><strong>指令<font face="新細明體">: _pedit </font>選取聚合線或<font face="新細明體"> [</font>多重<font face="新細明體">(M)]: M<p></p></font></strong></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><strong>選取物件<font face="新細明體">: ALL<p></p></font></strong></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><strong>找到<font face="新細明體"> 24 </font>個<p></p></strong></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><strong>選取物件<font face="新細明體">:<p></p></font></strong></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><strong>將線及弧轉換為聚合線<font face="新細明體"> [</font>是<font face="新細明體">(Y)/</font>否<font face="新細明體">(N)]? &lt;Y&gt; Y<p></p></font></strong></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><strong>輸入選項<font face="新細明體"> [</font>封閉<font face="新細明體">(C)/</font>開放<font face="新細明體">(O)/</font>接合<font face="新細明體">(J)/</font>寬度<font face="新細明體">(W)/</font>擬合<font face="新細明體">(F)/</font>雲形線<font face="新細明體">(S)/</font>直線化<font face="新細明體">(D)/</font>線型生成<font face="新細明體">(L)/</font>復原<font face="新細明體">(U)]: J<p></p></font></strong></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><strong>接合類型<font face="新細明體"> = </font>延伸<p></p></strong></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><strong>請輸入連綴距離或<font face="新細明體"> [</font>接合類型<font face="新細明體">(J)] &lt;0.0000&gt;:<p></p></font></strong></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><strong><font face="新細明體">18 </font>個線段已經加到<font face="新細明體"> 6 </font>條聚合線<p></p></strong></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><strong>輸入選項<font face="新細明體"> [</font>封閉<font face="新細明體">(C)/</font>開放<font face="新細明體">(O)/</font>接合<font face="新細明體">(J)/</font>寬度<font face="新細明體">(W)/</font>擬合<font face="新細明體">(F)/</font>雲形線<font face="新細明體">(S)/</font>直線化<font face="新細明體">(D)/</font>線型生成<font face="新細明體">(L)/</font>復原<font face="新細明體">(U)]:<p></p></font></strong></p>

ZZXXQQ 发表于 2007-8-15 14:16:00

下面程序可以一条一条线的处理,这样可以提高处理速度。

;明经 ZZXXQQ 2007.8.15
(DEFUN C:CHECKPL ()
(SETVAR "CMDECHO" 0)
(SETQ OLOS (GETVAR "OSMODE"))
(SETVAR "OSMODE" 0)
(COMMAND ".UNDO" "BE")
(PROMPT "\n选择要检查的实体 ")
(IF (SETQ SS (SSGET '((0 . "*POLYLINE")))) (PROGN
(SETQ SL (SSLENGTH SS) K 0 SDEL (SSADD) SADD (SSADD))
(WHILE (< K SL)
(COMMAND "._EXPLODE" (SSNAME SS K))
(SETQ SS1 (SSGET "P") J 0 SL1 (SSLENGTH SS))
(WHILE (< J SL1)
   (SETQ S1 (SSNAME SS1 J) DL1 (ENTGET S1) LC1 (CDR (ASSOC 0 DL1)) J (1+ J))
   (IF (= LC1 "LINE")
    (IF (< (DISTANCE (CDR (ASSOC 10 DL1)) (CDR (ASSOC 11 DL1))) 0.01)
   (SETQ SDEL (SSADD S1 SDEL) SS1 (SSDEL S1 SS1) SL (1- SL) J (1- J))
    )
    (IF (= LC1 "ARC") (PROGN
   (SETQ PC (CDR (ASSOC 10 DL1))CR (CDR (ASSOC 40 DL1))
         ST (CDR (ASSOC 50 DL1))ED (CDR (ASSOC 51 DL1))
         PT1 (POLAR PC ST CR)   PT2 (POLAR PC ED CR))
   (IF (OR (< CR 0.01) (< (DISTANCE PT1 PT2) 0.01))
      (SETQ SDEL (SSADD S1 SDEL) SS1 (SSDEL S1 SS1) SL (1- SL) J (1- J))
   )
    ))
   )
); END WHILE J
(SETQ SSL (SSLENGTH SDEL))
(IF (> SSL 0) (PROGN
   (PRINC "\nDeleted ") (PRINC SSL)
   (PRINC " too small entitil(s)!? 删除 ") (PRINC SSL) (PRINC " 个细小实体! ")
   (COMMAND "ERASE" SDEL "")
)
   (PRINC "\nCon't found any too small entitil. 未找到任何细小的实体。")
)
(SETQ I 0 SDEL (SSADD) SL (SSLENGTH SS1))
(WHILE (< I SL)
   (SETQ S1 (SSNAME SS1 I) DL1 (ENTGET S1)
         LC1 (CDR (ASSOC 0 DL1)) J 0)
   (IF (= LC1 "LINE")
    (SETQ P1 (CDR (ASSOC 10 DL1))P2 (CDR (ASSOC 11 DL1))
          AN1 (ANGLE P1 P2)      DS1 (DISTANCE P1 P2))
   )
   (IF (= LC1 "ARC")
    (SETQ PC1 (CDR (ASSOC 10 DL1))CR1 (CDR (ASSOC 40 DL1))
          ST1 (CDR (ASSOC 50 DL1))ED1 (CDR (ASSOC 51 DL1))
          P1 (POLAR PC1 ST1 CR1)    P2 (POLAR PC1 ED1 CR1))
   )
   (WHILE (< J SL)
    (IF (/= I J) (PROGN
   (SETQ S2 (SSNAME SS1 J) DL2 (ENTGET S2)
         LC2 (CDR (ASSOC 0 DL2)))
   (IF (= LC1 LC2) (PROGN
      (IF (= LC1 "LINE") (PROGN
       (SETQ P3 (CDR (ASSOC 10 DL2))P4 (CDR (ASSOC 11 DL2))
             DS2 (DISTANCE P3 P4)
             DS3 (+ (DISTANCE P1 P3) (DISTANCE P3 P2))
             DS4 (+ (DISTANCE P1 P4) (DISTANCE P4 P2))
             AN3 (ANGLE P3 P4)      AN4 (ANGLE P4 P3))
       (IF (EQUAL AN1 AN3 1e-5)
      (IF (AND (EQUAL DS3 DS1 1e-5) (EQUAL DS4 DS1 1e-5))
         (SETQ SDEL (SSADD S2 SDEL) SS1 (SSDEL S2 SS1) SL (1- SL) I -1)
      )
      (IF (EQUAL AN1 AN4 1e-5)
         (IF (AND (EQUAL DS3 DS1 1e-5) (EQUAL DS4 DS1 1e-5))
          (SETQ SDEL (SSADD S2 SDEL) SS1 (SSDEL S2 SS1) SL (1- SL) I -1)
         )
      )
       )
      ))
      (IF (= LC1 "ARC") (PROGN
       (SETQ PC2 (CDR (ASSOC 10 DL2))    CR2 (CDR (ASSOC 40 DL2))
             ST2 (CDR (ASSOC 50 DL2))    ED2 (CDR (ASSOC 51 DL2))
             P3 (POLAR PC2 ST2 CR2)      P4 (POLAR PC2 ED2 CR2))
       (IF (< (+ (DISTANCE PC1 PC2) (DISTANCE P1 P3) (DISTANCE P2 P4)) 0.01)
      (SETQ SDEL (SSADD S2 SDEL) SS1 (SSDEL S2 SS1) SL (1- SL) I -1)
       )
      ))
   ))
    ))
    (SETQ J (1+ J))
   )
   (SETQ I (1+ I))
)
(SETQ SSL (SSLENGTH SDEL))
(IF (> SSL 0) (PROGN
   (PRINC "\nDeleted ") (PRINC SSL)
   (PRINC " Entitil(s)! ? 删除 ") (PRINC SSL) (PRINC " 个重复实体! ")
   (COMMAND "ERASE" SDEL "")
)
   (PRINC "\nCon't Found Any Repetition Entitil. 未找到任何重复的实体。")
)
(COMMAND "._PEDIT" "M" SS1 "" "Y" "J" "0.01" "")
(SETQ K (1+ K))
) ; END WHILE K
))
(COMMAND ".UNDO" "E")
(SETVAR "OSMODE" OLOS)
(SETVAR "CMDECHO" 1)
(PRINC)
)
(PRINC)

龙龙仔 发表于 2007-8-15 16:26:00

5樓的是一次處理所有的線(我只拿他的圖COPY出一堆線來測試)

无痕 发表于 2007-8-15 21:59:00

(多义线消重合并顶点)

本帖最后由 作者 于 2007-8-16 14:36:43 编辑 <br /><br /> <p>simpl = 删除多段线上的重合点和共线点v1.4a(多义线消重合并顶点)</p><p>;| simpl;(<a href="mailto:x@s-delvx">x@s-delvx</a> ss fuzz afuzz) = 删除选集多段线上的重合点和共线点 v1.4--------by lxx.2005.5<br/>参数: ss = 多义线选集.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fuzz = 删除重合点的阈值(端点距离; /=片断长度).为nil时取1e-4(默认).<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; afuzz = 顶点共线角度阈值 (角度). 为nil时取1e-4(默认).<br/>实例: (defun c:tt(/ ss)(<a href="mailto:x@s-delvx">x@s-delvx</a> (setq ss (ssget '((0 . "*POLYLINE")))) nil nil) (sssetfirst nil ss))</p><p>命令行方式: simpl<br/>|;</p><p>命令: simpl<br/>simpl = 多义线瘦身(支持pl,lwpl)------- by lxx.2005.9 v1.4a<br/>选择对象: 指定对角点: 找到 4 个<br/>选择对象:<br/>距离阈值&lt;1.0&gt;:<br/>角度阈值&lt;1.0°&gt;:</p><p></p><p>下载: <a href="http://dreamskylxx.ys168.com/">http://dreamskylxx.ys168.com/</a></p>

无痕 发表于 2007-8-15 22:08:00

<p>补充:</p><p>·对lwpolyline,polyline双支持.</p><p>·支持对闭合或貌似闭合的多义线处理.</p><p>·支持角度阈值,距离阈值</p><p>·支持保留原有多义线的宽度.(用炸开方法不能保留宽度)</p>

sixth 发表于 2013-9-23 10:38:01

谢谢无痕,试下你的程序
页: [1] 2
查看完整版本: 大家讨论下关于处理回头线的算法^