Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在凹凸多边形中查找有界矩形_Java_Geometry_Computational Geometry - Fatal编程技术网

Java 在凹凸多边形中查找有界矩形

Java 在凹凸多边形中查找有界矩形,java,geometry,computational-geometry,Java,Geometry,Computational Geometry,我正在寻找一种方法,在凹多边形或凸多边形中找到一个轴对齐的矩形 我一直在网上寻找,我能找到的最接近的解决方案只适用于凸多边形,而不是凹多边形。例如— 老实说,我不是一个伟大的数学天才,所以我宁愿找到代码样本或代码库,但我想我可以自己处理一些数学问题,或者找人帮我 如果解决方案也能用Java,那就太好了,但也许我太贪婪了:p 编辑:为了回应罗素的评论,我添加了更多的信息 有界矩形应尽可能大。矩形用于在其中包含文本。最多1到4个单词,支持文本换行。例如,如果它太薄,我会垂直放置文本,而不是水平放置

我正在寻找一种方法,在凹多边形或凸多边形中找到一个轴对齐的矩形

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

老实说,我不是一个伟大的数学天才,所以我宁愿找到代码样本或代码库,但我想我可以自己处理一些数学问题,或者找人帮我

如果解决方案也能用Java,那就太好了,但也许我太贪婪了:p

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

有界矩形应尽可能大。矩形用于在其中包含文本。最多1到4个单词,支持文本换行。例如,如果它太薄,我会垂直放置文本,而不是水平放置。所以对于纵横比,我想它需要足够容纳1-4个单词,无论是垂直的还是水平的,都需要换行。如果矩形很小,我可以调整文本大小,但最好文本尽可能大

另一个很好的要求是,如果多边形的总体方向是对角线,并且文本在对角线方向时更适合,那么矩形不一定与轴对齐,而是与多边形的对角线对齐。我想这个需求让这件事变得非常棘手,但若你们认为这是可能的,那个就太好了

我想我已经满足了所有的要求P


谢谢

我曾经以一种非常笨拙的方式实现了一个类似的系统,只需在可能的矩形中进行搜索,并在其上使用
Shape.contains()
。它有点慢-也许是1秒的布局在一个椭圆形的盖茨堡地址-但对于静态文本和简单形状的小文本有用


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

既然你想对文本这样做,我就假设速度很重要,准确性不那么重要。那么,我建议:

  • 将多边形放置在网格上,网格中的单元格与文字尺寸成比例
  • 使用删除边界上的单元格
  • 移除边界单元外的单元(从栅格边缘向内移动)
  • 找到剩余单元格上的最大矩形,如所示方法
  • 另见

    编辑:我刚刚注意到,如果多边形以一定角度定向,该算法将进行调整。我的建议是找到多边形的方向以检查方向,旋转它以使主轴与x轴对齐,然后应用上述算法


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

    矩形上还有其他约束吗?是否希望它具有最大面积?具有一定的高度或宽度?或者可能具有一定的纵横比?它是否应与至少两个角上的边接触?对于凹多边形,可能有多个不同的位置有没有更好的启发式方法?嗨,罗素,谢谢你的回答!我已经更新了我的问题。谢谢DeepYellow!你的算法看起来足够优雅。不幸的是,我现在没有时间实现它,因为它非常复杂。但我还是把它作为答案。我希望我能尽快实现它n、 这个解决方案是不够的。想想一个几乎接触到自身的凹多边形-从外部填充不会填充空腔。@SudoNhim,我不同意,无论是凹多边形还是凸多边形都一样有效。你认为哪里出了问题?当一个多边形几乎接触到自身时,光栅化版本实际上可以接触到自身,从而防止了s步骤3:移除位于多边形外部的所有单元。这不是一个不切实际的场景,假设您正在尝试标记具有河口的地块。下面是步骤3的一个失败案例:当然,解决方案是使用适当的光栅化算法。例如,感谢Russell!它确实很复杂:)我认为我最好用DeepYellow的方法实现它,尽管这仍然是一个很好的参考!谢谢!