在凹/凸多边形内查找有界矩形
Posted
技术标签:
【中文标题】在凹/凸多边形内查找有界矩形【英文标题】:Finding a bounded rectangle inside a concave/convex polygon 【发布时间】:2012-04-30 04:27:16 【问题描述】:我正在寻找一种在凹面或凸面多边形内找到轴对齐矩形的方法。
我一直在网上寻找,我能找到的最接近的解决方案只适合凸多边形,而不适合凹多边形。例如 -
Finding an axis-aligned rectangle inside a polygon
说实话,我不是一个出色的数学专家,所以我宁愿找到代码示例或代码库,但我想我可以自己处理一些数学,或者找人来帮助我。
如果解决方案也可以使用 Java 那就太好了,但也许我太贪心了 :P
编辑:为了回应 Russell 的评论,我添加了更多信息。
有界矩形应尽可能大。该矩形旨在在其中包含文本。最多 1 到 4 个字,支持文本换行。因此,例如,如果它太薄,我会垂直放置文本而不是水平放置。因此,对于纵横比,我想它需要足以容纳 1-4 个单词,无论是垂直还是水平,并带有自动换行。如果矩形很小,我可以调整文本的大小,但最好是文本尽可能大。
另一个很好的要求是,如果多边形的一般方向是对角线,并且文本在对角线方向时会更合适,那么矩形不一定与轴对齐,而是与多边形的对角线对齐。我想这个需求让这变得非常棘手,但如果你们认为它可能,那就太好了!
我想我现在已经满足了所有要求。 :P
谢谢!
【问题讨论】:
矩形是否有更多限制?你想要它的最大面积吗?有一定的高度或宽度?或者也许是某个纵横比?它是否应该至少接触两个角的边缘?对于可能存在多个不同可能位置的凹多边形,是否存在更好的启发式方法? 嗨罗素,感谢您的回复!我已经更新了我的问题。 【参考方案1】:由于您想对文本执行此操作,我假设速度很重要,准确性不太重要。我建议这样做:
-
将多边形放在网格上,其单元格与文本尺寸成比例。
使用Bresenham's line algorithm. 删除边界上的单元格。
移除边界单元外的单元(从网格边缘向内工作。
找到剩余单元格上的最大矩形,例如显示的方法here。
另见Puzzle: Find largest rectangle (maximal rectangle problem)。
编辑:我刚刚注意到如果多边形以一定角度定向,该算法会调整的请求。我的建议是找到多边形的principle axes 来检查方向,旋转它使主轴与x 轴对齐,然后应用上面的算法。
另外,我想指出,“删除一个单元格”实际上只是意味着在代表网格单元格的二维数组中设置一个位。
【讨论】:
感谢 DeepYellow!您的算法似乎足够优雅。不幸的是,我现在没有时间实现它,因为它非常复杂。但我仍然将此标记为答案。我希望我能尽快实现它。 这个解决方案是不够的。想象一个几乎接触到自身的凹多边形——从外部填充不会填充空腔。 @SudoNhim,我不同意,无论是凹面还是凸面,它都一样有效。你觉得哪里出了问题? 当多边形几乎接触到自身时,光栅化版本实际上可能会接触到自身,从而阻止步骤 3 移除位于多边形外部的所有单元格。这不是一个不切实际的场景,假设您正在尝试标记具有河口的陆地。这是第 3 步的失败案例:i.imgur.com/o8mZHbF.png 解决方案当然是使用适当的光栅化算法。例如cs.mun.ca/av/old/teaching/cg/notes/raster_poly.pdf【参考方案2】:我曾经通过搜索可能的矩形并在它们上使用Shape.contains()
以一种非常笨拙的方式实现了一个类似的系统。它有点慢 - 将 Gettsburg Address 布局成椭圆形可能需要 1 秒 - 但对于静态文本和简单形状的小文本很有用。
如果您有兴趣,可以解压缩 jar 文件 here 并查看 TextWrappingLayout
。它可能比您需要的要复杂得多,因为它不是在单个矩形中布局,而是尝试将每条线尽可能靠近边缘放置,但您可以看到基本思想。
【讨论】:
谢谢拉塞尔!真的很复杂 :) 我认为用 DeepYellow 的方法来实现它会更好,尽管这仍然是一个很好的参考!非常感谢!以上是关于在凹/凸多边形内查找有界矩形的主要内容,如果未能解决你的问题,请参考以下文章