Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delaunay三角剖分在matlab中的实现_Matlab_Delaunay - Fatal编程技术网

Delaunay三角剖分在matlab中的实现

Delaunay三角剖分在matlab中的实现,matlab,delaunay,Matlab,Delaunay,你好,这是我在这里的第一篇文章。我想为Delaunay三角剖分编写matlab脚本。这是我的剧本: clear all;clc %% Delaunay x=[ 160.1671 366.9226 430.7894 540.1208 660.2771 508.7287 252.1787]; y=[ 223.9615 259.5000 120.5769 245.5000 283.1923 472.7308 469.5000]; % x=x'; y=y'; %orginal plot dd=del

你好,这是我在这里的第一篇文章。我想为Delaunay三角剖分编写matlab脚本。这是我的剧本:

clear all;clc
%% Delaunay
x=[ 160.1671 366.9226 430.7894 540.1208 660.2771 508.7287 252.1787];
y=[ 223.9615 259.5000 120.5769 245.5000 283.1923 472.7308 469.5000];

%
x=x';
y=y';

%orginal plot
dd=delaunay(x,y);
dt=TriRep(dd,x,y);
triplot(dt);
z=[x.^2+y.^2]
i=1:length(x);
ptk=[i' x y]
%% main loop
l=0;
for i=1:length(x)-2
for j=1+i:length(x)
    for k=1+i:length(x)
        if (j ~= k)
            l=l+1;
            xn = (y(j)-y(i))*(z(k)-z(i)) - (y(k)-y(i))*(z(j)-z(i));
            yn = (x(k)-x(i))*(z(j)-z(i)) - (x(j)-x(i))*(z(k)-z(i));
            zn = (x(j)-x(i))*(y(k)-y(i)) - (x(k)-x(i))*(y(j)-y(i));
                if (zn < 0)
                    border=zn;
                        for m=1:length(x)
                            border = (border) & ...
                                ((x(m)-x(i))*xn +...
                                (y(m)-y(i))*yn +...
                                (z(m)-z(i))*zn <= 0);
                            if (border) 
                            ii(m)=[i];
                            jj(m)=[j];
                            kk(m)=[k];
                            end
                        end
                end
        end
    end
end
end
wart=[ii' jj' kk']
dd
figure(2)
triplot(wart,x,y)
这是我从实施中得到的:

wart =
 4     7     6
 4     7     5
 4     7     5
 4     7     5
 4     7     5
 4     6     5
 4     6     5
你们谁能告诉我这有什么问题吗?哪里有错误或只是简单地指引我


jils.

问题在您最内心的循环中,这里:

if (zn < 0)
                border=zn;
                    for m=1:length(x)
                        border = (border) & ...
                            ((x(m)-x(i))*xn +...
                            (y(m)-y(i))*yn +...
                            (z(m)-z(i))*zn <= 0);
                        if (border) 
                        ii(m)=[i];
                        jj(m)=[j];
                        kk(m)=[k];
                        end
                    end
            end

您可以从一个空输出([])开始并附加(使用
end+1
),或者计算三角形的最大数量并将输出预分配到该大小,使用计数器变量跟踪找到的三角形数量并将其放在输出数组中的正确位置,然后将输出修剪到末尾的正确大小。如果您计划使用更大的输入数据集,最好预先分配。

注释对于理解语义级别的代码至关重要。例如:您正在用一个负的双精度值初始化边框,但随后它被用作逻辑值。初始化
border=false
也会产生同样的效果。我想是这样的。我正在编写这个C程序的matlab脚本:然而,这个脚本在delaunay函数和C程序之间产生了差异。Java中也有类似的实现:@jiksu:
border=(zn<0)是c代码的正确翻译。这非常有用。我已经按照你的指示得到了三角形。第二个问题是如何删除我不需要的内部行。在这里,我没有主意了。
if (zn < 0)
                border=zn;
                    for m=1:length(x)
                        border = (border) & ...
                            ((x(m)-x(i))*xn +...
                            (y(m)-y(i))*yn +...
                            (z(m)-z(i))*zn <= 0);
                        if (border) 
                        ii(m)=[i];
                        jj(m)=[j];
                        kk(m)=[k];
                        end
                    end
            end
 border = (x-x(i)).*xn + (y-y(i)).*yn + (z-z(i)).*zn;
 if all(border<0)
    % then store coordinates
 end