在凹/凸多边形内找到有界矩形

时间:2012-04-18 17:37:30

标签: java geometry computational-geometry

我正在寻找一种在凹面或凸面多边形内找到轴对齐矩形的方法。

我一直在寻找网络,我能找到的最接近的解决方案只适合凸多边形,而不是凹多边形。例如 -

Finding an axis-aligned rectangle inside a polygon

老实说,我不是一个很棒的数学家,所以我宁愿找到代码示例或代码库,但我想我可以自己处理一些数学,或者找人来帮助我。

如果解决方案也可以在Java中,那将是非常好的,但也许我太贪心了:P

编辑:为了回应罗素的评论,我正在添加更多信息。

有界矩形应尽可能大。矩形旨在包含其中的文本。最多1到4个字,支持文本换行。因此,如果它太薄,我会将文本垂直放置而不是水平放置。所以对于宽高比,我想它需要足够包含1-4个单词垂直或水平与自动换行。如果矩形很小,我可以调整文本大小,但最好是文本尽可能大。

另一个很好的要求是,如果多边形的一般方向是对角线,并且当对角线方向对齐时文本会更好,那么矩形不一定与轴对齐,而是与多边形的对角线对齐。我想这个要求让这个变得非常棘手,但是如果你们认为它有可能那么它会很棒!

我想我现在已经涵盖了所有要求。 :P

谢谢!

2 个答案:

答案 0 :(得分:1)

我曾经通过对可能的矩形进行搜索并在其上使用Shape.contains()来实现类似的系统。这有点慢 - 可能是一个椭圆形的Gettsburg地址布局 - 但对于静态文本和简单形状的小文本很有用。

如果您有兴趣,可以解压缩jar文件here并查看TextWrappingLayout。它可能比你需要的要复杂得多,因为它不是在一个矩形中布置,而是试图将每条线尽可能靠近边缘放置,但你可以看到基本的想法。

答案 1 :(得分:1)

由于你想为文本做这件事,我会假设速度很重要,准确性不那么重要。我建议这样做:

  1. 将多边形放置在网格上,其中单元格与文本尺寸成比例。
  2. 使用Bresenham's line algorithm.删除边界上的单元格。
  3. 移除边界单元格外的单元格(通过向内网格边缘处理。
  4. 在剩余的单元格上找到最大矩形,例如显示的方法为here
  5. 另见Puzzle: Find largest rectangle (maximal rectangle problem)

    编辑:我刚刚注意到如果多边形以一定角度定向,则此算法会调整此请求。我的建议是找到多边形的principle axes来检查方向,旋转它以使主轴与x轴对齐,并应用上面的算法。

    另外,我想注意“删除单元格”实际上只是意味着在表示网格单元的2D数组中设置一个位。