簡體   English   中英

計算 3D 表面給定點坐標的面積

[英]Compute area of 3D surface given coordinates of points

給定每個點的坐標,如何計算MATLAB中的三維面的面積?

x=-5:1:5;y=-5:1:5;
[xx,yy]=meshgrid(x,y);zz=Z;
figure(1)
mesh(xx,yy,zz) 
figure(2)
xb=-5:0.25:5;
yb=-5:0.25:5;
[xxb,yyb]=meshgrid(xb,yb);
zzb=interp2(xx,yy,zz,xxb,yyb,'cubic');
mesh(xxb,yyb,zzb)

以上是我的代碼。

在此處輸入圖像描述

圖片是z的數據。

我試圖搜索類似的問題,但就是找不到。

嘗試將其轉換為AlphaShape然后使用SurfaceArea

1.- alphaShape不適用於這個問題,因為這個特定的表面是開放的。

alphaShape生成 2D 或 3D封閉 POLYGONS

這是第一個表面

x=-5:1:5;y=-5:1:5;
[xx,yy]=meshgrid(x,y);

zz=[13.6 -8.2 -14.8 -6.6 1.4 0 -3.8 1.4 13.6 16.8 0 
-8.2 -15.8 -7.9 2.2 3.8 0 0.6 7.3 10.1 0 -16.8 
-14.8 -7.9 2.5 5.8 2.3 0 2.7 5.1 0 -10.1 -13.7 
-6.6 2.2 5.9 3.0 -0.3 0 1.9 0 -5.1 -7.3 -1.4 
1.4 3.8 2.3 -0.3 -0.9 0 0 -1.7 -2.7 -0.6 3.8 
0 0 0 0 0 0 0 0 0 0 0 
-3.8 0.6 2.7 1.7 0 0 0.9 0.3 -2.3 -3.8 -1.4 
1.4 7.3 5.1 0 -1.7 0 0.3 -3.1 -5.8 -2.2 6.6 
13.6 10.1 0 -5.1 -2.7 0 -2.3 -5.8 -2.5 7.9 14.8 
16.8 0 -10.1 -7.3 -0.6 0 -3.8 -2.2 7.9 15.8 8.2 
0 16.3 -13.6 -1.4 3.8 0 -1.4 6.6 14.8 8.2 -13.6];

figure(1)
sh1=mesh(xx,yy,zz) 

在此處輸入圖像描述

這是第二個表面

figure(2)
xb=-5:0.1:5;
yb=-5:0.1:5;
[xxb,yyb]=meshgrid(xb,yb);
zzb=interp2(xx,yy,zz,xxb,yyb,'cubic');
mesh(xxb,yyb,zzb)

在此處輸入圖像描述

現在在第一個表面上嘗試alphaShape

P1=[xx(:) yy(:) zz(:)];
shp1 = alphaShape(P1(:,1),P1(:,2),P1(:,3));
figure;
plot(shp1)
axis equal

瞧:這是裝置

在此處輸入圖像描述

並在嘗試時

A1=area(shp1)

砰:

Error using alphaShape/area
This method is only applicable to 2D alpha shapes.

2.-必須整合每個平面。

每個平面的頂點都可以使用mesh中可用的手柄

sh1=mesh(xx,yy,zz) 

檢查簡化的屬性

sh1 = 
  Surface with properties:

   EdgeColor: 'flat'
   LineStyle: '-'
   FaceColor: [1 1 1]
FaceLighting: 'none'
   FaceAlpha: 1
       XData: [11×11 double]
       YData: [11×11 double]
       ZData: [11×11 double]
       CData: [11×11 double]

單擊命令 Window中刪節屬性后Show all properties以讀取所有屬性

          AlignVertexCenters: off
                   AlphaData: 1
            AlphaDataMapping: 'scaled'
             AmbientStrength: 0.300000000000000
                  Annotation: [1×1 matlab.graphics.eventdata.Annotation]
            BackFaceLighting: 'reverselit'
                BeingDeleted: off
                  BusyAction: 'queue'
               ButtonDownFcn: ''
                       CData: [11×11 double]
                CDataMapping: 'scaled'
                   CDataMode: 'auto'
...

           VertexNormals: [11×11×3 double]
       VertexNormalsMode: 'auto'
                 Visible: on
                   XData: [11×11 double]
               XDataMode: 'manual'
             XDataSource: ''
                   YData: [11×11 double]
               YDataMode: 'manual'
             YDataSource: ''
                   ZData: [11×11 double]
             ZDataSource: ''

3.-好消息:Mathworks 文件交換中,有一個名為 surfarea 的surfarea ,感謝 Sky Santorius,它完全完成了第 2 點中提到的任務,這正是石 sh 所要求的。

surfarea可在以下鏈接中找到:

https://uk.mathworks.com/matlabcentral/fileexchange/62992-surface-area?s_tid=srchtitle_surface%20area_2

將表面應用於第一個表面

[A1,cell_areas_A1,centroid1]=surfarea(xx,yy,zz);

所得表面積為

A1 =
     6.783763291711880e+02

並且在計算插值的第二個表面的面積時

[A2,cell_areas_A2,centroid2]=surfarea(xxb,yyb,zzb);

所得表面積為

A2 =
     6.504878453848488e+02

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM