明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: llsheng_73

[已解答] 纯数学计算求多边形之间最小距离

[复制链接]
 楼主| 发表于 2013-11-3 05:37 | 显示全部楼层
本帖最后由 llsheng_73 于 2013-11-9 03:04 编辑


熬了一晚上,总算能计算出来了,至于算法的优化,限于水平,只能期待各位版主大人,各位兄弟姐妹们多提建议了
其实就用了个最笨的办法,分别以两个多边形的顶点P与另一个多边形的相邻两个顶点p的对边L)组成三角形,计算p到L的垂足,如果垂足在L延长线上则的返回P到L最近的端点p1的距离d及这两个点组成的表(d p p1),否则返回垂距(d p 垂足)最后对表进行排序选出最短距离,由于返回了顶点及垂足,因此可以在后边的应用中方便的利用最短距离所在的两个点的坐标。




本帖子中包含更多资源

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

x
回复 支持 1 反对 0

使用道具 举报

发表于 2013-11-3 19:09 | 显示全部楼层
llsheng_73 发表于 2013-11-2 23:16
我觉得只是取表中的元素出来纯计算,不需要生成图元以辅助计算然后删除,也不对表本身进行操作,就算慢也 ...

如果两根线的话可以做得很快,我有时面对的是超过一万条线,每条线节点都上百个,还有弧,要求出这一堆线中的最小间距,那速度是很难提上去的
发表于 2013-11-4 10:47 | 显示全部楼层
http://blog.csdn.net/acmaker/article/details/3178696
如果楼主的两个多边形是凸多边形,可以参考上面的算法。
但是如果两个多边形不是凸多边形,那就有些麻烦了。
 楼主| 发表于 2013-11-4 13:02 | 显示全部楼层
highflybird 发表于 2013-11-4 10:47
http://blog.csdn.net/acmaker/article/details/3178696
如果楼主的两个多边形是凸多边形,可以参考上面的 ...

谢谢高飞鸟版主,在大家的指点下已经弄出来了,好象是可以允许凹多边形的
发表于 2016-7-29 23:53 | 显示全部楼层
llsheng_73 发表于 2013-11-3 05:37
熬了一晚上,总算能计算出来了,至于算法的优化,限于水平,只能期待各位版主大人,各位兄弟姐妹们多提建议 ...

我倒是想要顶点连接的呢,以下是最近点连接的,供参考。

(defun c:test ()
  (setvar "osmode" 15359)
  (setvar "cmdecho" 0)
  (command "undo" "be")
  (princ "\n功能:将点选的两条曲线之间的最近端点对连。\n制作者:吴丁运\n")
  (vl-load-com)
  (while
    (progn
      (setq ent1 (entsel "\n请点选第一条曲线:\n"))
      (not
        (if (= ent1 nil)
          nil
          (wcmatch (cdr (assoc 0 (entget (car ent1))))
                   "LWPOLYLINE,POLYLINE,SPLINE"
          )                                ;限定只能选取的曲线类型
        )
      )
    )
     (princ
       "\n提示:选取的不是多段线、样条曲线或未选取任何图元,请重新选取第一条曲线:\n"
     )
  )
  (while
    (progn
      (setq ent2 (entsel "\n请点选第二条曲线:\n"))
      (not
        (if (= ent2 nil)
          nil
          (wcmatch (cdr (assoc 0 (entget (car ent2))))
                   "LWPOLYLINE,POLYLINE,SPLINE"
          )                                ;限定只能选取的曲线类型
        )
      )
    )
     (princ
       "\n提示:选取的不是多段线、样条曲线或未选取任何图元,请重新选取第一条曲线:\n"
     )
  )
  (setq        entnam1        (car ent1)
        obj1        (vlax-ename->vla-object entnam1)
        entnam2        (car ent2)
        obj2        (vlax-ename->vla-object entnam2)
        j        -1
        n        0
        ptlist        nil
  )
  (while (setq ptdd (vlax-curve-getpointatparam obj1 (setq j (1+ j))))
    (setq ptlist (cons ptdd ptlist))        ;获取端点坐标,获取顶点坐标
  )
  (command "color" "Bylayer")
  (command "layer" "M" "层-两线端点对连" "C" "1" "层-两线端点对连" "")
  (setvar "osmode" 0)
  (repeat (length ptlist)
    (setq pt1 (nth n ptlist))
    (setq pt2 (vlax-curve-getclosestpointto obj2 pt1))
    (setq pt2_near
           (vlax-curve-getPointAtParam
             obj2
             (+ (vlax-curve-getParamAtPoint obj2 pt2) 0.5)
           )
    )
    (if        (<= (distance pt1 pt2) (distance pt1 pt2_near))
      (command "Line" pt1 pt2 "")
      (command "Line" pt1 pt2_near "")
    )
    (setq n (1+ n))
  )
  (setvar "osmode" 15359)
  (command "undo" "e")
  (princ)
)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-18 20:24 , Processed in 0.228036 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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