参考
效果图

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