matlab,求不规则三维图形体积?

2025-03-03 18:23:40
推荐回答(1个)
回答1:

我咋看也是个光滑曲面呀,哪来的体积?当然假如xy面到曲面之间全被填充为实体,应该能用循环或积分计算每个xy单位面积上的曲顶柱体的体积,然后求和,我用循环尝试了下:

z=[

0.82        0.71        0.63        0.41        0.62

0.83        0.63        0.46        0.4        0.48

0.55        0.47        0.48        0.37        0.52

0.5        0.41        0.49        0.39        0.42

0.52        0.57        0.47        0.45        0.34];

 

x=[-1:0.5:1]

y=[-1:0.5:1]

surf(x,y,z);

shading interp;

for i=1:5

   for j=1:5 

       M(i,j)=z(i,j)*0.5*0.5(对于每个面积为0.5*0.5的小方格以上的曲顶柱体求体积)

   end

end

sum (sum(M))对体积数组(25个元素体积求和)结果如下:

M =

    0.2050    0.1775    0.1575    0.1025    0.1550

    0.2075    0.1575    0.1150    0.1000    0.1200

    0.1375    0.1175    0.1200    0.0925    0.1300

    0.1250    0.1025    0.1225    0.0975    0.1050

    0.1300    0.1425    0.1175    0.1125    0.0850

>> size(M)

ans =

     5     5

>> sum(M)

ans =

    0.8050    0.6975    0.6325    0.5050    0.5950

>> sum(ans)

ans =

    3.2350

楼主给的数据点太少,导致求曲顶柱体体积的此种运算需要插值法进行加点运算,我偷懒了,没有进行差值运算,毕竟忘了很久了,而且插值法有很多种(据我所知都有3-4种),运用在三维图形中就更麻烦了,所以只是用了楼主给出的25个数据点高程进行最最粗略的估算。

如果嫌此种方法太简单,只要数据够多或者插值法加点很多就可以对求高程的z数组进行编辑以获得更多的高程数据:

假设九个方格共十六个点,各点高程为z(i,j)各点为权重w(i,j)并假设16点权重和为1,则方格中心位置高程插值

Z(i,j)=sum(w(i,j)*z(i,j))九宫16点插值拟合法(16个空间高程点的加权平均,也称三次样条插值)

如果是两个曲面之间的距离,则可使用上面的体积元素之差作为曲顶柱体的高。

拟合完毕了就是照搬公式的体积求和运算:每个高程对应的xy面上的小方格乘以高程,然后对[高程*面积]所有元素求和,就能得到曲顶柱体的近似体积,插值越多,数据点越多,近似越精确!

总体来讲:思路很简单,但是过程复杂,所牵涉的知识比较多,希望对您有帮助!