我有两个2D矩形,分别定义为原点(x,y),大小(高度,宽度)和旋转角度(0-360°)。 我可以保证两个矩形的大小相同。
我需要计算这两个矩形的相交区域。
尽管可以,但计算不一定要精确。 我将结果与其他相交区域进行比较,以确定一组矩形中最大的相交区域,因此相对于同一算法的其他计算而言,它只需要准确即可。
我考虑过使用相交区域的边界框的面积,但是由于所有可能的情况,我都无法获取相交区域的顶点:
我正在用Cocoa框架在Objective-C中编写该程序,以了解它的价值,因此,如果有人知道使用NSBezierPath的任何快捷方式,也欢迎您提出建议。
我没有得到您确切需要的东西。 但是我认为最大交集面积总是等于其中一个矩形的面积,因为两个矩形都具有相同的面积。
@rain,他不想要最大可能的交点面积,但实际的交点是两个给定矩形的交点。
是的,你是对的。 但是在问题中他提到了"我可以保证两个矩形的大小相同"。 和"我将比较结果与其他相交区域以确定一组矩形中的最大相交区域"。 所以我怀疑到底需要什么。
@雨,Shahbaz是正确的; 我有一组矩形-在这个矩形中,我需要确定两个矩形之间的最大交集区域。 我提到它的唯一原因是提供上下文说明为什么我需要能够找到两个矩形的相交区域。
这本质上是stackoverflow.com/questions/8011267/的副本。
为了补充其他答案,您的问题是换行的一个实例,它是计算机图形学中一个被广泛研究的主题,并且有许多可用的算法。
如果旋转坐标系以使一个矩形具有水平边缘,那么问题就出在那儿。
您可以从有关该主题的Wikipedia文章开始,然后从那里进行调查。
一个可以给出近似答案的简单算法是采样。
将您的一个矩形划分为小正方形的网格。对于每个相交点,检查该点是否在另一个矩形内。位于另一个矩形内的点的数量将非常接近重叠区域的面积。增加点的密度将提高计算的准确性,但会降低性能。
因为在我的案例中,开发时间比效率或准确性更重要,所以我选择了这个答案。但是,请参阅其他答案以获得更有效/更准确的解决方案。
如果您有网格,则可以使用Picks定理en.wikipedia.org/wiki/Pick%27s_theorem
无论如何,计算两个凸多边形的精确相交多边形是一件容易的事,因为任何凸多边形都可以看作是半平面的交集。"顺序切割"可以完成任务。
选择一个矩形(任意)作为切割矩形。一次又一次地遍历切割矩形的侧面。用包含切割矩形当前边的线切割第二个矩形,并丢弃"外"半平面中的所有内容。
完成所有切削面的迭代后,剩下的就是另一个矩形。
您实际上可以计算出确切的面积。
从两个矩形中制作一个多边形。查看此问题(尤其是此答案),或使用gpc库。
找到该多边形的面积。看这里。
共享区域是
area of rectangle 1 + area of rectangle 2 - area of aggregated polygon
您提供的链接似乎并未完全说明如何实施步骤1?该问题没有可接受的答案。
@MarkByers,是的,但是该问题的OP中有30%的答案无法接受。那里有很多解决方案,肯定其中一种会起作用。病态搜索更多。
我很高兴我不是唯一的一个。我以为自己了解了,但是现在我试图实现它,但是仍然坚持试图形成两个矩形的结合。假设我可以找到交叉点,那么这些点按什么顺序排列?
@NateThorn,我更新了答案,引入了执行此操作的库。您也可以在Internet上搜索此特定子问题。
如果您要使用gpc库,则无需执行这三个步骤。它可以直接计算交点。"支持差异,相交,异或和联合剪辑操作。"
我不想支付商业上使用gpc库的费用;这确实是我程序的附带功能,不值得为整个图书馆付费而烦恼。
@NateThorn,请确保您查看我链接的答案。这个想法是找到相交点,潜水边缘,并使每个矩形成为一个更复杂的多边形。然后,您可以简单地删除完全在另一个矩形内的边,并合并边。
@NateThorn,如果您的程序不是商业性的,gpc也是免费的。
取每个矩形的每个线段,看看它们是否相交。将有几种可能性:
如果没有相交-共享区域为零-除非一个点的所有点都在另一个点内。在那种情况下,共享区域是较小的区域。
a如果一个矩形的两个连续边与另一个矩形的单个边相交,则形成一个三角形。计算其面积。
b。如果边缘不重要,则形成四边形。从四边形的两个相对角计算一条线,这将形成两个三角形。计算每个面积的总和。
如果一个的两条边与另一条的两条边相交,则您将具有四边形。按照2b计算。
如果一个边的每个边与另一个边的每个边相交,则将有一个八边形。将其分解为三角形(例如,从一个顶点到另一顶点绘制射线以形成4个三角形)
@edit:我有一个更通用的解决方案。
检查1中的特殊情况。
然后从任何相交的顶点开始,并沿其边缘到任何其他相交点,直到回到第一个相交的顶点。这形成一个凸多边形。从第一个顶点到每个相对的顶点绘制射线(例如,将顶点向左和向右跳过)。这会将其划分为一堆三角形。计算每个面积并求和。
"如果一个矩形的两个边缘与另一个矩形的单个边缘相交,则形成一个三角形。"或矩形。
呃。让我解决这个问题。
还有一种情况:"如果一个rectactangle的两个连续边缘与另一个矩形的单个边缘相交,则形成一个三角形"或五边形。
还有一个更通用的解决方案。简直就是个草图。
@RafaelBaptista,您也缺少6面形状(六边形)的情况:screenshoot.me/IMQZcV
一种蛮力的方式:
从[角的集合
矩形] + [边缘的交点]
删除两个矩形内部或边缘之外的点。
现在您有了相交的角落。请注意,交点是凸的。
根据集合中任意点,任意其他点和给定点之间的角度对其余点进行排序。
现在,您已经有了交点。
按常规方法计算面积(按叉积计算)
。