Algorithm 如何用直线分割多边形?

Algorithm 如何用直线分割多边形?,algorithm,split,polygon,Algorithm,Split,Polygon,如下图所示 可以用直线分割多边形吗?(分成两个多边形)。如果直线没有穿过多边形,它将失败 这可能吗?如果是这样的话,我该怎么做呢?这是完全可能的。我假设您正在使用Java2d进行此操作。您在其中找到了一个称为intersects的方法。用它你可以做到这一点 您可能需要修改多边形的实现并编写一个或多个相交方法,该方法通过Line2D对象并对其进行自定义,以便它通过阵列多边形(可能是因为同一直线切割可以生成无限多个多边形-假设为锯齿形多边形)或为空。可能是,但是如果多边形不是凸的,那么将其沿直线分

如下图所示

可以用直线分割多边形吗?(分成两个多边形)。如果直线没有穿过多边形,它将失败


这可能吗?如果是这样的话,我该怎么做呢?

这是完全可能的。我假设您正在使用Java2d进行此操作。您在其中找到了一个称为intersects的方法。用它你可以做到这一点


您可能需要修改多边形的实现并编写一个或多个相交方法,该方法通过Line2D对象并对其进行自定义,以便它通过阵列多边形(可能是因为同一直线切割可以生成无限多个多边形-假设为锯齿形多边形)或为空。

可能是,但是如果多边形不是凸的,那么将其沿直线分割可能会导致两个以上的多边形

遍历多边形边,并为每条边确定其是否与直线相交。找到第一条这样做的边。继续遍历,直到找到另一条这样的边,但将沿途遇到的每条边添加到一个新多边形(包括第一条边被“这一边”上的线分割的部分,以及最后一条边的部分)。最后,向新多边形添加闭合边。现在继续处理线另一侧的边,以相同的方式创建另一个多边形。现在有两个多边形沿直线分割。如果小心的话,将非凸多边形拆分为多个多边形也可以使用相同的技术

注意角点情况,例如与多边形顶点相交的直线,以及与多边形完全不相交的直线


编辑:正如xan指出的,这不会正确处理所有非凸情况。这可以通过对算法进行一点修改来解决。在如上所述添加闭合边之前,必须首先检查原始多边形的任何其他边是否会与该闭合边相交;如果是这样,您只需靠近该边,然后从该点继续处理其他边。

您所需要的只是一个多边形剪裁。您可以在此处看到概述:
我认为有一些penty实现可以供您学习

我最近不得不这么做。如图中所示,仅行走多边形对凹多边形不起作用。下面是我的算法草图,灵感来自多边形剪裁算法。分割比多边形剪裁更容易,也更难。更容易,因为您只针对直线而不是矩形或其他多边形进行剪裁;更难,因为你需要保持两面性

Create an empty list of output polygons
Create an empty list of pending crossbacks (one for each polygon)
Find all intersections between the polygon and the line.
Sort them by position along the line.
Pair them up as alternating entry/exit lines.
Append a polygon to the output list and make it current.
Walk the polygon. For each edge:
    Append the first point to the current polygon.
    If there is an intersection with the split line:
        Add the intersection point to the current polygon.
        Find the intersection point in the intersection pairs.
        Set its partner as the crossback point for the current polygon.
        If there is an existing polygon with a crossback for this edge:
            Set the current polygon to be that polygon.
        Else
            Append a new polygon and new crossback point to the output lists and make it current.
        Add the intersection point to the now current polygon.

1994年,乔治·瓦内塞克(George Vanecek)在3D中提出了一个解决方案,并在Graphic Gems V《平面对多边形的空间分割》中发表了该解决方案。源代码在中仍然可用


最近,David Geier发布了Vanecek算法的2D实现,并解释了该算法。请参见

谢谢您的回复,但我甚至不知道该怎么做(涉及的数学问题)。这可能与与与多边形的每条直线相交的直线有关。(并且像那样分割形状)谢谢。这可能是我一有时间就要做的,我不认为这项技术可以轻易地扩展到凹多边形。考虑用垂直线分割字母C的轮廓。在左边,你会看到两个重叠的半圆形多边形。xan,没错,这是另一个需要处理的情况。当您穿过分割线时,您需要检查您是否不在先前创建的多边形内;或者更确切地说,确保合成的边不会与另一条边交叉。