找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 623|回复: 4

[每日一码] 求两条多段线间最近的距离

[复制链接]

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-7-14 13:26:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 newer 于 2017-7-14 15:55 编辑

  1. (defun _nearestpolypoints ( en1 en2 )
  2.     (   (lambda ( lst / dis rtn tmp )
  3.             (setq rtn (car lst)
  4.                   dis (apply 'distance rtn)
  5.             )
  6.             (foreach itm (cdr lst)
  7.                 (if (< (setq tmp (apply 'distance itm)) dis)
  8.                     (setq dis tmp rtn itm)
  9.                 )
  10.             )
  11.             rtn
  12.         )
  13.         (apply 'append
  14.             (mapcar
  15.                '(lambda ( a b )
  16.                     (mapcar
  17.                        '(lambda ( p )
  18.                             (list (trans (cdr p) a 0)
  19.                                   (vlax-curve-getclosestpointto b (trans (cdr p) a 0))
  20.                             )
  21.                         )
  22.                         (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) (entget a))
  23.                     )
  24.                 )
  25.                 (list en1 en2) (list en2 en1)
  26.             )
  27.         )
  28.     )
  29. )

  30. (defun c:test ( / ftr pl1 pl2 )
  31.     (setq ftr '((0 . "LWPOLYLINE") (-4 . "<NOT") (-4 . "<>") (42 . 0.0) (-4 . "NOT>")))
  32.     (if (and (princ "\nSelect 1st polyline: ")
  33.              (setq pl1 (ssget "_+.:E:S" ftr))
  34.              (princ "\nSelect 2nd polyline: ")
  35.              (setq pl2 (ssget "_+.:E:S" ftr))
  36.         )
  37.         (foreach pnt (_nearestpolypoints (ssname pl1 0) (ssname pl2 0))
  38.             (entmake (list '(0 . "POINT") (cons 10 pnt)))
  39.         )
  40.     )
  41.     (princ)
  42. )

上面代码只适合直线段的POLYLINE。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 6530个

财富等级: 富甲天下

发表于 2017-7-14 15:01:55 | 显示全部楼层
考虑凸度了没?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2017-7-14 15:45:20 | 显示全部楼层

代码这么短,如果考虑了凸度就神了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-7-14 16:09:15 | 显示全部楼层
本帖最后由 newer 于 2017-7-14 16:24 编辑

LISP去处理任意曲线的最近距离是很难完成的任务。
下面代码,用ARX的几何库,求任意两条曲线的最近距离,并连线。

  1. (defun c:tt ()
  2.   (if (and (setq e1 (car (entsel)))
  3.            (setq g1 (xdge::constructor e1))
  4.            (setq e2 (car (entsel)))
  5.            (setq g2 (xdge::constructor e2))
  6.            (setq dis (xdge::getpropertyvalue g1 "distanceto" g2))
  7.            (setq p (xdge::getpropertyvalue g1 "closestpointto" g2))
  8.       )
  9.     (xdrx_prompt "\n两曲线最近距离:" dis)
  10.   )
  11.   (princ)
  12. )


命令: tt

选择对象:
选择对象:
两曲线最近距离:19.6892


QQ截图20170714160535.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6468个

财富等级: 富甲天下

发表于 2017-7-15 00:28:02 | 显示全部楼层
不错。         
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-27 14:20 , Processed in 0.467338 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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