Surface area from a z-matrix
古いコメントを表示
I have x, y axis values and corresponding z values. This allows me to plot the shape using surf function. Example:-
How to calculate surface area of this irregular shape?
Please i'm a novice learning this stuff, i have come along quite well since last week or two. Thank you for all your help. The other answers provided before for irregular shapes have me confused, since i don't know how to triangulate.
Additionally i also want to calculate surface area above a certain height. So i'll cut all the values below a certain height and then possibly calculate surface area above a cut-off height.
Edit:
Thanks to inputs by the community and basically whole programme written by Richard. Here's the code.
function sa(Z, cutoff)
%Credit: Richard Brown, MATLAB central forum (http://www.mathworks.com/matlabcentral/answers/)
dx=0.092; % x-axis calibration
dy=0.095; % y-axis calibration
[m, n] = size(Z);
areas = 0.5*sqrt((dx*dy)^2 + (dx*(Z(1:m-1,2:n) - Z(1:m-1,1:n-1))).^2 + ...
(dy*(Z(2:m,1:n-1) - Z(1:m-1,1:n-1))).^2) + ...
0.5*sqrt((dx*dy)^2 + (dx*(Z(1:m-1,2:n) - Z(2:m,2:n))).^2 + ...
(dy*(Z(2:m,1:n-1) - Z(2:m,2:n))).^2);
zMean = 0.25 * (Z(1:m-1,1:n-1) + Z(1:m-1,2:n) + Z(2:m,1:n-1) + Z(2:m,2:n));
areas(zMean <= cutoff) = 0;
surfaceArea = sum(areas(:));
sprintf('Total surface area is %2.4f\n', surfaceArea)
return
end
1 件のコメント
Richard Brown
2013 年 7 月 15 日
編集済み: Richard Brown
2013 年 7 月 15 日
I've just had it pointed out to me that there is a small mistake in this code. Assuming that x corresponds to columns, and y to rows, then the first two lines (but not the second two lines) of the areas calculation has dx and dy backwards. I've fixed it in my original answer below.
採用された回答
その他の回答 (3 件)
Walter Roberson
2012 年 4 月 15 日
1 投票
I do not know if you will be able to calculate the surface area of the regular shape interspersed with the irregular tops. When I look at the image with the irregular tops, it looks to me as if the tops are fairly irregular, possibly even fractal. I don't know if a meaningful surface area could be calculated: the surface area of a fractal is infinite.
For the first figure, I can think of a crude way to find the area, but I think there are simpler ways. I would need to think further about good ways to find the area. But to cross-check: are your x and y regularly spaced, or irregularly ?
7 件のコメント
bobby
2012 年 4 月 15 日
Walter Roberson
2012 年 4 月 15 日
Sorry, I do not recognize "alienate" in that context? "isolate" perhaps?
If you are dealing with a surface that is literally fractal, then the surface area is infinite.
bobby
2012 年 4 月 15 日
Sean de Wolski
2012 年 4 月 16 日
How long is the coast of England?
bobby
2012 年 4 月 16 日
Sean de Wolski
2012 年 4 月 16 日
I wasn't commenting on Richard's script at all, but rather the fractal nature of surface area (and length) of irregular shapes. I apologize if that came across the wrong way.
http://www.google.com/#hl=en&gs_nf=1&cp=19&gs_id=1k&xhr=t&q=how+long+is+the+coast+of+britain&fp=46b06bf633a62cc4
bobby
2012 年 4 月 16 日
Richard Brown
2012 年 4 月 16 日
If your data is smooth enough (assuming that's what you're after), then there is a really quick way to work out approximately the surface area, using the normals that Matlab computes when plotting the surface. To make it simple I'll assume you have a uniform grid with spacings dx and dy.
dA = dx * dy;
h = surf( ... )
N = get(h, 'VertexNormals');
N_z = squeeze(N(:, :, 3));
% Normalise it
N_z = N_z ./ sqrt(sum(N.^2, 3));
Area = dA * sum(1./N_z(:));
3 件のコメント
Richard Brown
2012 年 4 月 16 日
You *need* to smooth this first though, and the solution will only be approximate (probably to about 2sf). Otherwise you'd need to calculate the surface area of an interpolant, which would be a bit more effort intensive
bobby
2012 年 4 月 16 日
Richard Brown
2012 年 4 月 16 日
Hence my comment about smoothing - if you apply that straight to the mesh you've got there, all bets are off! Anyway, see my next answer, it might be more in line with what you're after.
bobby
2012 年 4 月 16 日
3 件のコメント
Richard Brown
2012 年 4 月 17 日
I think you may have slightly misunderstood some of my earlier answers - you don't need to have any loops at all. All you should need to do is:
areas = 0.5*sqrt((dx*dy)^2 + (dx*(Z(1:m-1,2:n) - Z(1:m-1,1:n-1))).^2 + ...
(dy*(Z(2:m,1:n-1) - Z(1:m-1,1:n-1))).^2) + ...
0.5*sqrt((dx*dy)^2 + (dx*(Z(1:m-1,2:n) - Z(2:m,2:n))).^2 + ...
(dy*(Z(2:m,1:n-1) - Z(2:m,2:n))).^2);
zMean = 0.25 * (Z(1:m-1,1:n-1) + Z(1:m-1,2:n) + Z(2:m,1:n-1) + Z(2:m,2:n))
areas(zMean > cutoff) = 0;
surfaceArea = sum(areas(:));
And that should run pretty fast
bobby
2012 年 4 月 17 日
bobby
2012 年 4 月 17 日
カテゴリ
ヘルプ センター および File Exchange で Surface and Mesh Plots についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!