我有两个简单的多边形,分别由顶点列表定义。
我需要计算它们的交集面积。我需要一个算法来完成这个任务。
我有两个简单的多边形,分别由顶点列表定义。
我需要计算它们的交集面积。我需要一个算法来完成这个任务。
假设:这些多边形是凸多边形。 (这适用于凸多边形。) 您可以查看此链接以获取更多信息。
为了能够确定两个凸多边形是否相交(彼此接触),我们可以使用分离轴定理。本质上:
- 如果两个凸多边形不相交,则存在一条线穿过它们之间。
- 只有在一个多边形的一侧形成这样一条线时才存在这样的线。
第一个语句很容易理解。由于多边形都是凸的,因此您将能够画出一条线,其中一个多边形在一侧,而另一个多边形在另一侧,除非它们相交。第二个语句略微不太直观。请参见图1。除非多边形的最近边缘彼此平行,否则它们彼此最接近的点是其中一个多边形的一个角落最靠近另一个多边形的一侧。然后,该侧将形成多边形之间的分离轴。如果边缘平行,则它们都是分离轴。
那么这如何具体帮助我们确定多边形A和B是否相交?好吧,我们只需检查每个多边形的每条边是否形成分离轴即可。为此,我们将使用一些基本的向量数学,将两个多边形的所有点压缩到垂直于潜在分离线的线上(请参见图2)。现在整个问题方便地变成了一维问题。我们可以确定每个多边形的点所在的区域,如果这些区域不重叠,则该线是分离轴。
如果在检查来自两个多边形的每条线后未找到分离轴,则已经证明多边形相交,必须采取某些措施。
注意:此SO问题出色地描述了此部分。我从这个问题中使用了此部分。
算法简单地按如下方式工作:
算法从主题多边形的所有顶点列表开始。接下来,剪辑多边形的一侧在两个方向上无限延伸,并遍历主题多边形的路径。如果输入列表中的顶点位于延长的剪辑多边形线的可见侧,则将其插入到输出列表中,并在主题多边形路径穿过延长的剪辑多边形线时向输出列表添加新顶点。
有关更多详细信息,请访问这些链接
一个凸多边形的坐标 (x1, y1)
, (x2, y2)
, (x3, y3)
, . . . , (xn, yn)
必须按照逆时针的顺序围绕多边形排列,开始和结束点相同。这些坐标被排列在下面的行列式中。
| x1 y1 |
| x2 y2 |
| x3 y3 |
Area= (1/2)* | .. .. |
| .. .. |
| xn yn |
| x1 y1 |
= (1/2)[(x1*y2+x2*y3+...xn*y1)- (y1*x2+y2*x3+...+yn*x1)]
以下是解决问题的步骤,请按照步骤操作。希望能对你有所帮助。