【问题标题】:Bounding (concave) polygon for multiple rectangles?多个矩形的边界(凹)多边形?
【发布时间】:2013-02-24 13:57:37
【问题描述】:

给定一组相交的矩形,是否有标准算法来找到它们的边界多边形? (一个多边形与矩形的并集完全相同的区域。)可以假设矩形都以相同的方式定向,边沿两个正交轴。

在搜索中,我找到了凸边界多边形的算法,但在这里我真的希望包含矩形覆盖的区域,这很可能是凹的。

(如果矩形完全包围一个区域,则可以将其包含在边界多边形内。)

【问题讨论】:

  • 相交的矩形?还是矩形的并集?边界多边形将是联合。然而,出于某种原因,您谈论交叉点。顺便说一句,你的矩形是等距的吗?
  • @AndreyT 是的,我的意思是联合——只是一个愚蠢的大脑放屁。并且矩形(以及联合体)都将是等角的。

标签: math geometry bounding-box


【解决方案1】:

我不知道是否有标准的方法可以做到这一点,但我想到边界多边形的顶点将是矩形的角和它们的边相交的点,不包括那些位于其中的点一个矩形。

要对点进行排序,请从集合中的一个点开始。它要么是两条边的交点,要么是一个角,所以无论哪种方式,它都保证至少在两条边上。只需沿着其中一个边缘移动,直到到达下一个点。因为我们已经移除了内部点,所以我们总是会在到达内部之前碰到另一个顶点。

如果一个矩形的角沿另一个矩形的边缘,则必须小心,因为离开角的一条路径将通向矩形的内部。所以有一些选择正确的边缘来追踪的元素。但是,如果您保留因位于内部而被排除的点的列表,您就会知道前往排除点的方向是错误的。

编辑 让我试着更明确地说。

(1) 从每个矩形的每一边开始。计算它们在哪里相交并在那里分割边缘。

(2) 现在你有了一个段列表。检查每个段的端点,看看它们是否在任何矩形内。

(3) 现在取任意一个外部端点,它是至少一个具有另一个外部端点的段的端点。从您的端点画线到另一个外部端点。

(4) 该外部端点也应该是具有另一个外部端点的不同段的端点。画一条线到那个外部端点。

(5) 重复直到你回到你开始使用的端点。

【讨论】:

  • 我已经考虑过这一点,但不幸的是,在某些情况下这不起作用。 (矩形的不同配置会导致相同的点集。)这可能很少见,以至于它适用于我的特定用例,但理想情况下我想要一个“完美”的解决方案。 :)
  • 当然,想象一个 4 x 4 的点网格。您可以将这些点连接起来形成一个 H 或一个 I。每个点都可以由三个矩形相交而成。
  • 实际上,没关系,我将沿“长边”的点包括在内,这些点可以被算法删除。我仍然不清楚如何排序。
  • 好吧,你想对它们进行排序,这样它们之间的线就不会相互交叉。我想你可以从中间的某个地方取一条射线,然后旋转它,并按照它扫过它们的顺序对这些点进行排序。这就是我对极坐标的理解。但是如何选择原点比我想象的要复杂一些。也许最好从集合中的任何点开始沿着包含该点的矩形的一侧移动,直到到达集合中的另一个点,等等。
  • 我已经编辑了我的答案以包含更好的积分排序方式。
【解决方案2】:

如果您需要计算矩形的并集,这就是计算几何中通常所说的“合并”操作。它通常可以通过扫描线算法轻松实现。

扫线方法通常需要可观的初始投资:实施扫线引擎。完成后,引擎可以立即用于轻松地对输入几何实现任何面向集合的操作,例如“合并”、“与”、“或”、“差异”等。

http://en.wikipedia.org/wiki/Boolean_operations_on_polygons

同时,为面向轴的(等轴测)几何实现扫描线引擎是一项相当简单的任务。在您需要处理大量输入的情况下,即矩形数量相对较多时,这将是最佳方法。其他答案中提到的各种基于边缘遍历的方法仅适用于相对较小的输入。

【讨论】:

  • 这是实际解决问题的最有用的答案。虽然我没有找到任何现有的算法来做我想做的事,但通过查看several different variations 来适应扫描线方法是相对简单的。谢谢!
猜你喜欢
  • 2012-04-30
  • 2015-07-13
  • 2014-09-22
  • 1970-01-01
  • 2017-12-24
  • 2011-01-28
  • 1970-01-01
  • 2020-11-02
  • 2010-10-16
相关资源
最近更新 更多