voronoi图代码流程
voronoi图代码流程
1.通过lcg随机算法生成指定数量的随机坐标点;
2.用超级三角形的点填充点、线、面三层结构的数据。
2.1将这些坐标点相连构建顺时针三角形结构。
通过三角形AB叉乘BC边的结果正负来纠正三角形三个顶点为顺时针;
2.2找出所以三角形的共边。
找对边是为了方便后续判断对边的三角是否在外接圆内。
通过三角形顶点是顺时针顺序,共享的边彼此反向。
4.将共边且不满足外接圆不含另个三角的三角形进行翻转共享变,从而转为delaunay三角。
4.1遍历所有顶点,每找出某点p在存在于另一个三角内部时,将其进行分割三个小三角。
4.2在本次遍历step中,遍历绕点p的三角,汇总p相对的边的三角形。
4.3在本次遍历step中,分别判断p相对的边的每个三角形的外接圆是否包含点P,如果包含,则翻转共边。翻转共边后,重新记录p相对的边的三角形。
如何判断三角形的外接圆是否包含点P(见ShouldFlipEdgeStable函数),且如何翻转共边(见FlipTriangleEdge函数):
如果三角形A的外接圆包含共边的三角形B,那共边两侧的角v1v3v2 + 角v1pv2 >= 180度
(cos_a >= 0f && cos_b >= 0f)表示角v1v3v2和角v1pv2都是锐角(或直角,直角下方会提到),它们之和不可能>=180度,所以不满足三角形A的外接圆包含共边的三角形B。
(cos_a < 0f && cos_b < 0f)表示角v1v3v2和角v1pv2都是钝角,它们之和>=180度,即满足三角形A的外接圆包含共边的三角形B。
这就需要取消原本的共边,改为v3p作为新的共边,来调整原本两个三角形的形状(构建了新的两个三角)。从而达到外接圆的的位置和大小也变了。
但如果原本是三角形构建的是正方形,翻转也没有用,所以(cos_a >= 0f && cos_b >= 0f)是包含等号,不做翻转操作。
4.4完成所有顶点的遍历后,移除超级三角,剩下的基本所有的点都是delaunay三角了。(出现共边的两个三角构成正方形除外,遇到则就当是delaunay三角而放过。)
5.生成voronoi图。
5.1遍历所有三角形。以三角形的是三个顶点坐标找出所有外接圆的圆心坐标,并以该三角形的三边的临接三角的外接圆圆心坐标进行连线(可见TryAddVoronoiEdgeFromTriangleEdge函数)