【问题标题】:Cut rectangles from boundary从边界切割矩形
【发布时间】:2015-02-11 03:56:13
【问题描述】:

从边界中提取矩形的好方法是什么? 我已经有一些东西在工作,但是它有一些错误,而且有些东西处理得比需要的更高级,所以我想重新开始。

这就是我想要的:

请注意,在右侧,边界被切割成多个形状。

我的边界是float[][],如 [nOfPoints][xy]。 比如:

[0][0] = 10;
[0][1] = 10;
[1][0] = 100;
[1][1] = 10;
[2][0] = 100;
[2][1] = 100;
[3][0] = 10;
[3][1] = 100;
[4][0] = 10;
[4][1] = 10;

会形成一个矩形。如果任何其他格式更合适,那么我可以更改它。无论如何,我对抽象方法更感兴趣,而不是详细描述它。

请帮忙。

【问题讨论】:

  • 你的矩形总是轴对齐吗?
  • 我会在一天内考虑一下,但我不确定你能比做一个 2d 布尔值做得更好。我已经为交叉点写了这个摘要:stackoverflow.com/questions/8011267/…。减法的方法是相似的,但有一个复杂的情况是结果可能不是单个多边形,例如如果你从一个大正方形的中心减去一个小正方形。
  • 谢谢,即使知道术语 2d boolean 也有很大帮助。

标签: geometry


【解决方案1】:

具有轴对齐的矩形会使一些细节更容易,但不会影响一般算法,所以我不会对轴对齐做进一步的假设。

简单多边形相减的方法与here 中描述的求多边形交集的方法相同,只是稍作改动。此外,该答案假设多边形是凸的(实际上是矩形),因此最多有一个多边形是由相交产生的。在当前情况下,可能会产生多个多边形。但是,找到多个多边形并不难,请参见下面的 cmets。

在相交问题中,多边形都是逆时针方向的,这是一种(按照惯例)指定线的哪一侧在多边形内的方法。如果我们反转要减去的矩形的方向,那么按照惯例,所有平面都在多边形“内部”,除了边缘右侧的一小块区域。因此多边形的减法实际上是多边形的交集,其中要减去的多边形是由里向外翻转的!

评论:

  • 从非凸多边形中减去凸多边形可能会产生多个多边形。找到哪个多边形取决于起始交点。如果跟踪一个结果多边形时消耗的交点,则可以对未消耗的交点重复该过程,每次都找到更多的结果。
  • 如果路口发生在拐角处,事情可能会变得混乱。一种方法是在逻辑上将交叉点分成多个逻辑交叉点,每个逻辑交叉点代表一个合法遍历。
  • 两个多边形的段可能是并发的,尤其是在 OP 的情况下。这些片段可以作为预处理的一部分被剔除。如果它们在相反的方向上,它们代表被外部包围的无限薄的内部部件,如果它们在相同的方向上,它们代表被内部包围的无限薄的外部。无论哪种方式,它们都可能被丢弃。
  • 之前的评论可能看起来很奇怪,因为在丢弃重叠段后,布尔值不再位于多边形之间,但该算法只要求实体的方向正确。因此,这种通用方法可用于对具有曲线的多边形进行切片,将片段保持在一侧或另一侧。
  • 多边形的减法可能会导致对象不是简单的多边形。如果要减去的多边形完全位于另一个多边形内,则结果可能是一个带有洞的区域。如果这值得关注,您可以考虑使用稍微复杂的结构来表示使用多个循环来定义边界的区域。区域的外环应为逆时针方向,内环应为顺时针方向。

【讨论】:

  • 感谢您的大力回答。我还没有时间阅读,但我现在非常感谢!
猜你喜欢
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 2012-04-29
  • 2014-09-22
  • 2011-04-26
  • 1970-01-01
相关资源
最近更新 更多