明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 14934|回复: 113

谁有命令求多段线到多段线的最短距离

  [复制链接]
发表于 2012-3-6 17:15 | 显示全部楼层 |阅读模式
不知道那个工具箱里有命令可以求多段线到多段线的最短距离?
在这个论坛里搜索了一下没有发现,在谷歌里搜索也没有看到。
打算自己写一个。

本帖被以下淘专辑推荐:

  • · excel|主题: 80, 订阅: 2
发表于 2012-3-6 22:50 | 显示全部楼层
论坛上有点到线的最短距离,拿其中一多段线取所有点对别一个循环不就行了?
 楼主| 发表于 2012-3-6 22:55 | 显示全部楼层
soly2006 发表于 2012-3-6 22:50
论坛上有点到线的最短距离,拿其中一多段线取所有点对别一个循环不就行了?

有差别,关键圆弧怎么处理
发表于 2012-3-6 23:08 | 显示全部楼层
(vlax-curve-getPointAtDist curve-obj dist)
设个步长,设得越小,越接近。
发表于 2012-3-7 08:51 | 显示全部楼层
先用soly2006 的方法求出近似点,再对近似点分析,近似点旁的无凸度多段线端点应是所求点;
对有凸度多段线要复杂点,可以求该圆弧圆心到另一多段线最短直线与该圆弧的交点是否与近似点相邻,如不相邻,再比较圆弧两段点到另一多段线的最短距离,
发表于 2012-3-7 12:32 | 显示全部楼层
用犀牛软件,内部的命令,就可以求出。
 楼主| 发表于 2012-3-7 13:13 | 显示全部楼层
LLXXZZ 发表于 2012-3-7 12:32
用犀牛软件,内部的命令,就可以求出。

噢,pro/e也有,但是这样要调到别的软件里去就比较麻烦了。
发表于 2012-3-7 16:40 | 显示全部楼层
本帖最后由 Gu_xl 于 2015-4-26 20:58 编辑

加载XLRX_API:
语法: (XLRX-Curve-getClosestPointTo curve1 curve1 [tol]) 功能:返回曲线1上离指定曲线2最近的点(在 WCS 上)参数:         curve1  曲线1图元名 curve2  曲线2图元名 tol 容差值 返回值: 如果成功则返回三维点列表,'(曲线1上一点 曲线2上一点) ,否则返回 nil
语法: (XLRX-Curve-distanceTo curve1 curve1 [tol]) 功能:返回曲线上离指定点最近的距离(在 WCS 上)参数: curve1  曲线1图元名curve2  曲线2图元名 tol 容差值 返回值: 如果成功则返回实数,否则返回 nil
Lisp版本代码如下:
  1. (defun c:tt  (/ CURVE1 CURVE2 D L1 L2 OBJ1 OBJ2 DATA P L P1 P2)
  2.   (setq        curve1 (car (entsel "\n第一条曲线:"))
  3.         curve2 (car (entsel "\n第二条曲线:"))
  4.         )
  5.   (if (vlax-invoke
  6.         (vlax-ename->vla-object curve1)
  7.         'IntersectWith
  8.         (vlax-ename->vla-object curve2)
  9.         acExtendNone)
  10.     (princ "\n曲线相交")
  11.     (progn
  12.       (setq d (getreal "\n分割长度<0.10>:"))
  13.       (if (null d)
  14.         (setq d 0.1))
  15.       
  16.       (setq l1 (vlax-curve-getDistAtParam curve1 (vlax-curve-getEndParam curve1))
  17.             l2 (vlax-curve-getDistAtParam curve2 (vlax-curve-getEndParam curve2))
  18.             )
  19.       (if (< l1 l2) (setq obj1 curve1 obj2 curve2) (setq obj1 curve2 obj2 curve1))
  20.       (setq data (list (setq p (vlax-curve-getStartPoint obj1)) (vlax-curve-getClosestPointTo obj2 p)))
  21.       (setq l d)
  22.       (while (< l (min l1 l2))
  23.         (setq p1 (vlax-curve-getpointatdist obj1 l)
  24.               p2 (vlax-curve-getClosestPointTo obj2 p1)
  25.               )
  26.         (if (< (distance p1 p2) (apply 'distance data))
  27.           (setq data (list p1 p2))
  28.           )
  29.         (setq l (+ l d))
  30.         )
  31.       (setq p1 (vlax-curve-getEndPoint obj1)
  32.               p2 (vlax-curve-getClosestPointTo obj2 p1)
  33.               )
  34.       (if (< (distance p1 p2) (apply 'distance data))
  35.           (setq data (list p1 p2))
  36.           )
  37.       (entmake (list '(0 . "line")
  38.                      '(100 . "AcDbEntity")
  39.                      '(62 . 1)
  40.                      (cons 10 (car data))
  41.                      (cons 11 (cadr data))
  42.                      )
  43.                )
  44.       
  45.       )
  46.    
  47.     )
  48.   (princ)
  49.   )

点评

一个简单的玩意实在没必要隐藏!  发表于 2013-3-2 07:47
发表于 2012-3-7 19:39 | 显示全部楼层
版主出手,不会有错!
 楼主| 发表于 2012-3-7 19:44 | 显示全部楼层
Gu_xl 发表于 2012-3-7 16:40
**** 本内容被作者隐藏 ****

挺棒的,程序短小,对于SPLINE云形线也可以处理。
对于分段大小,我测试时用0.01一般也挺快的就算好了。但分段设为0.001时,就比较花时间了。

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

本版积分规则

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

GMT+8, 2024-4-27 09:05 , Processed in 0.500552 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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