基于matlab的平面切割、旋转曲面等动图制作

基于matlab的平面切割、旋转曲面等动图制作
1. 引言
MATLAB具有方便的数据可视化功能,以将向量和矩阵用图形表现出来,并且可以对图形进行标注和打印。高层次的作图包括二维和三维的可视化、图象处理、动画和表达式作图。可用于科学计算和工程绘图。新版本的MATLAB对整个图形处理功能作了很大的改进和完善,使它不仅在一般数据可视化软件都具有的功能(例如二维曲线和三维曲面的绘制和处理等)方面更加完善,而且对于一些其他软件所没有的功能(例如图形的光照处理、色度处理以及四维数据的表现等),MATLAB同样表现了出色的处理能力。 [1]
本文利用Matlab软件平台绘制旋转动图,并生成相应的.gif图片。具体内容包括水平平面沿着Z轴垂直移动切割马鞍面的动态过程、双曲线水平旋转以及垂直旋转动形成曲面的动态过程以及圆形曲线旋转形成圆环的动态过程。

2. 平面切割动图制作
制作水平平面沿着Z轴垂直移动切割马鞍面的动态过程,并标记出切割曲线(水平平面与马鞍面的交线)。
编程思路:
1) 利用meshgrid 和 mesh 函数,结合马鞍面的定义可直接绘制出马鞍面。
2) 水平平面亦可利用meshgrid 和 mesh 函数绘制,其函数定义式中,z坐标的取值为常数即可。
3) 水平平面沿Z轴的上下运动可利用for循环结合mesh函数完成,每个循环中只需给水平面的z坐标取值叠加一个步进值即可。
4) 切割曲线标记。为简化运算,利用find函数寻找与水平平面的z值差值在预定义范围内的点,利用plot3函数标记。用标记的点代替水平平面与马鞍面的切线,此方法与理论存在一定误差,但计算量小且易于实现,人眼视觉可接受。
源码:见附录
运行结果
在这里插入图片描述

3. 旋转曲面制作
3.1 双曲线水平旋转以及垂直旋转动形成曲面的动态过程
编程思路:
1) 利用cylinder函数结合定义的双曲线得到曲面对应的数据矩阵;
2) 通过for循环将已经得到的数据矩阵逐步绘制出来,以模拟旋转过程。
3) 水平旋转以及垂直旋转原理以及所需的数据相同,只需适当调整mesh函数的传递参数即可完成两种情况的动态过程绘制。

源码:见附录
运行结果
图2 双曲线沿Z轴旋转形成曲面的中间过程示意图
图3 双曲线沿X轴旋转形成曲面的中间过程示意图

3.2 圆形曲线旋转形成圆环的动态过程
编程思路:
1) 首先实现一个三维空间上法向量平行于x-y平面且圆心为(R,0,0)的圆对应的数据矩阵。
2) 基于1)中的数据,以Z轴为圆心,以1)中圆对应的每一个x值为半径,得到一个以(0,0,0)为中心的圆环对应的数据阵列。
3) 利用for循环结合surface函数逐步绘制出圆环对应的数据,以模拟旋转过程。
源码:见附录
运行结果
图4 圆形曲线旋转形成圆环的中间过程示意图
参考文献

[1] MATLAB_百度百科 (baidu.com)
[2] 童德茂,张华. Matlab用于动图制作旋转曲面设计.

附录

  1. 水平平面与马鞍面的切割动图
clc
clear
close all

pic_num=1;

x=-4:0.03:4;
y=-4:0.03:4;

[X,Y]=meshgrid(x,y);

Z=-X.^2+Y.^2;

[r,c]=size(Z);
figure
title('马鞍面与水平面相切');
L=min(min(Z));
H=max(max(Z));
time=[L:1:H  H:-1:L];
delt=0.03;
% view(-68,22);% 改变观测视角
for i=time
    Z2=zeros(r,c)+i;
    alpha(0.1) 
    mesh(X,Y,Z)
    hold on
    
    alpha(0.1) 
    mesh(X,Y,Z2,'facecolor',[0.2 0.2 0])
    hold on
    
    XL=X(find(Z>i-delt&Z<=i+delt));
    YL=Y(find(Z>i-delt&Z<=i+delt));
    ZL=repmat(i,1,length(find(Z>i-delt&Z<=i+delt)));
    plot3(XL,YL,ZL,'.','color',[1 0 0],'LineWidth',5)
    
    hold off

    F=getframe(gcf);
    I=frame2im(F);
    [I,map]=rgb2ind(I,256);
    if pic_num == 1
    imwrite(I,map,'马鞍.gif','gif', 'Loopcount',inf,'DelayTime',0.15);
    else
    imwrite(I,map,'马鞍.gif','gif','WriteMode','append','DelayTime',0.15);
    end
    pic_num = pic_num + 1;

end
  1. 双曲线水平旋转以及垂直旋转动形成曲面的动态过程
% 动图绘制
clc
clear
close all

pic_num=1;

a=4;
c=4;
z=-15:0.1:15;
x=a*sqrt(1+z.^2/c^2);
y=zeros(1,length(z));

[x1,y1,z1]=cylinder(x,51);

figure;
plot3(x,y,z,'color',[1 0 0],'LineWidth',2);
hold on
plot3(-x,y,z,'color',[1 0 0],'LineWidth',2);
title('双曲线绕Z轴旋转')
z1=30.*z1-15;
axis([-20,20,-20,20,-10,10]);
hold on
grid on
n=size(z1,2);
for i=1:n/2+1
    z11=z1;
    z11(:,i+1:n)=NaN;
    mesh(x1,y1,z11);
    mesh(-x1,-y1,z11);
    drawnow
%   pause(0.1)
    
    F=getframe(gcf);
    I=frame2im(F);
    [I,map]=rgb2ind(I,256);
    if pic_num == 1
        imwrite(I,map,'垂直.gif','gif', 'Loopcount',inf,'DelayTime',0.15);
    else
        imwrite(I,map,'垂直.gif','gif','WriteMode','append','DelayTime',0.15);
    end
    pic_num = pic_num + 1;
end


v=x';
r=z; %自变量
th=linspace(0,2*pi,100);

[R,Th]=meshgrid(r,th);
[X,Y] = pol2cart(Th,R);
Z=(v*ones(size(th)))';


pic_num=1;
figure
plot3(X(1,:),Z(1,:),Y(1,:),'color',[1 0 0],'LineWidth',2);
hold on
plot3(X(1,:),-Z(1,:),Y(1,:),'color',[1 0 0],'LineWidth',2);
title('双曲线绕水平轴旋转')
view(-68,22);% 改变观测视角
axis([-20,20,-20,20,-20,20]);
n=size(X,1);
hold on
grid on
for i=1:n/2
    mesh(X(i:i+1,:),Z(i:i+1,:),Y(i:i+1,:));
    mesh(X(i:i+1,:),-Z(i:i+1,:),Y(i:i+1,:));
    drawnow;
    pause(0.2);
    
    F=getframe(gcf);
    I=frame2im(F);
    [I,map]=rgb2ind(I,256);
    if pic_num == 1
        imwrite(I,map,'水平.gif','gif', 'Loopcount',inf,'DelayTime',0.15);
    else
        imwrite(I,map,'水平.gif','gif','WriteMode','append','DelayTime',0.15);
    end
    pic_num = pic_num + 1;
end
  1. 圆形曲线旋转形成圆环的动态过程
clc
clear
close all

pic_num = 1;
R=10; %大圆半径

aplha1=0:pi/40:2*pi;
N=length(aplha1);
r=2; %管道圆半径
x0=r*cos(aplha1)+R;
z0=r*sin(aplha1);
y0=zeros(1,length(x0));

aplha2=0:pi/40:2*pi;
M=length(aplha2);

x= zeros(M,N);
y= zeros(M,N);
z= zeros(M,N);

for i=1:N
    for j=1:M
        x(j,i)=cos(aplha2(1,j))*x0(1,i);
        y(j,i)=sin(aplha2(1,j))*x0(1,i);
        z(j,i)=z0(1,i);
    end
end
figure
mesh(x,y,z)
axis equal

figure
plot3(x(1,:),y(1,:),z(1,:),'color',[1 0 0],'LineWidth',2);
hold on
axis([-20,20,-20,20,-10,10]);
n=size(x,1);
hold on
grid on
line([0 0],[0 0],[-10 10],'linewidth',3);

for i=1:n-1
    mesh(x(i:i+1,:),y(i:i+1,:),z(i:i+1,:));
    drawnow;
%     pause(0.2);
%     alpha(0.5) 
    F=getframe(gcf);
    I=frame2im(F);
    [I,map]=rgb2ind(I,256);
    if pic_num == 1
        imwrite(I,map,'圆环.gif','gif', 'Loopcount',inf,'DelayTime',0.15);
    else
        imwrite(I,map,'圆环.gif','gif','WriteMode','append','DelayTime',0.15);
    end
    pic_num = pic_num + 1;
end
  • 11
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值