两个旋转矩形的交点面积

时间:2012-07-26 13:09:33

标签: algorithm graphics geometry intersection

我有两个2D矩形,定义为原点(x,y)a 尺寸(高度,宽度)和旋转角度(0-360°)。我可以保证两个矩形的大小相同。

我需要计算这两个矩形的近似交叉区域。 Rectangle intersection

计算不需要精确,尽管可以。我将比较结果与其他交叉区域以确定一组矩形中的最大交叉区域,因此它只需要相对于同一算法的其他计算准确。

我考虑过使用相交区域的边界框区域,但由于所有不同的可能情况,我无法获取相交区域的顶点: So many possible intersection shapes

我正在Cocoa框架中的Objective-C中编写这个程序,这是值得的,所以如果有人知道任何使用NSBezierPath的快捷方式,或者你也可以提出建议。

6 个答案:

答案 0 :(得分:9)

为了补充其他答案,您的问题是行剪辑的一个实例,这是一个在计算机图形学中经过深入研究的主题,并且有许多可用的算法。 如果旋转坐标系使一个矩形具有水平边,那么问题就是从那里开始的线剪裁。

您可以从Wikipedia article on the topic开始,然后从那里进行调查。

答案 1 :(得分:5)

一个能给出近似答案的简单算法就是抽样。

将一个矩形划分为小方格网格。对于每个交叉点,检查该点是否在另一个矩形内。位于另一个矩形内的点的数量将是重叠区域的相当好的近似值。增加点的密度会增加计算的准确性,但会牺牲性能。

答案 2 :(得分:4)

在任何情况下,计算两个多边形的精确交叉多边形是一项简单的任务,因为任何凸多边形都可以看作是半平面的交点。 “顺序切割”完成了这项工作。

选择一个矩形(任意)作为切割矩形。逐个迭代切割矩形的两侧。用包含切割矩形当前边的线切割第二个矩形,并丢弃位于“外部”半平面内的所有内容。

一旦完成所有切割边的迭代,结果就是剩下的另一个矩形了。

答案 3 :(得分:3)

您实际上可以计算确切的区域。

  1. 从两个矩形中制作一个多边形。请参阅this question(尤其是this answer),或使用gpc库。
  2. 找到此多边形的区域。见here
  3. 共享区域是

    area of rectangle 1 + area of rectangle 2 - area of aggregated polygon
    

答案 4 :(得分:1)

获取每个矩形的每个线段,看它们是否相交。将有几种可能性:

  1. 如果没有相交 - 共享区域为零 - 除非一个点在另一个点内。在这种情况下,共享区域是较小区域的区域。

  2. a如果一个rectactangle的两个连续边与另一个矩形的单个边相交,则形成一个三角形。计算其面积。

    湾如果边缘不是连续的,则形成四边形。从四边形的两个相对角计算一条线,这就形成了两个三角形。计算每个区域和总和。

  3. 如果一个边缘与另一个边缘相交,那么你将有一个四边形。按2b计算。

  4. 如果一个边缘与另一个边缘相交,则会有一个八边形。将其分解为三角形(例如,从一个顶点到另一个顶点绘制一条光线以制作4个三角形)

  5. @edit:我有一个更通用的解决方案。

    检查1中的特殊情况。

    然后从任何相交的顶点开始,并沿着边缘跟随任何其他交叉点,直到返回到第一个相交的顶点。这形成凸多边形。从第一个顶点到每个相对的vetex绘制一条光线(例如,向左和向右跳过顶点。)这将把它分成一堆三角形。计算每个区域和总和。

答案 5 :(得分:0)

蛮力的方式:

  • 从[角落]中取出所有点 矩形] + [边缘的交点]
  • 删除不在两个矩形内部或边缘的点。
  • 现在你有交叉的角落。请注意,交点是凸的。
  • 按照集合中的任意点,任意其他点和给定点之间的角度对剩余点进行排序。
  • 现在您按顺序拥有交点。
  • 按常规方式计算面积(按交叉产品计算)