从边界切割矩形

时间:2015-02-09 14:03:57

标签: geometry

从边界提取矩形有什么好方法? 我已经有了一些工作,但它有一些错误,有些东西处理得更先进,然后需要,所以我想重新开始。

这就是我想要的:

enter image description here

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

我的边界为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;

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

请帮忙。

1 个答案:

答案 0 :(得分:0)

使用轴对齐的矩形会使一些细节更容易但不影响通用算法,因此我不会对轴对齐做出进一步的假设。

用于减去简单多边形的方法与所描述的用于查找描述here的多边形的一个小变化的交集相同。此外,该答案假设多边形是凸的(实际上是矩形),因此交叉点最多只有一个多边形。在当前情况下,可能会产生多个多边形。但是,找到多个多边形并不困难,请参阅下面的评论。

在交叉点问题中,多边形都是逆时针方向,这是一种指定(按照惯例)线的哪一边在多边形内的方法。如果我们反转要减去的矩形的方向,那么按照惯例,平面的全部是"内部"多边形,除了边缘右边的小区域。因此,减去多边形实际上是多边形的交叉点,其中要减去的多边形是从里面翻出来的!

<强>注释:

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