MATLAB学习|MATLAB运用——计算三维物体的质心(水花号)

在上一章中,我们根据水花号的二维设计图构建出了它的三维模型。
传送门
本章会在上一章的基础上,计算水花号的船体重心。
我们把水花号的船体的密度看作均匀分布的物体。
那么大家应该都知道,一个密度均匀分布的三维物体的重心计算方法:
X = ∑ i = 1 n x i N X= \frac { \sum_{i=1}^nxi }{N} X=N∑i=1n?xi?
Y = ∑ i = 1 n y i N Y= \frac { \sum_{i=1}^nyi }{N} Y=N∑i=1n?yi?
Z = ∑ i = 1 n z i N Z= \frac { \sum_{i=1}^nzi }{N} Z=N∑i=1n?zi?
我们现在的图形是这样的:
MATLAB学习|MATLAB运用——计算三维物体的质心(水花号)
文章图片

但这随之而来了一个问题:
我们的有效点太少了,质心的计算会产生很大误差啊(黑色的点为有效点)
所以我们得到了解决这个问题的方法:

  1. 增加三维模型的有效点
  2. 由有效点计算重心
增加三维模型的有效点 在介绍这个之前,还请读者了解系统函数griddata(通过插值来增加有效点)
我们之前得到了X,Y,Z三个有效点的数组。
现在我们只需要在这有效点之间插入插值,使得其与拟合的图像贴合。
那么这些插值就会是新的有效点了。
我们写下代码(matlab)
X = [ 24.000000 24.000000 24.000000 24.000000 24.000000 24.000000 24.000000 24.000000 24.000000 24.000000 24.000000 24.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 264.000000 264.000000 264.000000 264.000000 264.000000 264.000000 264.000000 264.000000 264.000000 264.000000 264.000000 264.000000 0.000000 288.000000 ]; Y = [ 27.750000 -27.750000 27.750000 -27.750000 17.000000 -17.000000 16.000000 -16.000000 9.750000 -9.750000 7.500000 -7.500000 41.750000 -41.750000 41.750000 -41.750000 39.375000 -39.375000 36.500000 -36.500000 32.500000 -32.500000 29.500000 -29.500000 24.375000 -24.375000 16.500000 -16.500000 9.750000 -9.750000 50.875000 -50.875000 50.875000 -50.875000 51.250000 -51.250000 49.750000 -49.750000 46.250000 -46.250000 41.250000 -41.250000 36.250000 -36.250000 27.500000 -27.500000 16.250000 -16.250000 6.250000 -6.250000 57.250000 -57.250000 57.250000 -57.250000 55.250000 -55.250000 54.000000 -54.000000 51.875000 -51.875000 48.625000 -48.625000 44.125000 -44.125000 35.250000 -35.250000 25.500000 -25.500000 9.250000 -9.250000 56.250000 -56.250000 56.250000 -56.250000 59.750000 -59.750000 58.750000 -58.750000 56.750000 -56.750000 53.500000 -53.500000 51.125000 -51.125000 41.750000 -41.750000 27.500000 -27.500000 14.750000 -14.750000 56.500000 -56.500000 56.500000 -56.500000 58.750000 -58.750000 58.250000 -58.250000 58.000000 -58.000000 55.250000 -55.250000 49.250000 -49.250000 43.000000 -43.000000 28.750000 -28.750000 17.500000 -17.500000 58.500000 -58.500000 58.500000 -58.500000 57.250000 -57.250000 57.000000 -57.000000 56.750000 -56.750000 53.875000 -53.875000 50.000000 -50.000000 46.500000 -46.500000 16.250000 -16.250000 15.250000 -15.250000 55.750000 -55.750000 55.750000 -55.750000 55.000000 -55.000000 54.750000 -54.750000 53.500000 -53.500000 49.000000 -49.000000 43.500000 -43.500000 33.000000 -33.000000 19.500000 -19.500000 10.750000 -10.750000 50.500000 -50.500000 50.500000 -50.500000 50.000000 -50.000000 48.500000 -48.500000 48.000000 -48.000000 45.500000 -45.500000 33.500000 -33.500000 21.000000 -21.000000 11.500000 -11.500000 8.750000 -8.750000 48.000000 -48.000000 48.000000 -48.000000 47.500000 -47.500000 45.875000 -45.875000 43.000000 -43.000000 34.000000 -34.000000 16.875000 -16.875000 10.500000 -10.500000 6.500000 -6.500000 4.500000 -4.500000 41.000000 -41.000000 41.000000 -41.000000 41.375000 -41.375000 42.625000 -42.625000 33.500000 -33.500000 11.500000 -11.500000 0.000000 0.000000 ]; Z = [ 24.000000 24.000000 18.000000 18.000000 12.000000 12.000000 6.000000 6.000000 0.000000 0.000000 -6.000000 -6.000000 24.000000 24.000000 18.000000 18.000000 12.000000 12.000000 6.000000 6.000000 0.000000 0.000000 -6.000000 -6.000000 -12.000000 -12.000000 -18.000000 -18.000000 -24.000000 -24.000000 24.000000 24.000000 18.000000 18.000000 12.000000 12.000000 6.000000 6.000000 0.000000 0.000000 -6.000000 -6.000000 -12.000000 -12.000000 -18.000000 -18.000000 -24.000000 -24.000000 -30.000000 -30.000000 24.000000 24.000000 18.000000 18.000000 12.000000 12.000000 6.000000 6.000000 0.000000 0.000000 -6.000000 -6.000000 -12.000000 -12.000000 -18.000000 -18.000000 -24.000000 -24.000000 -30.000000 -30.000000 24.000000 24.000000 18.000000 18.000000 12.000000 12.000000 6.000000 6.000000 0.000000 0.000000 -6.000000 -6.000000 -12.000000 -12.000000 -18.000000 -18.000000 -24.000000 -24.000000 -30.000000 -30.000000 24.000000 24.000000 18.000000 18.000000 12.000000 12.000000 6.000000 6.000000 0.000000 0.000000 -6.000000 -6.000000 -12.000000 -12.000000 -18.000000 -18.000000 -24.000000 -24.000000 -30.000000 -30.000000 24.000000 24.000000 18.000000 18.000000 12.000000 12.000000 6.000000 6.000000 0.000000 0.000000 -6.000000 -6.000000 -12.000000 -12.000000 -18.000000 -18.000000 -24.000000 -24.000000 -30.000000 -30.000000 24.000000 24.000000 18.000000 18.000000 12.000000 12.000000 6.000000 6.000000 0.000000 0.000000 -6.000000 -6.000000 -12.000000 -12.000000 -18.000000 -18.000000 -24.000000 -24.000000 -30.000000 -30.000000 24.000000 24.000000 18.000000 18.000000 12.000000 12.000000 6.000000 6.000000 0.000000 0.000000 -6.000000 -6.000000 -12.000000 -12.000000 -18.000000 -18.000000 -24.000000 -24.000000 -30.000000 -30.000000 24.000000 24.000000 18.000000 18.000000 12.000000 12.000000 6.000000 6.000000 0.000000 0.000000 -6.000000 -6.000000 -12.000000 -12.000000 -18.000000 -18.000000 -24.000000 -24.000000 -30.000000 -30.000000 24.000000 24.000000 18.000000 18.000000 12.000000 12.000000 6.000000 6.000000 0.000000 0.000000 -6.000000 -6.000000 24.000000 24.000000 ]; [Xi,Yi]=meshgrid(0:3:300,-50:1:50); Zi=griddata(X,Y,Z, Xi,Yi); surf(Xi,Yi,Zi); shading flat; axis('equal');

得到图像:
MATLAB学习|MATLAB运用——计算三维物体的质心(水花号)
文章图片

这样,我们的有效点就从240个变到了个了10000个了。
由有效点计算重心 有了10000个有效点,我们计算重心也会变得轻而易举。
由公式:
X = ∑ i = 1 n x i N X= \frac { \sum_{i=1}^nxi }{N} X=N∑i=1n?xi?
Y = ∑ i = 1 n y i N Y= \frac { \sum_{i=1}^nyi }{N} Y=N∑i=1n?yi?
Z = ∑ i = 1 n z i N Z= \frac { \sum_{i=1}^nzi }{N} Z=N∑i=1n?zi?
我们写下代码(matlab)
X = [ 24.000000 24.000000 24.000000 24.000000 24.000000 24.000000 24.000000 24.000000 24.000000 24.000000 24.000000 24.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 48.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 72.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 96.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 120.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 144.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 168.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 192.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 216.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 240.000000 264.000000 264.000000 264.000000 264.000000 264.000000 264.000000 264.000000 264.000000 264.000000 264.000000 264.000000 264.000000 0.000000 288.000000 ]; Y = [ 27.750000 -27.750000 27.750000 -27.750000 17.000000 -17.000000 16.000000 -16.000000 9.750000 -9.750000 7.500000 -7.500000 41.750000 -41.750000 41.750000 -41.750000 39.375000 -39.375000 36.500000 -36.500000 32.500000 -32.500000 29.500000 -29.500000 24.375000 -24.375000 16.500000 -16.500000 9.750000 -9.750000 50.875000 -50.875000 50.875000 -50.875000 51.250000 -51.250000 49.750000 -49.750000 46.250000 -46.250000 41.250000 -41.250000 36.250000 -36.250000 27.500000 -27.500000 16.250000 -16.250000 6.250000 -6.250000 57.250000 -57.250000 57.250000 -57.250000 55.250000 -55.250000 54.000000 -54.000000 51.875000 -51.875000 48.625000 -48.625000 44.125000 -44.125000 35.250000 -35.250000 25.500000 -25.500000 9.250000 -9.250000 56.250000 -56.250000 56.250000 -56.250000 59.750000 -59.750000 58.750000 -58.750000 56.750000 -56.750000 53.500000 -53.500000 51.125000 -51.125000 41.750000 -41.750000 27.500000 -27.500000 14.750000 -14.750000 56.500000 -56.500000 56.500000 -56.500000 58.750000 -58.750000 58.250000 -58.250000 58.000000 -58.000000 55.250000 -55.250000 49.250000 -49.250000 43.000000 -43.000000 28.750000 -28.750000 17.500000 -17.500000 58.500000 -58.500000 58.500000 -58.500000 57.250000 -57.250000 57.000000 -57.000000 56.750000 -56.750000 53.875000 -53.875000 50.000000 -50.000000 46.500000 -46.500000 16.250000 -16.250000 15.250000 -15.250000 55.750000 -55.750000 55.750000 -55.750000 55.000000 -55.000000 54.750000 -54.750000 53.500000 -53.500000 49.000000 -49.000000 43.500000 -43.500000 33.000000 -33.000000 19.500000 -19.500000 10.750000 -10.750000 50.500000 -50.500000 50.500000 -50.500000 50.000000 -50.000000 48.500000 -48.500000 48.000000 -48.000000 45.500000 -45.500000 33.500000 -33.500000 21.000000 -21.000000 11.500000 -11.500000 8.750000 -8.750000 48.000000 -48.000000 48.000000 -48.000000 47.500000 -47.500000 45.875000 -45.875000 43.000000 -43.000000 34.000000 -34.000000 16.875000 -16.875000 10.500000 -10.500000 6.500000 -6.500000 4.500000 -4.500000 41.000000 -41.000000 41.000000 -41.000000 41.375000 -41.375000 42.625000 -42.625000 33.500000 -33.500000 11.500000 -11.500000 0.000000 0.000000 ]; Z = [ 24.000000 24.000000 18.000000 18.000000 12.000000 12.000000 6.000000 6.000000 0.000000 0.000000 -6.000000 -6.000000 24.000000 24.000000 18.000000 18.000000 12.000000 12.000000 6.000000 6.000000 0.000000 0.000000 -6.000000 -6.000000 -12.000000 -12.000000 -18.000000 -18.000000 -24.000000 -24.000000 24.000000 24.000000 18.000000 18.000000 12.000000 12.000000 6.000000 6.000000 0.000000 0.000000 -6.000000 -6.000000 -12.000000 -12.000000 -18.000000 -18.000000 -24.000000 -24.000000 -30.000000 -30.000000 24.000000 24.000000 18.000000 18.000000 12.000000 12.000000 6.000000 6.000000 0.000000 0.000000 -6.000000 -6.000000 -12.000000 -12.000000 -18.000000 -18.000000 -24.000000 -24.000000 -30.000000 -30.000000 24.000000 24.000000 18.000000 18.000000 12.000000 12.000000 6.000000 6.000000 0.000000 0.000000 -6.000000 -6.000000 -12.000000 -12.000000 -18.000000 -18.000000 -24.000000 -24.000000 -30.000000 -30.000000 24.000000 24.000000 18.000000 18.000000 12.000000 12.000000 6.000000 6.000000 0.000000 0.000000 -6.000000 -6.000000 -12.000000 -12.000000 -18.000000 -18.000000 -24.000000 -24.000000 -30.000000 -30.000000 24.000000 24.000000 18.000000 18.000000 12.000000 12.000000 6.000000 6.000000 0.000000 0.000000 -6.000000 -6.000000 -12.000000 -12.000000 -18.000000 -18.000000 -24.000000 -24.000000 -30.000000 -30.000000 24.000000 24.000000 18.000000 18.000000 12.000000 12.000000 6.000000 6.000000 0.000000 0.000000 -6.000000 -6.000000 -12.000000 -12.000000 -18.000000 -18.000000 -24.000000 -24.000000 -30.000000 -30.000000 24.000000 24.000000 18.000000 18.000000 12.000000 12.000000 6.000000 6.000000 0.000000 0.000000 -6.000000 -6.000000 -12.000000 -12.000000 -18.000000 -18.000000 -24.000000 -24.000000 -30.000000 -30.000000 24.000000 24.000000 18.000000 18.000000 12.000000 12.000000 6.000000 6.000000 0.000000 0.000000 -6.000000 -6.000000 -12.000000 -12.000000 -18.000000 -18.000000 -24.000000 -24.000000 -30.000000 -30.000000 24.000000 24.000000 18.000000 18.000000 12.000000 12.000000 6.000000 6.000000 0.000000 0.000000 -6.000000 -6.000000 24.000000 24.000000 ]; [Xi,Yi]=meshgrid(0:3:300,-50:1:50); Zi=griddata(X,Y,Z, Xi,Yi); surf(Xi,Yi,Zi); shading flat; axis('equal'); Mass_x=0; %x轴上的重心 tnt=0; %有效点的个数 for i=1:100 for j=1:100 %if Zi(i,j)>450 && Zi(i,j)<450 Mass_x=Mass_x+Xi(i,j); tnt=tnt+1; % end end end Mass_y=0; %y轴上的重心 for i=1:100 for j=1:100 % if Zi(i,j)>450 && Zi(i,j)<450 Mass_y=Mass_y+Yi(i,j); % end end end Mass_z=0; %z轴上的重心 i=find(isnan(Zi ... )); Zi(i)=0; %去掉NaN点的影响 for i=1:100 for j=1:100 Mass_z=Mass_z+Zi(i,j); end end Mass_x=Mass_x/tnt; Mass_y=Mass_y/tnt; Mass_z=Mass_z/tnt;

把这段代码写入命令行内,运行后就可以得到重心啦。
MATLAB学习|MATLAB运用——计算三维物体的质心(水花号)
文章图片

【MATLAB学习|MATLAB运用——计算三维物体的质心(水花号)】所以船舶的重心是(148.5,-0.5,-12.8084).

    推荐阅读