我有两个2D矩形,定义为原点(x,y)a 尺寸(高度,宽度)和旋转角度(0-360°)。我可以保证两个矩形的大小相同。
我需要计算这两个矩形的近似交叉区域。
计算不需要精确,尽管可以。我将比较结果与其他交叉区域以确定一组矩形中的最大交叉区域,因此它只需要相对于同一算法的其他计算准确。
我考虑过使用相交区域的边界框区域,但由于所有不同的可能情况,我无法获取相交区域的顶点:
我正在Cocoa框架中的Objective-C中编写这个程序,这是值得的,所以如果有人知道任何使用NSBezierPath
的快捷方式,或者你也可以提出建议。
答案 0 :(得分:9)
为了补充其他答案,您的问题是行剪辑的一个实例,这是一个在计算机图形学中经过深入研究的主题,并且有许多可用的算法。 如果旋转坐标系使一个矩形具有水平边,那么问题就是从那里开始的线剪裁。
您可以从Wikipedia article on the topic开始,然后从那里进行调查。
答案 1 :(得分:5)
一个能给出近似答案的简单算法就是抽样。
将一个矩形划分为小方格网格。对于每个交叉点,检查该点是否在另一个矩形内。位于另一个矩形内的点的数量将是重叠区域的相当好的近似值。增加点的密度会增加计算的准确性,但会牺牲性能。
答案 2 :(得分:4)
在任何情况下,计算两个凸多边形的精确交叉多边形是一项简单的任务,因为任何凸多边形都可以看作是半平面的交点。 “顺序切割”完成了这项工作。
选择一个矩形(任意)作为切割矩形。逐个迭代切割矩形的两侧。用包含切割矩形当前边的线切割第二个矩形,并丢弃位于“外部”半平面内的所有内容。
一旦完成所有切割边的迭代,结果就是剩下的另一个矩形了。
答案 3 :(得分:3)
您实际上可以计算确切的区域。
共享区域是
area of rectangle 1 + area of rectangle 2 - area of aggregated polygon
答案 4 :(得分:1)
获取每个矩形的每个线段,看它们是否相交。将有几种可能性:
如果没有相交 - 共享区域为零 - 除非一个点在另一个点内。在这种情况下,共享区域是较小区域的区域。
a如果一个rectactangle的两个连续边与另一个矩形的单个边相交,则形成一个三角形。计算其面积。
湾如果边缘不是连续的,则形成四边形。从四边形的两个相对角计算一条线,这就形成了两个三角形。计算每个区域和总和。
如果一个边缘与另一个边缘相交,那么你将有一个四边形。按2b计算。
如果一个边缘与另一个边缘相交,则会有一个八边形。将其分解为三角形(例如,从一个顶点到另一个顶点绘制一条光线以制作4个三角形)
@edit:我有一个更通用的解决方案。
检查1中的特殊情况。
然后从任何相交的顶点开始,并沿着边缘跟随任何其他交叉点,直到返回到第一个相交的顶点。这形成凸多边形。从第一个顶点到每个相对的vetex绘制一条光线(例如,向左和向右跳过顶点。)这将把它分成一堆三角形。计算每个区域和总和。
答案 5 :(得分:0)
蛮力的方式: