乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 166|回复: 7

求LWPOLYLINE线之间的最小距离

[复制链接]

7

主题

15

帖子

4

银币

初来乍到

Rank: 1

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

5czwnrynoth.jpg

5czwnrynoth.jpg

回复

使用道具 举报

2

主题

46

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
54
发表于 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函数依次得到实体,向选择集中加。
按此方法作,有其它问题是再说。
回复

使用道具 举报

7

主题

15

帖子

4

银币

初来乍到

Rank: 1

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

使用道具 举报

9

主题

198

帖子

14

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

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

使用道具 举报

16

主题

909

帖子

8

银币

中流砥柱

Rank: 25

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

使用道具 举报

16

主题

909

帖子

8

银币

中流砥柱

Rank: 25

铜币
973
发表于 2002-12-24 15:40:00 | 显示全部楼层
vlax-curve-getStartParam
vlax-curve-getEndParam
vlax-curve-getPointAtParam
vlax-curve-getClosestPointTo
回复

使用道具 举报

16

主题

909

帖子

8

银币

中流砥柱

Rank: 25

铜币
973
发表于 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 : "))
  (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)
)
回复

使用道具 举报

7

主题

15

帖子

4

银币

初来乍到

Rank: 1

铜币
43
发表于 2002-12-25 09:47:00 | 显示全部楼层
除了以上问题,还有如果线非常多,步长又不能加大的话,电脑几乎让我等不到结果,还有方法实现吗?
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-5-29 05:39 , Processed in 0.683890 second(s), 82 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表