我正在寻找一种算法,该算法可以将包含一组非重叠凸多边形的区域作为输入,并将多边形外部的空间分解为一组非重叠的凸四边形。四边形需要具有它们(单独)使用尽可能多的水平空间的属性。
这是输入:
这是所需的输出:
我觉得我已经看到这个算法的一些变化,用于计算在非常旧的绘画程序中充满洪水的区域。有没有比O(n^2)
时间更好的方式来做到这一点?
编辑:我意识到输出中有一些三角形。我应该说四边形是理想的输出,只有当物理上不可能使用四边形时才会回到三角形。
答案 0 :(得分:1)
我想出了一个解决方案。为了有效地解决这个问题,需要某种空间数据结构以便查询哪些多边形与给定的矩形区域重叠。我使用了Quadtree。使用多边形数据结构也必须能够区分内部和外部边缘。如果两个多边形共有边,则边是内部。
步骤如下(假设坐标系的原点位于左上角):
(y0, y1)
,声明一个矩形区域a
左上角(0, y0)
和右下角
(width, y1)
。确定多边形S
的集合
通过查询空间数据结构与a
重叠。对于
p
中的每个多边形S
,确定E
的边p
的边集
与a
重叠的。为获得最佳效果,请忽略任何边缘
E
normal直接向上或向下指向的e
。对于每一个
E
中的边e
,然后需要确定这对
a
与a
的顶部和底部边缘相交的点。
这是通过简单的line intersection测试实现的,
将L0 = (0, y0) → (0, y1)
的顶部和底部边缘视为简单的水平
线段。加入交叉点来创建一组
新的细分市场,以红色显示:L1 = (width, y0) → (width, y1)
和
L0
。从左到右工作,
将前一步骤中创建的任何线段聚合成对,
忽略从内部边创建的任何线段。
如果没有相交的外边缘,那么只有两个
边缘将是L1
和const languages = [
{
name: 'English',
icon: './assets/images/flags/uk.png',
link: ''
},
{
name: 'Español',
icon: './assets/images/flags/Spain.png',
link: ''
},
{
name: 'Français',
icon: './assets/images/flags/France.png',
link: ''
}
];
。在这个示例条中,只有四个
边缘仍然存在: