Delaunay三角剖分
code
function Delaunary(pt)
% 生成三角面片点云
edgeHull=ConvexHull(pt);
figure,plot(pt(:,1),pt(:,2),'b.'),axis equal,hold on
triout=[];
newIndex = -1;
len = 1;len1= 1;
index = 1;
while index <= length(edgeHull)
edge = edgeHull(index);
index = index + 1;
len = length(edgeHull);
len1= length(triout);
dex = [edge.start edge.end];
% 判断左三角形是否存在,存在,则判断右三角行
if edge.lefttri == -1
newIndex = -1; % 新选取点索引
angle12Max = 0; angle23Max = 0;
vector1 = [pt(dex(2),1) - pt(dex(1),1), pt(dex(2),2) - pt(dex(1),2)];
for j = 1 : num
if j ~= dex(1) && j ~= dex(2) % 排除边的端点
vector2 = [pt(j,1) - pt(dex(1),1), pt(j,2) - pt(dex(1),2)];
if vector1(1) * vector2(2) > vector1(2) * vector2(1) % 点j在vector1的左侧
vector3 = [pt(j,1) - pt(dex(2),1), pt(j, 2) - pt(dex(2),2)];
v1Len = norm(vector1); v2Len = norm(vector2); v3Len = norm(vector3);
angle12 = acos(dot(vector1, vector2) / (v1Len * v2Len));
angle23 = acos(dot(vector2, vector3) / (v2Len * v3Len));
if angle23 > angle23Max
angle23Max = angle23;
angle12Max = angle12;
newIndex = j;
elseif angle23 == angle23Max && angle12 <= angle12Max
angle12Max = angle12;
newIndex = j;
end
end
end
end
if newIndex ~= -1 % 若找到一个满足要求的点
tri.a = dex(1);
tri.b = dex(2);
tri.c = newIndex;
tri.indexa = -1; % 第一个领接三角形索引
tri.indexb = -1;
tri.indexc = -1;
edge.lefttri = length(triout); % 设置边左侧三角形索引
isTriExist = 0;
% 记录边1
for k = 1 : length(edgeHull)
tempEdge = edgeHull(k);
if tempEdge.start == dex(1) && tempEdge.end == newIndex
tempEdge.righttri = length(triout);
tri.indexb = tempEdge.lefttri;
isTriExist = 1;
break;
elseif tempEdge.start == newIndex && tempEdge.end == dex(1)
tempEdge.lefttri = length(triout);
tri.indexb = tempEdge.righttri;
isTriExist = 1;
break;
end
end
% 若不存在这条边就新建一条边
if isTriExist == 0
newEdge.start = -1; newEdge.end = -1;
newEdge.lefttri = -1; newEdge.righttri = -1;
newEdge.start = newIndex;
newEdge.end = dex(1);
newEdge.lefttri = length(triout);
edgeHull = [edgeHull newEdge]; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%????
end
isTriExist = 0;
% 记录边2
for k = 1 : length(edgeHull)
tempEdge = edgeHull(k);
if tempEdge.start == newIndex && tempEdge.end == dex(2)
tempEdge.righttri = length(triout);
tri.indexa = tempEdge.lefttri;
isTriExist = 1;
break;
elseif tempEdge.start == dex(2) && tempEdge.end == newIndex
tempEdge.lefttri = length(triout);
tri.indexa = tempEdge.righttri;
isTriExist = 1;
break;
end
end
if isTriExist == 0
newEdge.start = -1; newEdge.end = -1;
newEdge.lefttri = -1; newEdge.righttri = -1;
newEdge.start = dex(2);
newEdge.end = newIndex;
newEdge.lefttri = length(triout);
edgeHull = [edgeHull newEdge];
end
tri.indexc = edge.righttri;
triout = [triout tri];
end
elseif edge.righttri == -1
newIndex = -1; % 新选取点索引
angle12Max = 0; angle23Max = 0;
vector1 = [pt(dex(2),1) - pt(dex(1),1), pt(dex(2),2) - pt(dex(1),2)];
for j = 1 : num
if j ~= dex(1) && j ~= dex(2) % 排除边的端点
vector2 = [pt(j,1) - pt(dex(1),1), pt(j,2) - pt(dex(1),2)];
if vector1(1) * vector2(2) < vector1(2) * vector2(1) % 点j在vector1的左侧
vector3 = [pt(j,1) - pt(dex(2),1), pt(j, 2) - pt(dex(2),2)];
v1Len = norm(vector1); v2Len = norm(vector2); v3Len = norm(vector3);
angle12 = acos(dot(vector1, vector2) / (v1Len * v2Len));
angle23 = acos(dot(vector2, vector3) / (v2Len * v3Len));
if angle23 > angle23Max
angle23Max = angle23;
angle12Max = angle12;
newIndex = j;
elseif angle23 == angle23Max && angle12 >= angle12Max
angle12Max = angle12;
newIndex = j;
end
end
end
end
if newIndex ~= -1 % 若找到一个满足要求的点
tri.a = dex(1);
tri.b = dex(2);
tri.c = newIndex;
tri.indexa = -1; % 第一个领接三角形索引
tri.indexb = -1;
tri.indexc = -1;
edge.righttri = length(triout); % 设置边左侧三角形索引
isTriExist = 0;
% 记录边1
for k = 1 : length(edgeHull)
tempEdge = edgeHull(k);
if tempEdge.start == newIndex && tempEdge.end == dex(1)
tempEdge.righttri = length(triout);
tri.indexb = tempEdge.lefttri;
isTriExist = 1;
break;
elseif tempEdge.start == dex(1) && tempEdge.end == newIndex
tempEdge.lefttri = length(triout);
tri.indexb = tempEdge.righttri;
isTriExist = 1;
break;
end
end
% 若不存在这条边就新建一条边
if isTriExist == 0
newEdge.start = -1; newEdge.end = -1;
newEdge.lefttri = -1; newEdge.righttri = -1;
newEdge.start = dex(1);
newEdge.end = newIndex;
newEdge.lefttri = length(triout);
edgeHull = [edgeHull newEdge]; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%????
end
isTriExist = 0;
% 记录边2
for k = 1 : length(edgeHull)
tempEdge = edgeHull(k);
if tempEdge.start == dex(2) && tempEdge.end == newIndex
tempEdge.righttri = length(triout);
tri.indexa = tempEdge.lefttri;
isTriExist = 1;
break;
elseif tempEdge.start == newIndex && tempEdge.end == dex(2)
tempEdge.lefttri = length(triout);
tri.indexa = tempEdge.righttri;
isTriExist = 1;
break;
end
end
if isTriExist == 0
newEdge.start = -1; newEdge.end = -1;
newEdge.lefttri = -1; newEdge.righttri = -1;
newEdge.start = newIndex;
newEdge.end = dex(2);
newEdge.lefttri = length(triout);
edgeHull = [edgeHull newEdge];
end
tri.indexc = edge.lefttri;
triout = [triout tri];
end
end
end
toc
%% figure the result
for i = 1 : length(triout)
dex=[triout(i).a, triout(i).b, triout(i).c,triout(i).a];
plot(pt(dex,1), pt(dex,2),'b-')
end
end
此文章版权归snailgoers所有,如有转载,请注明來自原作者
评论



