明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4740|回复: 22

求LWPOLYLINE线之间的最小距离

  [复制链接]
发表于 2002-12-24 08:37:00 | 显示全部楼层 |阅读模式
我遇到一个问题,就是怎样用LISP程序求出若干LWPOLYLINE线之间最小距离。如图。
哪位大师指点一二,将感激不尽!

本帖子中包含更多资源

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

x
发表于 2002-12-24 10:19:00 | 显示全部楼层

[建议]

具体程序我没有做,但可将思路告诉你以供参考:
1、将两LWPOLYLINE炸碎,分别得到炸碎后的实体,做两选择集ss1,ss2。(炸碎后的实体除了line就是arc。)
2、对ss1中每个实体ent1做循环,求ent1与选择集ss2中每个实体ent2的距离l1,将每次所求的距离l1与上一次最小距离作比较,以确定最小距离l。共有四种情况(line line)(line arc) (arc line) (arc arc),我想这四种情况下的距离计算还是容易的。
3、炸碎后的实体,做选择集,用entnext函数依次得到实体,向选择集中加。
按此方法作,有其它问题是再说。
发表于 2002-12-24 12:13:00 | 显示全部楼层

嗯,不错不错,剩下的就是技术问题了

 楼主| 发表于 2002-12-24 12:16:00 | 显示全部楼层

谢谢菜兄!距离计算方法?

初学,我想知道四种情况下的距离计算方法。
发表于 2002-12-24 12:41:00 | 显示全部楼层

直线间的距离到是很简单。

直线间的距离分两种情况:平行与不平行,不管平行与否,只要用(distance)函数求出两直线各端点的距离就行了。关键是直线和圆弧、圆弧与圆弧间的距离比较复杂。
发表于 2002-12-24 15:33:00 | 显示全部楼层

也是建议。。。

Visual lisp里有几个函数可以得到PL线的起终点和线上个位置的参数。你可以在其中一条PL线上从起点到终点搜索,步长可以由用户输入。搜索过程中,程序不断计算第一条PL线上一点与第二条PL线的最短距离,找出最小距离。
发表于 2002-12-24 15:40:00 | 显示全部楼层

可能用到的函数。。。

vlax-curve-getStartParam
vlax-curve-getEndParam
vlax-curve-getPointAtParam
vlax-curve-getClosestPointTo
发表于 2002-12-24 17:01:00 | 显示全部楼层

程序见内,注意不要把步长设得太小,时间也许会长

(defun C:distPL(/ End_point PL_length precision point1 point2 minDistance
                  pointonPL1 pointonPL2 curDistance oldosmode)
  (setq oldosmode (getvar "OSMODE"))
  (setvar "OSMODE" 0)
  (setq PLobj1 (vlax-ename->vla-object (car (entsel "\nSelect first PLine: ")))
        PLobj2 (vlax-ename->vla-object (car (entsel "\nSelect second PLine: "))))
  (setq        End_point (vlax-curve-getendpoint PLobj1)
        PL_length (vlax-curve-getDistAtPoint PLobj1 End_point))
  (princ "\nLength of PL1 is ")(princ PL_length)
  (setq precision (getreal "\nPrecision <1.0>: "))
  (if (= precision nil)(setq precision 1.0))
  (setq dist 0)
  (setq point1 (vlax-curve-getPointAtDist PLobj1 dist)
        point2 (vlax-curve-getClosestPointTo PLobj2 point1)
        minDistance (distance point1 point2)
  )
  (while (<= (setq dist (+ dist precision)) PL_length)
    (setq pointonPL1 (vlax-curve-getPointAtDist PLobj1 dist)
          pointonPL2 (vlax-curve-getClosestPointTo PLobj2 pointonPL1)
          curDistance (distance pointonPL1 pointonPL2)
    )
    (if (< curDistance minDistance)
        (setq minDistance curDistance
              point1 pointonPL1
              point2 pointonPL2)
    )
  )
  (command "line" point1 point2 "")
  (princ "\nMinimum distance is ")
  (princ minDistance)
  (vlax-release-object PLobj1)
  (vlax-release-object PLobj2)
  (setvar "OSMODE" oldosmode)
  (princ)
)
 楼主| 发表于 2002-12-24 17:18:00 | 显示全部楼层

谢谢!先把程序拿回去分析一下。我还看不太懂。

 楼主| 发表于 2002-12-25 09:47:00 | 显示全部楼层

循环好象有点问题,如线闭合则不循环。

除了以上问题,还有如果线非常多,步长又不能加大的话,电脑几乎让我等不到结果,还有方法实现吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-31 19:21 , Processed in 0.304637 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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