Delaunay三角剖分是对点集进行操作,得到的是一个由三角形组成的平面,三角形没有重叠,而这个平面的外围就是点集的图包。Delaunay三角剖分后的结果是唯一的,因为其中有一个思想就是让三角形的最小角最大化,所以需要不断的进行调整。Delaunay三角剖分的结果和Voronia图的结果是互偶(貌似是这种说法),就是两组结果里面的线段对应垂直。
书里面用的是随机增量的方法,
首先找到一个足够打的三角形把所有的点包围起来。这个三角形为((3m,0), (-3m, -3m), (0,3m)), 其中m = 所有点的x和y值的最大的一个值(当然比的是绝对值);
Delaunay:
P = 所有点集的随机排列;
T = {((3m,0), (-3m, -3m), (0,3m))};for pr in P:
在T中找出pi所在的三角形t(pi,pj,pk), pipjpk为t的三个点。
if pr on the edge of t: //假设是边pipj
//设三角形pipjpl和pipjpk共享边pipj的三角形
链接prpk,prpl,//形成了4个小三角形
legalized(pr,pipl,T)
legalized(pr,plpj, T)
legalized(pr, pjpk, T)
legalized(pr,pkpi, T)
//leglized函数,其实就是判断pr的四条对边是否合法
else if pr in t:
分别连接pr和abc,这样得到三个小三角形,;
//依次判断三个小三角形是否合法;即,添加的三条边是否合法
legalized(pr,pipj,T)
legalized(pr,pjpk, T)
legalized(pr, pkpi, T)
将和足够大的三角形有连接的三角形都删除掉,
legalizedEdge(pr, pipj, T):调整三角形,让最小角最大化
if (pipj是非法的):
翻转pipj,得到边prpk // prpk为prpipjpk组成的四边行的另外一条对边。
LegalizedEdge(pr, pipk, T)
LegalizedEdge(pr, pjpk, T)