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
MATLAB中Surf图的面积计算_Matlab_Plot_Area_Surface - Fatal编程技术网

MATLAB中Surf图的面积计算

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-

我有不规则的三维笛卡尔坐标,它构成了球体表面的八分之一。多亏了Benoit_11,曲面现在可以在MATLAB cftool之外的普通命令行脚本中绘制

从这一点开始,我一直在尝试使用以下代码计算曲面的面积,这些代码是从该区域内的其他答案拼凑而成的。代码基本上从生成曲面的顶点计算面积,然后将它们相加生成一个面积

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;
结束
结束
曲面的所有部分(正方形、三角形等),如果您知道坐标。你可以用交叉法计算。当然,你必须记住三角效应是投影的。