MATLAB中Surf图的面积计算
我有不规则的三维笛卡尔坐标,它构成了球体表面的八分之一。多亏了Benoit_11,曲面现在可以在MATLAB cftool之外的普通命令行脚本中绘制 从这一点开始,我一直在尝试使用以下代码计算曲面的面积,这些代码是从该区域内的其他答案拼凑而成的。代码基本上从生成曲面的顶点计算面积,然后将它们相加生成一个面积MATLAB中Surf图的面积计算,matlab,plot,area,surface,Matlab,Plot,Area,Surface,我有不规则的三维笛卡尔坐标,它构成了球体表面的八分之一。多亏了Benoit_11,曲面现在可以在MATLAB cftool之外的普通命令行脚本中绘制 从这一点开始,我一直在尝试使用以下代码计算曲面的面积,这些代码是从该区域内的其他答案拼凑而成的。代码基本上从生成曲面的顶点计算面积,然后将它们相加生成一个面积 surface = [ansx1,ansy1,ansz1]; [m,n] = size(zdata1); area = 0; for i = 1:m-1 for j = 1:n-
surface = [ansx1,ansy1,ansz1];
[m,n] = size(zdata1);
area = 0;
for i = 1:m-1
for j = 1:n-1
v0_1 = [xdata1(i,j) ydata1(i,j) zdata1(i,j) ];
v1_1 = [xdata1(i,j+1) ydata1(i,j+1) zdata1(i,j+1) ];
v2_1 = [xdata1(i+1,j) ydata1(i+1,j) zdata1(i+1,j) ];
v3_1 = [xdata1(i+1,j+1) ydata1(i+1,j+1) zdata1(i+1,j+1)];
a_1= v1_1 - v0_1;
b_1 = v2_1 - v0_1;
c_1 = v3_1 - v0_1;
A_1 = 1/2*(norm(cross(a_1, c_1)) + norm(cross(b_1, c_1)));
area = area + A_1;
end
end
fprintf('\nTotal area is: %f\n\n', area);`
然而,我遇到的问题是,计算出的曲面高估了可能的曲面。这是因为从原始矩阵中删除了NaN,并将其替换为0,结果如图1所示。图2提供了我想要计算的唯一区域
在计算生成图1的数据的表面积所提供的代码中,是否有人可以忽略零
提前感谢我想你只需要检查一个字段的四个点中是否有一个等于零 那么这个呢:
% example surface
[X,Y,Z] = peaks(30);
% manipulate it
[lza, lzb] = size(Z);
for nza = 1:lza
for nzb = 1:lzb
if Z(nza,nzb) < 0
Z(nza,nzb) = Z(nza,nzb)-1;
else
Z(nza,nzb) = 0;
end
end
end
surfc(X,Y,Z)
% start calculating the surface area
A = 0;
lX = length(X);
lY = length(Y);
for nx = 1:lX-1
for ny = 1:lY-1
eX = [X(ny,nx) X(ny,nx+1)
X(ny+1,nx) X(ny+1,nx+1)];
eY = [Y(ny,nx) Y(ny,nx+1)
Y(ny+1,nx) Y(ny+1,nx+1)];
eZ = [Z(ny,nx) Z(ny,nx+1)
Z(ny+1,nx) Z(ny+1,nx+1)];
% check the field
if eZ(1,1)==0 || eZ(1,2)==0 || eZ(2,1)==0 || eZ(2,2)==0
continue
end
% take two triangles, calculate the cross product to get the surface area
% and sum them.
v1 = [eX(1,1) eY(1,1) eZ(1,1)];
v2 = [eX(1,2) eY(1,2) eZ(1,2)];
v3 = [eX(2,1) eY(2,1) eZ(2,1)];
v4 = [eX(2,2) eY(2,2) eZ(2,2)];
A = A + norm(cross(v2-v1,v3-v1))/2;
A = A + norm(cross(v2-v4,v3-v4))/2;
end
end
%示例曲面
[X,Y,Z]=峰值(30);
%操纵它
[lza,lzb]=尺寸(Z);
对于nza=1:lza
对于nzb=1:lzb
如果Z(nza,nzb)<0
Z(nza,nzb)=Z(nza,nzb)-1;
其他的
Z(nza,nzb)=0;
结束
结束
结束
表面粗糙度(X,Y,Z)
%开始计算表面积
A=0;
lX=长度(X);
lY=长度(Y);
对于nx=1:lX-1
对于ny=1:lY-1
eX=[X(ny,nx)X(ny,nx+1)
X(ny+1,nx)X(ny+1,nx+1)];
eY=[Y(ny,nx)Y(ny,nx+1)
Y(ny+1,nx)Y(ny+1,nx+1)];
eZ=[Z(ny,nx)Z(ny,nx+1)
Z(ny+1,nx)Z(ny+1,nx+1)];
%检查场地
如果eZ(1,1)==0 | | eZ(1,2)==0 | | eZ(2,1)==0 | | eZ(2,2)==0
持续
结束
%取两个三角形,计算叉积得到表面积
%把它们加起来。
v1=[eX(1,1)eY(1,1)eZ(1,1)];
v2=[eX(1,2)eY(1,2)eZ(1,2)];
v3=[eX(2,1)eY(2,1)eZ(2,1)];
v4=[eX(2,2)eY(2,2)eZ(2,2)];
A=A+norm(交叉(v2-v1,v3-v1))/2;
A=A+norm(交叉(v2-v4,v3-v4))/2;
结束
结束
曲面的所有部分(正方形、三角形等),如果您知道坐标。你可以用交叉法计算。当然,你必须记住三角效应是投影的。