14

我有两个凸多边形。多边形被实现为其顶点的循环列表。如何找到这两个多边形的交点?

4

3 回答 3

10
For each edge V1-V2 in the first polygon,
    Let H := Half-plane tangenting V1-V2, with the remaining
        vertices on the "inside".
    Let C := New empty polygon.
    For each edge V3-V4 in the second polygon,
        Let X := The intersection between V3-V4 and H.
        If V3 inside H, and V4 is outside H then,
            Add V3 to C.
            Add X to C.
        Else if both V3 and V4 lies outside H then,
            Skip.
        Else if V3 outside H, and V4 is inside H then,
            Add X to C.
        Else
            Add V3 to C.
    Replace the second polygon with C.

这应该足够简单的使用了;10-20 个顶点,而不是重新计算每一帧。— O( n 2 )


这里有几个链接:

于 2012-10-28T00:11:07.097 回答
10

您可以从两个多边形都是凸的这一事实中受益。有了这些知识,您可以使用以下扫描线算法实现O(n)时间:

找到两个多边形中的最高点。为简单起见,假设您没有水平边缘。创建构成多边形左右边界的边列表。

在扫下平面时,您存储 4 个边。left_edge_C1, right_edge_C1, left_edge_C2, right_edge_C2. 您不需要任何复杂的边缘来描边,因为它们只有四个。您可以通过迭代所有可能的选项来找到下一个事件点。

在每个事件点,一些边缘出现在它们的交点的边界上。基本上,在每个事件点,您都可以选择三种情况之一(见图)。

在此处输入图像描述

于 2015-07-18T09:10:26.833 回答
3

除了@Yola 漂亮的平面扫描描述外, C 中的计算几何第 7 章中还描述了一种线性时间算法。并且 C 和 Java 代码可用(在同一链接)。有几种棘手的退化情况,例如,当两个多边形在一点相交时,或者相交是一个线段。

于 2015-07-18T19:02:17.437 回答