根据花瓶的侧面投影图,用Matlab绘制花瓶的三维立体图
2013-09-17 22:56
441 查看
现有一花瓶侧面投影如图
问题:
1) 做出该花瓶三维立体图;
2) 计算其表面积;
计算其体积。
第一次参加数学建模,从来没有接触过Matlab语言,一上来就碰到这种数字图像处理的问题就懵了。完全是一边摸索,一边自学Matlab语言,一遍又一遍的在机子上调试。出错了就改;运行不同了就调试.....异常辛苦。在这之前只会C/C++语言,而且这两种语言还只停留在书本上,没有编程经验。所以在参加建模以前颇费了思量,下了一番决心。以前笃信一句名言——“机会是留给有准备的人的”,当时那句名言写在中学的一块标志牌上,所以记得很清楚。这句话乍看一下没有错,但仔细想想,你会发现一个问题。如果你每次都因为没有准备好,而拒绝尝试,放弃机会,你怎么能知道自己需要准备什么,怎么会提高呢?退一步讲,即使第一次你失败了,但你有了这次经历,有了经验,知道了自己的不足,知道了自己还需要准备什么,你就可以在心里对自己说,“我还会回来的,明年再战”。从这个角度讲,你就是赢家。
总结起来就是一句话“年轻人,不要害怕失败,不要拒绝尝试”。
闲话少说,切入正题。
数字图像在计算机中使用数字(0~255)表示的,对上图中的花瓶来讲,图中阴影部分用‘0’表示,空白部分用‘1’表示。一个自然而然的想法就是利用这个特点,找出花瓶边缘的坐标,然后拟合出一条曲线(本文使用三次样条曲线拟合花瓶侧面轮廓曲线),剩下的交给Matlab就可以了。对于表面积和体积,可以采用梯形法数值积分的方法。
源程序:
clear
X=imread('t1.bmp');
[m,n]=size(X);
A=[];A1=[];A2=[];k1=1;k2=1;
%寻找花瓶的最上面坐标
for j=1:n
for i=1:m
if X(i,j)==0
A1(k1)=i;k1=k1+1;
break;
end
end
end
n1=min(A1);
%寻找花瓶的最下面坐标
for j=1:n
for i=m:-1:1
if X(i,j)==0
A2(k2)=i;k2=k2+1;
break;
end
end
end
n2=max(A2);
%读出花瓶左侧轮廓的y坐标
for i=1:m
for j=1:n
if X(i,j)==0
A(i)=j;
break;
end
end
end
%%
%绘制三维立体图
x1=n1:n2;
x=n1:1:n2;
y=spline(x1,A(x1),x);
[X,Y,Z]=cylinder(520-y,60);
mesh(X,Y,Z)
%计算体积
vi=pi*(y-520).^2;
V=trapz(x,vi)
%计算表面积
for i=1:1:n2-n1+1
if i<n2-n1+1
drtay(i)=y(i+1)-y(i);
else
drtay(i)=0;
end
end
si=2*pi*(520-y)./2.*sqrt(1+drtay.^2);
S=trapz(x,si)+pi*38*38
rotate3D on;
set(gca,'zdir','reverse');
三维立体图如下:
问题:
1) 做出该花瓶三维立体图;
2) 计算其表面积;
计算其体积。
第一次参加数学建模,从来没有接触过Matlab语言,一上来就碰到这种数字图像处理的问题就懵了。完全是一边摸索,一边自学Matlab语言,一遍又一遍的在机子上调试。出错了就改;运行不同了就调试.....异常辛苦。在这之前只会C/C++语言,而且这两种语言还只停留在书本上,没有编程经验。所以在参加建模以前颇费了思量,下了一番决心。以前笃信一句名言——“机会是留给有准备的人的”,当时那句名言写在中学的一块标志牌上,所以记得很清楚。这句话乍看一下没有错,但仔细想想,你会发现一个问题。如果你每次都因为没有准备好,而拒绝尝试,放弃机会,你怎么能知道自己需要准备什么,怎么会提高呢?退一步讲,即使第一次你失败了,但你有了这次经历,有了经验,知道了自己的不足,知道了自己还需要准备什么,你就可以在心里对自己说,“我还会回来的,明年再战”。从这个角度讲,你就是赢家。
总结起来就是一句话“年轻人,不要害怕失败,不要拒绝尝试”。
闲话少说,切入正题。
数字图像在计算机中使用数字(0~255)表示的,对上图中的花瓶来讲,图中阴影部分用‘0’表示,空白部分用‘1’表示。一个自然而然的想法就是利用这个特点,找出花瓶边缘的坐标,然后拟合出一条曲线(本文使用三次样条曲线拟合花瓶侧面轮廓曲线),剩下的交给Matlab就可以了。对于表面积和体积,可以采用梯形法数值积分的方法。
源程序:
clear
X=imread('t1.bmp');
[m,n]=size(X);
A=[];A1=[];A2=[];k1=1;k2=1;
%寻找花瓶的最上面坐标
for j=1:n
for i=1:m
if X(i,j)==0
A1(k1)=i;k1=k1+1;
break;
end
end
end
n1=min(A1);
%寻找花瓶的最下面坐标
for j=1:n
for i=m:-1:1
if X(i,j)==0
A2(k2)=i;k2=k2+1;
break;
end
end
end
n2=max(A2);
%读出花瓶左侧轮廓的y坐标
for i=1:m
for j=1:n
if X(i,j)==0
A(i)=j;
break;
end
end
end
%%
%绘制三维立体图
x1=n1:n2;
x=n1:1:n2;
y=spline(x1,A(x1),x);
[X,Y,Z]=cylinder(520-y,60);
mesh(X,Y,Z)
%计算体积
vi=pi*(y-520).^2;
V=trapz(x,vi)
%计算表面积
for i=1:1:n2-n1+1
if i<n2-n1+1
drtay(i)=y(i+1)-y(i);
else
drtay(i)=0;
end
end
si=2*pi*(520-y)./2.*sqrt(1+drtay.^2);
S=trapz(x,si)+pi*38*38
rotate3D on;
set(gca,'zdir','reverse');
三维立体图如下:
相关文章推荐
- MATLAB 根据X、Y坐标绘制折线图,增加右侧纵轴刻度且不用plotyy
- 在Matlab中根据离散点坐标绘制空间曲面
- 根据卫星仰角和方位角使用html5绘制天空图(投影图)
- Matlab 绘制三维立体图(以地质异常体为例)
- Matlab slice方法和包络法绘制三维立体图
- Matlab 绘制三维立体图(以地质异常体为例)
- 在Matlab中根据离散点坐标绘制空间曲面
- matlab如何绘制统计分析图(正态分布,柱形图,散点图)和matlab cftool拟合工具
- Matlab 读取数据并绘制图形
- MATLAB 绘制有理Biezier曲线
- matlab二维曲线绘制plot基本操作
- 新手上路,matlab基础(2)-绘制平面图
- matlab绘制直方图的方法
- MATLAB绘制3D隐函数曲面的方法总结
- Android基于OpenGL在GLSurfaceView上绘制三角形及使用投影和相机视图方法示例
- 【Matlab】离散点绘制三维曲面方法小结
- 【转载】Unity3D研究院之与根据动态的两个轨迹点绘制面详解
- MATLAB 绘制对数图操作陷阱 hold on的位置
- grads 绘制仿matlab色标效果
- Matlab绘制实心圆和实心圆点