我正在寻找一种好的算法来在(不一定是凸面的)多边形内找到轴对齐的矩形。最大的矩形会很好,但不是必需的 - 任何可以找到“相当好”的矩形的算法都没问题。
多边形也可能有洞,但任何只适用于凸多边形或简单多边形的算法指针也会有所帮助。
在我的实现中,对于边的交叉测试相当便宜,但“多边形点”测试是昂贵的,因此理想情况下应该最小化。
答案 0 :(得分:7)
http://cgm.cs.mcgill.ca/~athens/cs507/Projects/2003/DanielSud/
有一个凸算法,引用可能值得一看
不确定它是否可以延伸到非凸面。
答案 1 :(得分:3)
一种解决方案是将凹多边形分成凸段,然后使用cobbal的链接。
由于您确实有两个不同的基本问题,您是否考虑过其他替代命中测试问题的方法,例如使用BSP树?您可以通过在多边形上铺设网格并为每个网格方块构建BSP树来进一步加快速度。或者每片叶子最多有一个边缘的kd树?
编辑:我会在kd-tree上做好准备(出于厌倦,即使它可能对任何人都有用):
kd-trees具有以下属性:
要将其用于多边形命中检测,请按如下方式构造树:
如果适当选择分割顶点,则树的深度应接近log(N),其中N是顶点数。每个叶节点最多只有一个边缘通过它。要进行命中检测:
答案 2 :(得分:2)
仅供参考,到目前为止我所拥有的只是蛮力:制作网格,对于网格上的点,如果它们在多边形内部,则通过依次展开每个角或边来制作一系列矩形,直到它达到在旁边。然后选择最大的。
最简单(也是非常有效)的优化只是测试网格点是否在多边形中,一旦检查到它没有包含在已经构造的一个矩形中,因为“矩形点”检查是快速的
由于显而易见的原因,这是相当缓慢和不精确的,更不用说不优雅的了:)。
答案 3 :(得分:0)
使用耳廓怎么样?您可以在每个三角形中找到最大的轴对齐矩形。然后你可以尝试连接三角形并重新计算矩形。