【问题标题】:Area Calculation of Surf plot in MATLABMATLAB中Surf图的面积计算
【发布时间】:2015-11-05 11:16:50
【问题描述】:

我有不规则的 3D 笛卡尔坐标,占球体表面的八分之一。感谢 Benoit_11 Answer to a previously posed question 现在可以在 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 的数据的表面积?

提前致谢

【问题讨论】:

  • 曲面的所有部分(正方形、三角形等)如果您知道坐标。您可以使用交叉方法进行计算。当然,你必须记住,三角效应是射影的。 en.wikipedia.org/wiki/Cross_product

标签: matlab plot area surface


【解决方案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

【讨论】:

    猜你喜欢
    • 2017-09-04
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多