zoukankan      html  css  js  c++  java
  • 根据花瓶的侧面投影图,用Matlab绘制花瓶的三维立体图

    现有一花瓶侧面投影如图       

    问题:

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

    三维立体图如下:

  • 相关阅读:
    四则运算题目生成器
    个人博客作业Week1
    M1/M2项目阶段总结
    个人博客作业week7
    个人博客作业—2
    第一周个人博客作业
    关于生成四则运算式
    个人博客作业week7
    第二次博客作业
    关于webservice大数据量传输时的压缩和解压缩
  • 原文地址:https://www.cnblogs.com/love-u/p/3327503.html
Copyright © 2011-2022 走看看