xiezhh 发表于 2009-2-24 21:39:14

[分享原创] 平面截马鞍面的动画演示程序

本帖最后由 xiezhh 于 2009-2-25 09:41 编辑

用平面从不同方向截马鞍面,观察交线形状,从而更清楚的了解马鞍面。生成的动画比较大,就不上传了。
这是原创,我在2008a中已测试过。

%平面截双曲抛物面(马鞍面)
clear
clc
mov=avifile('平面截双曲抛物面(马鞍面).avi','fps',3);
a=4;
b=4;
X=linspace(-12,12,30);
Y=linspace(-12,12,30);
=meshgrid(X,Y);
Z=X.^2/a^2-Y.^2/b^2;
figure(1)
surf(X,Y,Z)
T=[    1.1832   -0.8084         0   -0.1874
    0.1903    0.4799    0.9511   -0.8106
    0.5858    1.4770   -0.3090   11.2109
         0         0         0    1.0000];
view(T)
hold on
quiver3(0,0,0,-1,0,0,20,'k','filled','LineWidth',2);
quiver3(0,0,0,0,-1,0,30,'k','filled','LineWidth',2);
quiver3(0,0,0,0,0,1,15,'k','filled','LineWidth',2);
text(0,-2,15,'Z')
text(0,-30,1,'Y')
text(-20,0,1.5,'X')
axis equal
axis off
%colormap gray
=meshgrid(-13:0.5:13,-13:0.5:13);
Z=-9*ones(size(X));
h=surf(X,Y,Z);
shading interp
alpha(0.6);
%axis([-17,17,-17,17,-10,10])
title('平面截双曲抛物面(马鞍面)的演示动画')

h1=plot3(0,-12,-9,'-k');
h2=plot3(0,12,-9,'-k');
x=-12:0.5:12;
for z=-9:0.1:0
    set(h, 'xdata' ,X, 'ydata' ,Y, 'zdata' ,z*ones(size(X)));   
    xx=x;
    zz=z*ones(size(xx));
    yy1=-b*sqrt(xx.^2/a^2-zz);
    yy2=b*sqrt(xx.^2/a^2-zz);
    set(h1, 'xdata' ,xx, 'ydata' ,yy1, 'zdata' ,zz);
    set(h2, 'xdata' ,xx, 'ydata' ,yy2, 'zdata' ,zz);
    drawnow; % 刷新屏幕
    pause(0.05)   
    f=getframe(gcf);
    mov=addframe(mov,f);
end
for z=0:0.1:9
    set(h, 'xdata' ,X, 'ydata' ,Y, 'zdata' ,z*ones(size(X)));
    yy=x;
    zz=z*ones(size(yy));
    xx1=-a*sqrt(yy.^2/b^2+zz);
    xx2=a*sqrt(yy.^2/b^2+zz);
    set(h1, 'xdata' ,xx1, 'ydata' ,yy, 'zdata' ,zz);
    set(h2, 'xdata' ,xx2, 'ydata' ,yy, 'zdata' ,zz);
    drawnow; % 刷新屏幕
    pause(0.05)   
    f=getframe(gcf);
    mov=addframe(mov,f);
end
delete(h2);
delete(h);

=meshgrid(-13:0.5:13,-9:0.5:9);
Y=-12*ones(size(X));
h=surf(X,Y,Z);
shading interp
alpha(0.6);
xx=-12:0.1:12;
for y=-12:0.1:12
    set(h, 'xdata' ,X, 'ydata' ,y*ones(size(X)), 'zdata' ,Z);
    yy=y*ones(size(xx));
    zz=xx.^2/a^2-yy.^2/b^2;
    set(h1, 'xdata' ,xx, 'ydata' ,yy, 'zdata' ,zz);
    drawnow; % 刷新屏幕
    pause(0.05)   
    f=getframe(gcf);
    mov=addframe(mov,f);
end
delete(h);

=meshgrid(-13:0.5:13,-9:0.5:9);
X=-12*ones(size(Y));
h=surf(X,Y,Z);
shading interp
alpha(0.6);
yy=-12:0.1:12;
for x=-12:0.1:12
    set(h, 'xdata' ,x*ones(size(Y)), 'ydata' ,Y, 'zdata' ,Z);
    xx=x*ones(size(yy));
    zz=xx.^2/a^2-yy.^2/b^2;
    set(h1, 'xdata' ,xx, 'ydata' ,yy, 'zdata' ,zz);
    drawnow; % 刷新屏幕
    pause(0.05)   
    f=getframe(gcf);
    mov=addframe(mov,f);
end
delete(h1);
delete(h);
hold off
mov=close(mov);

ljelly 发表于 2009-2-25 08:56:57

本帖最后由 ljelly 于 2009-2-25 08:59 编辑

是否原创,请注明
粘贴代码,请注意格式
有代码插入格式
便于编辑

ljelly 发表于 2009-2-25 09:10:38

没有avi文件,怎么验证你的代码
实现的效果呢?没法执行啊

xiezhh 发表于 2009-2-25 09:54:09

ljelly斑竹所说的插入代码格式是右上角的“源码”复选框吗?

我把循环次数减少,生成的动画见附件。

xiezhh 发表于 2009-2-25 10:04:56

我把avi格式动画改做成gif格式动画,见附件。

haiqsim 发表于 2009-2-25 11:32:11

确实牛,学习学习

ljelly 发表于 2009-2-25 12:36:57

ljelly斑竹所说的插入代码格式是右上角的“源码”复选框吗?

我把循环次数减少,生成的动画见附件。
xiezhh 发表于 2009-2-25 09:54 http://forum.simwe.com/images/common/back.gif

在你编辑的时候,上面的菜单栏除字体大小,颜色外
学有代码,引用等选项
按其中的代码标志,即出现插入代码,粘贴即可

bainhome 发表于 2009-2-25 23:03:31

挺不错.
楼主这两天对getframe和drawnow很有兴趣嘛,好像写了不止一个相关代码:victory:

xiezhh 发表于 2009-2-25 23:12:39

总共写了7个:空间曲线绕Z轴生成旋转面、平面截单叶双曲面、平面截双曲抛物面(马鞍面)、平面截双叶双曲面、平面截椭球面、平面截椭圆抛物面、平面截椭圆锥面。
大同小异,没有全发上面。一开始我只生成avi格式动画,后来都改成gif格式了。

rocwoods 发表于 2009-2-25 23:50:14

xiezhh兄是不是天津高校的数学系老师?看你对MATLAB的涉猎范围很广泛,呵呵,热爱程度非同一般!好像北京研讨会你也参加,期待ing

xiezhh 发表于 2009-2-26 17:59:51

我是天津科技大学数学系的老师,对matlab比较热爱,通过论坛上的交流也学到不少东西,我也非常期待与各位面对面的交流,5月16号北京见吧!
页: [1]
查看完整版本: [分享原创] 平面截马鞍面的动画演示程序