资源描述
实验名称:旋转曲面图形绘制
--------------谢煜 200820501024
一、 问题阐述:
二、 问题分析:
该问题应归于三维可视化的范畴,问题中的函数形式已给出,通过计算函数在分段点的函数值和一阶导数值,我们可以知道,该函数曲线是光滑的。如果按照“经典”的绘图方法,我们应该找到对应平面的对应点函数值(正如一幅数码图片那样对应平面上点的函数值),然后使用MATLAB中命令surf或mesh来绘出我们的图形。但是我们注意到,对于特定的操作(旋转),也许这样并不是一个很好的方法。
我们知道,一个旋转曲面的两个要素是截面曲线和旋转轴。我们可以通过这两个步骤得到一个特定的旋转曲面。
1. 指定截面曲线;
2. 指定旋转轴。
我们同时可以将旋转曲面的形成过程看作是某个具有特定形状的截面曲线对一个圆柱体进行“变形”。基于这样的思想,我们可以用一下两个步骤得到一个特定的旋转曲面:
1. 生成一个单位高度单位半径的圆柱体;
2. 将截面曲线的形状应用到该矩形截面上;
3. 对旋转曲面的高度进行缩放。
三、实验内容(包含程序及其注释,实验输出及其分析)
接下来第一步我们还是先用一个简单的程序看看截面曲线的样子,
绘出如图1所示的曲线,有点像给出的飞机机翼截面的上半部分,也有点像鲸的头部。
图1 截面曲线
接下来我们按照要求,先计算对应的y和z,
得到如下表1中所列数据,
表1 对应三轴数据
然后,按照我们的思路,应该先生成一个单位高度圆柱体,然后应用截面,再伸缩长度,在MATLAB里面,有一个命令cylinder可以直接生成圆柱体,并且还可以指定截面函数,这样三步就完成前两步,我们只需要将X轴的数据进行放大即图形上的伸缩即可。唯一需要说明的是,由于问题中X轴是横的,而cylinder命令默认旋转轴是Z轴,我们可以将返回的数值顺序调换一下,将X的数据放在Z轴数据的位置。如下命令:
最后,我们用以下命令绘出图形,图形如图2所示。这个旋转曲面形状像一个陨石在大气层中燃烧产生的焰火,当然,我觉得也像一个望着大家的眼球。
图2 旋转曲面图形
至此,本实验所包含的基本问题就得到解决。
下面我们来生成一个有趣的图形。展示了一个“逃出”的情景。如图3,所用程序一并给出。
图3 多个旋转曲面组成的图形
四、 实验结论
通过这个实验我们解决了给出的基本问题,并发展出一种更方便的绘制旋转曲面的方法。这种方法也说明我们采取的解决方法和我们看待事物的角度有密切联系。有意识的突破自己思维的局限性,学习、生活和工作中会充满更多的乐趣。
用matlab怎么绘制一条曲线绕z轴旋转生成的曲面?
已知数据如下:
x z y
-398.10815554637100 391.8559758318630 690.066133543041
-381.07955594867500 424.8310441553090 658.180381257343
-360.31045913580800 454.9810420379280 624.438172164358
-340.77979331967200 480.0490258857480 589.871036254153
-320.70280893650000 501.0456858777910 554.852570812195
-299.82431813457700 518.2155766324390 519.823513346336
-279.71207016838500 531.7446721639860 484.240629766611
-259.24117791020500 541.8367285151120 449.014948124588
-239.00970860829800 548.6904840829760 413.976780343287
-218.96623482661700 552.4832393130960 379.260454228704
-199.13368646014500 553.3595194667750 344.899655271289
-179.49937951068700 551.4224547392160 310.901650657030
-160.05853897239600 546.7258057477280 277.229604984912
-140.73497483322400 539.2644101927670 243.852173648710
-121.15977918590600 528.9596832738090 210.871041265296
-101.65161274937100 515.6373668302500 177.947981974895
-84.00653665377710 498.9885863466380 143.830455838681
-64.35915615835300 478.4857769773050 110.443195592555
-44.23457579408930 453.3382051141650 76.621451887220
-25.81056754057310 422.9803472875990 41.709372091224
-6.74982846277030 390.5455060023060 12.023208187747
这些数据可以生成空间三维曲线,我想要这个曲线绕z轴旋转一周得到的曲面,怎么弄,要程序,多谢了。。。
data = [
-398.10815554637100 391.8559758318630 690.066133543041
-381.07955594867500 424.8310441553090 658.180381257343
-360.31045913580800 454.9810420379280 624.438172164358
-340.77979331967200 480.0490258857480 589.871036254153
-320.70280893650000 501.0456858777910 554.852570812195
-299.82431813457700 518.2155766324390 519.823513346336
-279.71207016838500 531.7446721639860 484.240629766611
-259.24117791020500 541.8367285151120 449.014948124588
-239.00970860829800 548.6904840829760 413.976780343287
-218.96623482661700 552.4832393130960 379.260454228704
-199.13368646014500 553.3595194667750 344.899655271289
-179.49937951068700 551.4224547392160 310.901650657030
-160.05853897239600 546.7258057477280 277.229604984912
-140.73497483322400 539.2644101927670 243.852173648710
-121.15977918590600 528.9596832738090 210.871041265296
-101.65161274937100 515.6373668302500 177.947981974895
-84.00653665377710 498.9885863466380 143.830455838681
-64.35915615835300 478.4857769773050 110.443195592555
-44.23457579408930 453.3382051141650 76.621451887220
-25.81056754057310 422.9803472875990 41.709372091224
-6.74982846277030 390.5455060023060 12.023208187747
];
x = data(:,1);
y = data(:,3);
z = data(:,2);
r = sqrt(x.^2+y.^2); % 绕z轴旋转,求各点到z轴的距离r,即旋转半径
n = length(z);
alpha = linspace(-pi,pi,n);
xx = r * cos(alpha); % 前面的x,y,z是列向量,r就是列向量,列向量*行向量生成n阶矩阵
yy = r * sin(alpha);
zz = z * ones(1,n);
mesh(xx,yy,zz) % 之后可以用hidden off来关闭透视效果。
%或者这里用surf(xx,yy,zz)来画也可以。
matlab曲线绕轴生成曲面的问题,急!
用动画演示曲线x=1-y^2 绕 x 轴旋转产生旋转曲面的过程!跪求高手解决!急!!!!
t=-2:0.01:1;
r=sqrt(1-t);
[y,z,x]=cylinder(r,30);
h=mesh(x,y,z);
colormap(jet)
axis on
n=12;
mmm=moviein(n);
for i=1:n
rotate(h,[1 0 0],25)
mmm(i)=getframe;
end
movie(mmm,10,10)
我是刚学matlab,请多多指教。。
k=100;
r=linspace(0,1);
t=linspace(0,2*pi,k);
[r,t]=meshgrid(r,t);
x=1-r.^2;
y=r.*sin(t);
z=r.*cos(t);
for n=2:k
mesh(x(1:n,:),y(1:n,:),z(1:n,:));
axis([0 1 -1 1 -1 1 -1 1]);
drawnow
end
MATLAB中如何设置坐标轴的显示长度
1. 绘制二维曲线的最基本函数plot
2.双纵坐标函数plotyy
3.
坐标控制
函数的调用格式为:
axis([xmin xmax ymin ymax zmin zmax])
axis函数功能丰富,常用的用法还有:
axis equal 纵、横坐标轴采用等长刻度
axis square 产生正方形坐标系(缺省为矩形)
axis auto 使用缺省设置
axis off 取消坐标轴
axis on 显示坐标轴
grid on/off命令控制是画还是不画网格线,不带参数的grid命令在两种状态之间进行切换。
box on/off命令控制是加还是不加边框线,不带参数的box命令在两种状态之间进行切换。
4.图形窗口的分割
subplot函数的调用格式为:
subplot(m,n,p)
5.绘制二维图形的其他函数
1. 其他形式的线性直角坐标图
在线性直角坐标系中,其他形式的图形有条形图、阶梯图、杆图和填充图等,所采用的函数分别是:
bar(x,y,选项)
stairs(x,y,选项)
stem(x,y,选项)
fill(x1,y1,选项1,x2,y2,选项2,…)
6.极坐标图
polar函数用来绘制极坐标图,其调用格式为:
polar(theta,rho,选项)
其中theta为极坐标极角,rho为极坐标矢径,选项的内容与plot函数相似。
7.对数坐标图形
MATLAB提供了绘制对数和半对数坐标曲线的函数,调用格式为:
semilogx(x1,y1,选项1,x2,y2,选项2,…)
semilogy(x1,y1,选项1,x2,y2,选项2,…)
loglog(x1,y1,选项1,x2,y2,选项2,…)
8.对函数自适应采样的绘图函数
fplot函数的调用格式为:
fplot(fname,lims,tol,选项)
9.绘制三维曲线的最基本函数
plot3函数与plot函数用法十分相似,其调用格式为:
plot3(x1,y1,z1,选项1,x2,y2,z2,选项2,…,xn,yn,zn,选项n)
10.三维曲面
1.平面网格坐标矩阵的生成
(1)利用矩阵运算生成。
x=a:dx:b; y=(c:dy:d)';
X=ones(size(y))*x;
Y=y*ones(size(x));
(2)利用meshgrid函数生成。
x=a:dx:b; y=c:dy:d;
[X,Y]=meshgrid(x,y);
10.绘制三维曲面的函数
surf函数和mesh函数的调用格式为:
mesh(x,y,z,c)
surf(x,y,z,c)
标准三维曲面
sphere函数的调用格式为:
[x,y,z]=sphere(n)
cylinder函数的调用格式为:
[x,y,z]=sphere(R,n)
MATLAB还有一个peaks 函数,称为多峰函数,常用于三维曲面的演示。
11.其他三维图形
条形图、饼图和填充图等特殊图形,它们还可以以三维形式出现,使用的函数分别是bar3、pie3和fill3。此外,还有三维曲面的等高线图。等高线图分二维和三维两种形式,分别使用函数contour和contour3绘制。
clear,clc,close all;
syms t u v w
p=[1 0 0];
z=poly2sym(p,t)
r=-5:0.5:5;
[U,V]=cylinder(r,100);
W=subs(z,t,sqrt(U.^2+V.^2));
mesh(U,V,W);
%colormap(winter)
matlab 如何画复杂函数绕y轴一周的柱面图?函数方程为两个正态分布之和y=A*exp(-x^2/2)+B*exp(-x^2)
不好意思啊,以前那个画法有错,我疏忽了。Cylinder(r,n)这个命令是画一个半径为r,高度为1的圆柱体。n表示圆柱体的圆周有指定的n个距离相同的点。r也可以为函数表达式。
y=exp(-x^2/2)+exp(-x^2)的值域为(0,2],用Cylinder(r,n)命令也可以画,不过高度就只有1了。首先要将半径的表达式求出来,y=exp(-x^2/2)+exp(-x^2)绕y轴旋转的半径
r=sqrt(-2/3*log(y)),整个命令如下
clear
y=realmin:0.01:2;%y不能为0;
[X,Y,Z]=cylinder(sqrt(-2/3*log(y)),30);
mesh(X,Y,Z)
不过效果不好,主要是坐标范围太大了。
现在用另一种方法来画
y=exp(-x^2/2)+exp(-x^2)绕y轴旋转所得的曲面方程为
y=exp(-(x.^2+z.^2)/2)+exp(-x.^2-z.^2);这个方程很容易算出来的,高数也有。
那么编程如下
x=-5:0.01:5;
y=-5:0.01:5;
[X,Y]=meshgrid(x,y);
Z=exp(-(X.^2+Y.^2)/2)+exp(-X.^2-Y.^2);
mesh(X,Y,Z);
这里我将y和z轴变换了,主要是因为这个图像比较复杂,计算机要对图像进行处理如放大缩小就会很慢,而好像matlab又默认z轴向上,这样画出图后还要旋转之后才看得舒服,将y和z轴变换了,就不用旋转了。你也可以自己去试一下
另外我也是刚学这个软件的,有很多问题不懂,有错的请见谅
展开阅读全文