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

在上一章中,我们根据水花号的二维设计图构建出了它的三维模型。
传送门
本章会在上一章的基础上,计算水花号的船体重心。

我们把水花号的船体的密度看作均匀分布的物体。
那么大家应该都知道,一个密度均匀分布的三维物体的重心计算方法:
X = ∑ i = 1 n x i N X= \frac { \sum_{i=1}^nxi }{N} X=Ni=1nxi
Y = ∑ i = 1 n y i N Y= \frac { \sum_{i=1}^nyi }{N} Y=Ni=1nyi
Z = ∑ i = 1 n z i N Z= \frac { \sum_{i=1}^nzi }{N} Z=Ni=1nzi
我们现在的图形是这样的:
在这里插入图片描述
但这随之而来了一个问题:
我们的有效点太少了,质心的计算会产生很大误差啊(黑色的点为有效点)
所以我们得到了解决这个问题的方法:

  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');

得到图像:
在这里插入图片描述

这样,我们的有效点就从240个变到了个了10000个了。

由有效点计算重心

有了10000个有效点,我们计算重心也会变得轻而易举。
由公式:
X = ∑ i = 1 n x i N X= \frac { \sum_{i=1}^nxi }{N} X=Ni=1nxi
Y = ∑ i = 1 n y i N Y= \frac { \sum_{i=1}^nyi }{N} Y=Ni=1nyi
Z = ∑ i = 1 n z i N Z= \frac { \sum_{i=1}^nzi }{N} Z=Ni=1nzi
我们写下代码(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;

把这段代码写入命令行内,运行后就可以得到重心啦。
在这里插入图片描述

所以船舶的重心是(148.5,-0.5,-12.8084).

  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go_bananas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值