Area of Intersection of Two Rotated Rectangles
我有两个2D矩形,分别定义为原点(x,y),大小(高度,宽度)和旋转角度(0-360°)。 我可以保证两个矩形的大小相同。
我需要计算这两个矩形的相交区域。
尽管可以,但计算不一定要精确。 我将结果与其他相交区域进行比较,以确定一组矩形中最大的相交区域,因此相对于同一算法的其他计算而言,它只需要准确即可。
我考虑过使用相交区域的边界框的面积,但是由于所有可能的情况,我都无法获取相交区域的顶点:
我正在用Cocoa框架在Objective-C中编写该程序,以了解它的价值,因此,如果有人知道使用
为了补充其他答案,您的问题是换行的一个实例,它是计算机图形学中一个被广泛研究的主题,并且有许多可用的算法。
如果旋转坐标系以使一个矩形具有水平边缘,那么问题就出在那儿。
您可以从有关该主题的Wikipedia文章开始,然后从那里进行调查。
一个可以给出近似答案的简单算法是采样。
将您的一个矩形划分为小正方形的网格。对于每个相交点,检查该点是否在另一个矩形内。位于另一个矩形内的点的数量将非常接近重叠区域的面积。增加点的密度将提高计算的准确性,但会降低性能。
无论如何,计算两个凸多边形的精确相交多边形是一件容易的事,因为任何凸多边形都可以看作是半平面的交集。"顺序切割"可以完成任务。
选择一个矩形(任意)作为切割矩形。一次又一次地遍历切割矩形的侧面。用包含切割矩形当前边的线切割第二个矩形,并丢弃"外"半平面中的所有内容。
完成所有切削面的迭代后,剩下的就是另一个矩形。
您实际上可以计算出确切的面积。
共享区域是
1 | area of rectangle 1 + area of rectangle 2 - area of aggregated polygon |
取每个矩形的每个线段,看看它们是否相交。将有几种可能性:
如果没有相交-共享区域为零-除非一个点的所有点都在另一个点内。在那种情况下,共享区域是较小的区域。
a如果一个矩形的两个连续边与另一个矩形的单个边相交,则形成一个三角形。计算其面积。
b。如果边缘不重要,则形成四边形。从四边形的两个相对角计算一条线,这将形成两个三角形。计算每个面积的总和。
如果一个的两条边与另一条的两条边相交,则您将具有四边形。按照2b计算。
如果一个边的每个边与另一个边的每个边相交,则将有一个八边形。将其分解为三角形(例如,从一个顶点到另一顶点绘制射线以形成4个三角形)
@edit:我有一个更通用的解决方案。
检查1中的特殊情况。
然后从任何相交的顶点开始,并沿其边缘到任何其他相交点,直到回到第一个相交的顶点。这形成一个凸多边形。从第一个顶点到每个相对的顶点绘制射线(例如,将顶点向左和向右跳过)。这会将其划分为一堆三角形。计算每个面积并求和。
一种蛮力的方式:
-
从[角的集合
矩形] + [边缘的交点] - 删除两个矩形内部或边缘之外的点。
- 现在您有了相交的角落。请注意,交点是凸的。
- 根据集合中任意点,任意其他点和给定点之间的角度对其余点进行排序。
- 现在,您已经有了交点。
- 按常规方法计算面积(按叉积计算)
。