移动两个多边形的距离使它们接触边缘

时间:2015-10-16 08:24:04

标签: geometry computational-geometry polygons

最佳描述如下图。

Polygon

我需要知道在一个轴(只是y)中移动参考多边形(以红色显示)的最小距离,这样才会触及另一个多边形。如果它在多边形内部,则需要向外移动。

我试图查看一个多边形中的所有线条和另一个多边形中的所有点,将点投影到线条上,得到点y和投影点y之间的差异,然后找到最小距离。然而,这有一个问题,即如果多边形重叠并且一个多边形中的最远线和另一个多边形中的最远点具有最小距离,则会产生使多边形重叠的结果。

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

2 个答案:

答案 0 :(得分:2)

我不确定我是否正确理解了您的建议(将该点投射到第34行?"?)。

无论如何,我会尝试这个(伪代码),:

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)

但不幸的是,如果您的多边形是凹的,这可能并不好,这似乎就是这种情况。

答案 1 :(得分:2)

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

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

要有效地执行计算,您可以使用扫描线原理:从左到右排序所有顶点并保持“活动列表”,这是与当前垂直相交的边列表。当您从一个顶点移动到下一个顶点时,您将更新此列表。

对于大小为<?php $id = 5; $args = array( 'category' => $id, 'post_type' => 'post', 'order' => 'ASC', 'posts_per_page'=>-1, 'numberposts'=>-1 ); $postslist = get_posts( $args ); foreach ($postslist as $post) : setup_postdata($post); ?> <?php the_title(); ?> <?php the_content(); ?> <?php endforeach; ?> N的两个多边形,排序费用为M;然后扫描费用约为O(N+M)Log(N+M)),其中O((N+M)K)是垂直与多边形的平均交点,通常是2到4之间的小数。