在上一章中,我们根据水花号的二维设计图构建出了它的三维模型。
传送门
本章会在上一章的基础上,计算水花号的船体重心。
我们把水花号的船体的密度看作均匀分布的物体。
那么大家应该都知道,一个密度均匀分布的三维物体的重心计算方法:
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?
我们现在的图形是这样的:
文章图片
但这随之而来了一个问题:
我们的有效点太少了,质心的计算会产生很大误差啊(黑色的点为有效点)
所以我们得到了解决这个问题的方法:
- 增加三维模型的有效点
- 由有效点计算重心
我们之前得到了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=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运用——计算三维物体的质心(水花号)】所以船舶的重心是(148.5,-0.5,-12.8084).
推荐阅读
- 数据结构与算法|位运算各种方法总结
- 操作系统|快@你的好兄弟好姐妹来内卷进程状态
- Linux|我所理解的CPU中断
- 笔记|CGB2111SpingBoot第三天
- CGB2202|CGB2202语言基础第2天
- 初学至学会C++|初阶C++—— 第三节—— 动态内存管理 初识模板
- C|C语言——知识点汇总
- 《力扣周赛题解》|【解题报告】力扣 第 279 场周赛
- 《LeetCode算法全集》|LeetCode 297. 二叉树的序列化与反序列化