通过一组多边形将平面细分为非重叠区域

时间:2014-04-09 14:25:35

标签: algorithm computational-geometry

请参阅示例图片:

enter image description here

平面中有一组多边形(凸面,非凸面,但不是自相交)。 多边形由顶点定义 - 点( x y 坐标,笛卡尔坐标系)。

多边形示例集:

  • 第一个多边形是A,B,C。
  • 第二个多边形是D,E,F,G,H,I,J。
  • 第三个多边形是K,L,M,N。
  • 第四个多边形是O,P,Q。

多边形将平面划分为多个区域。多边形的某些部分可能重叠(如第一个和第二个多边形,第二个多边形和第三个多边形)。这种重叠部分也是分开的区域。一些多边形可能在其他内部(如第二个多边形内的第四个多边形)。

细分后的示例区域:蓝色,粉红色,绿色,橙色,棕色和紫色。

我想简单来说,这个平面是一个具有常数 x y 坐标的矩形。

目标

通过查询点检测区域(蓝色,粉红色,绿色等)。

我正在寻找具有这些假设的平面细分的算法和数据结构。

2 个答案:

答案 0 :(得分:2)

首先通过迭代地寻找成对交叉点并将交叉多边形对替换为它们的交点和原始多边形减去交点,将多边形集转换为一组非重叠多边形。如果您首先将每个多边形拆分为一组凸多边形(凸多边形可以简单地“继承”原始凹多边形的“颜色”),这可能会更容易,更快。

然后,您可以将多边形放入四叉树或类似的数据结构中,这样您就可以快速选择候选多边形作为给定查询点的成员资格测试。

您需要定义在多个多边形之间共享的边上发生的事情。

答案 1 :(得分:2)

我可以推荐梯形分解http://en.wikipedia.org/wiki/Point_location#Trapezoidal_decomposition,以便在平面细分中进行有效的点查询。

在您的情况下,细分是间接定义的,因此还有一个额外的步骤。您可以尝试三种方法:

1)使用您将逐步调用的一般多边形交集算法

2)形成多边形的梯形分解并执行这些梯形图的融合,

3)修改现有的梯形分解算法,使其接受由重叠多边形组成的细分作为输入。

您将需要使用一些2D计算几何库...和勇气。

ALTERNATIVE:

如果您的精度要求不是太高,请使用位图并填充每个多边形,在满足已经绘制的像素时更改颜色。