Geometry 移动两个多边形以使其接触边的距离

Geometry 移动两个多边形以使其接触边的距离,geometry,computational-geometry,polygons,Geometry,Computational Geometry,Polygons,最佳描述见下图 我需要知道在一个轴(仅y轴)上移动参考多边形(显示为红色)的最小距离,以便只接触另一个多边形。如果它在多边形内部,则需要向外移动 我试着观察一个多边形中的所有直线和另一个多边形中的所有点,将点投影到直线上,得到点y和投影点y之间的差值,然后找到最小距离。但是,如果多边形重叠,且一个多边形中最远的直线和另一个多边形中最远的点的距离最小,则会产生使多边形重叠的结果 编辑:通过在直线上投影点,我的意思是找到与原始点具有相同x值的直线上点的y值。如果x值位于线外,则跳过此步骤。我不确定

最佳描述见下图

我需要知道在一个轴(仅y轴)上移动参考多边形(显示为红色)的最小距离,以便只接触另一个多边形。如果它在多边形内部,则需要向外移动

我试着观察一个多边形中的所有直线和另一个多边形中的所有点,将点投影到直线上,得到点y和投影点y之间的差值,然后找到最小距离。但是,如果多边形重叠,且一个多边形中最远的直线和另一个多边形中最远的点的距离最小,则会产生使多边形重叠的结果


编辑:通过在直线上投影点,我的意思是找到与原始点具有相同x值的直线上点的y值。如果x值位于线外,则跳过此步骤。

我不确定是否正确理解了您的建议(什么是“将点投影到线上”?)

无论如何,我会尝试以下(伪代码):


但不幸的是,如果多边形是凹形的,这可能不好,似乎是这样。

您需要通过两个多边形的每个顶点绘制一条垂直线,并确定其与多边形的交点(线/多边形交点由不相交的间隔组成)

在给定的垂直面上,计算多边形的最高端点与另一个多边形的最低端点之间的差值。答案是所有垂直方向之间的最小差异(可以是负数)

为了高效地执行计算,可以使用扫描线原则:从左到右对所有顶点进行排序,并维护“活动列表”,即与当前垂直方向相交的边的列表。从一个顶点移动到下一个顶点时,将更新此列表


对于大小为
N
M
的两个多边形,排序将花费
O(N+M)Log(N+M))
;然后扫描将花费大约
O((N+M)K)
,其中
K
是垂直面与多边形相交的平均数,通常是2到4之间的一个小数字。

我建议添加标签
几何体
计算几何体
,以吸引更多读者(我自己做不到,编辑需要超过10个字符,grrr!)那么?你得到了两个答案,而你没有一个评论或投票?你真的感兴趣吗?你找到了另一个解决方案吗?如果是,请贡献,你也可以回答你自己的问题。
for pA: points of polygon A:
   for sB: segments of polygon B
      compute distance along y-axis d(pA,sB) and store in table
Find minimum distance in table: d1
Proceed as above by reversing A and B: d2
final d = min(d1,d2)