在多边形内找到轴对齐的矩形

时间:2009-03-04 13:06:10

标签: algorithm geometry polygon rectangles

我正在寻找一种好的算法来在(不一定是凸面的)多边形内找到轴对齐的矩形。最大的矩形会很好,但不是必需的 - 任何可以找到“相当好”的矩形的算法都没问题。

多边形也可能有洞,但任何只适用于凸多边形或简单多边形的算法指针也会有所帮助。

在我的实现中,对于边的交叉测试相当便宜,但“多边形点”测试是昂贵的,因此理想情况下应该最小化。

4 个答案:

答案 0 :(得分:7)

http://cgm.cs.mcgill.ca/~athens/cs507/Projects/2003/DanielSud/
有一个凸算法,引用可能值得一看 不确定它是否可以延伸到非凸面。

答案 1 :(得分:3)

一种解决方案是将凹多边形分成凸段,然后使用cobbal的链接。

由于您确实有两个不同的基本问题,您是否考虑过其他替代命中测试问题的方法,例如使用BSP树?您可以通过在多边形上铺设网格并为每个网格方块构建BSP树来进一步加快速度。或者每片叶子最多有一个边缘的kd树?

编辑:我会在kd-tree上做好准备(出于厌倦,即使它可能对任何人都有用):

kd-trees具有以下属性:

  1. 他们是二进制
  2. 每个非叶节点沿垂直于轴的平面分割空间,每个孩子一侧。例如。 root将空格分成x< x0和x> = x0
  3. 树级别沿不同的轴轮流分裂,例如等级0(根)分裂垂直于X,等级1 - > Y等。
  4. 要将其用于多边形命中检测,请按如下方式构造树:

    1. 选择要分割的顶点。 (对于平衡的树,最好是靠近中间的地方)。
    2. 将其他顶点拆分为两组,一组用于拆分的任一侧。上面的顶点不会进入任何一组。
    3. 也将边缘放入集合中。与分割线相交的任何边都会进入两组。
    4. 从上述组中递归构造子项。
    5. 如果适当选择分割顶点,则树的深度应接近log(N),其中N是顶点数。每个叶节点最多只有一个边缘通过它。要进行命中检测:

      1. 找到该点落入的叶子。
      2. 如果叶子中有边缘,请将其与点进行比较。如果不是,那么该点是在内部还是外部应该是显而易见的(在构造树时将这些信息存储在这些叶子中)。

答案 2 :(得分:2)

仅供参考,到目前为止我所拥有的只是蛮力:制作网格,对于网格上的点,如果它们在多边形内部,则通过依次展开每个角或边来制作一系列矩形,直到它达到在旁边。然后选择最大的。

最简单(也是非常有效)的优化只是测试网格点是否在多边形中,一旦检查到它没有包含在已经构造的一个矩形中,因为“矩形点”检查是快速的

由于显而易见的原因,这是相当缓慢和不精确的,更不用说不优雅的了:)。

答案 3 :(得分:0)

使用耳廓怎么样?您可以在每个三角形中找到最大的轴对齐矩形。然后你可以尝试连接三角形并重新计算矩形。