Algorithm 在多边形内查找与轴对齐的矩形

Algorithm 在多边形内查找与轴对齐的矩形,algorithm,geometry,polygon,rectangles,Algorithm,Geometry,Polygon,Rectangles,我正在寻找一个好的算法,在一个(不一定是凸的)多边形内找到一个轴对齐的矩形。一个最大的矩形会很好,但不是必需的——任何能找到“相当好”的矩形的算法都可以 多边形也可能有洞,但任何指向只适用于凸多边形或简单多边形的算法的指针也会很有帮助 在我的实现中,边的相交测试相当便宜,但“多边形中的点”测试非常昂贵,因此理想情况下应该最小化。仅供参考,到目前为止,我所拥有的只是蛮力:制作网格,对于网格上的点,如果它们位于多边形内,依次展开每个角或边,直到碰到一个边,从而形成一系列矩形。那就挑最大的 最简单(也

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

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


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

仅供参考,到目前为止,我所拥有的只是蛮力:制作网格,对于网格上的点,如果它们位于多边形内,依次展开每个角或边,直到碰到一个边,从而形成一系列矩形。那就挑最大的

最简单(也是非常有效)的优化方法是,在检查网格点是否包含在已构建的某个矩形中后,仅测试网格点是否位于多边形中,因为“矩形中的点”检查非常快速

由于明显的原因,这是相当缓慢和不精确的,更不用说不雅:)


有一个凸的算法,参考可能值得一看。

不确定是否可以扩展到非凸多边形。

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

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

编辑:我将在kd树上进行编辑(出于厌倦,即使它可能对任何人都有用):

kd树具有以下属性:

  • 它们是二进制的
  • 每个非叶节点沿垂直于轴的平面分割空间,每个子节点的一侧。例如,根将空间拆分为x=x0
  • 树级别轮流沿不同的轴进行拆分,例如0级(根)拆分垂直于X、1级->Y等
  • 要将其用于多边形命中检测,请按如下方式构造树:

  • 拾取要沿其拆分的顶点。(对于平衡的树,最好是靠近中间的地方)
  • 将其他顶点拆分为两个集,一个用于拆分的任一侧。上面的顶点不进入任何一个集合
  • 将边也放入集合中。与分割线相交的任何边都将进入两个集合
  • 从上述组中递归构造子级
  • 如果选择适当的分割顶点,则树的深度应接近对数(N),其中N是顶点数。每个叶节点最多有一条边穿过它。要执行命中检测,请执行以下操作:

  • 找到该点所在的叶子
  • 如果叶子上有一条边,将其与点进行比较。如果不是,则应该清楚该点是在内部还是外部(在构建树时将此信息存储在此类叶子中)

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

    你认为“多边形点”测试重吗?大多数情况下,它只是对多边形组成的所有ths点的“大于”和/或“小于”测试,并且仅在某些情况下是直线的相交测试?或者…?不知道你的意思。。。我对半行使用奇偶交叉测试(当然是在检查了边界矩形之后)。这最终会测试很多边,如果多边形有很多边,那么速度会非常慢。你能链接到一些数据集吗,这听起来像是一个很有趣的尝试。“恐怕不行,我这里只有数据库。我很好奇,这是干什么用的?”?一个凹多边形可以有两个或两个以上面积相等的矩形。在我头顶上,通过每个顶点构造水平线和垂直线,而不是一个统一的网格…假设多边形没有很多小边近似曲线。我使用了一种变体,效果很好。基本上,我将多边形切割成16个测试点(根据边界矩形的尺寸,4个宽4个高)。由于样本列表非常有限,我只需通过检查新点是否完全在几何体内部生成矩形来扩展矩形。这对我来说非常有效。我一直在努力避免它。。。你知道一个好的介绍吗?谢谢:)我不能提供任何,但是你可以很容易地用谷歌搜索很多东西,我刚才写的应该会给出一个大概的想法。哇,很好的链接,tnx