我有两个简单的多边形,用顶点列表定义。
我需要计算他们交叉的面积。我需要一个算法来做到这一点
答案 0 :(得分:4)
假设:多边形是凸的。 (这些适用于凸多边形。) 您可以查看此link以获取更多信息。
为了能够确定两个凸多边形是否相交(相互接触),我们可以使用分离轴定理。基本上:
- 如果两个凸多边形不相交,则存在一条在它们之间穿过的线。
- 只有当其中一个多边形的一边形成这样的直线时,才存在这样的直线。
第一个陈述很简单。由于多边形都是凸面的,因此除非它们相交,否则您将能够在一侧绘制一条多边形线而在另一侧绘制另一条多边形。第二个稍微不那么直观。请看图1.除非多边形的最近边彼此平行,否则它们彼此最接近的点是一个多边形的一个角最接近另一个多边形的一侧的点。然后,该侧将在多边形之间形成分离轴。如果两边是平行的,它们都是分离轴。
那么具体如何帮助我们决定多边形A和B是否相交?好吧,我们只是越过每个多边形的每一边,检查它是否形成一个分离轴。为此,我们将使用一些基本的矢量数学将两个多边形的所有点压缩到垂直于潜在分离线的直线上(见图2)。现在整个问题很方便一维。我们可以确定每个多边形的点所在的区域,如果这些区域不重叠,则该线是分离轴。
如果在检查两个多边形的每条线后,没有找到分离轴,则已经证明多边形相交并且必须对其进行某些操作。
注意:这个问题很精彩地描述了这一部分。我已使用此question
中的这一部分算法就是这样工作的
算法以主题多边形中的
all vertices
输入列表开头。接下来,剪辑多边形的一侧在两个方向上无限延伸,并且遍历主题多边形的路径。输入列表中的顶点如果位于扩展剪辑多边形线的可见侧,则会插入到输出列表中,并且新顶点将添加到主题多边形路径与扩展剪辑多边形线相交的输出列表中。
有关详细信息,请访问此链接
坐标(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)]
这些是您必须执行的步骤才能解决问题。希望它有所帮助。