空间图形绘制
对于下面的图形,已经给出了代码与详细注释,并没有给出具体画出的图形,建议初学者自己敲一下代码实现正确的图形显示
- %绘制空间曲线,利用plot3
- clf; %清除所有图形
- axis([0 20 * pi 0 20 * pi 0 20 * pi] )
- %表示x轴坐标范围:0-20*pi y:0-20*pi z :0-20*pi
- x = 0 : pi / 50 : 10 * pi;
- y1 = sin(x);
- y2 = cos(x);
- y3 = x;
- subplot(1, 2, 1), plot3(y1, y2, y3, 'r.');
- title('螺旋曲线');
- xlabel('x'), xlabel('y');
- grid on;
- x = 0.5 : 0.01 : 1.5;
- y1 = cos(x);
- y2 = sin(x);
- y3 = 1 ./ x;
- subplot(1, 2, 2), plot3(y1, y2, y3, 'b-');
- title('曲线');
- xlabel('x'), xlabel('y');
- grid on;
- %空间曲面的绘制
- x = -3 : 0.1 : 3;
- [X1, Y1] = meshgrid(x); %生成格点矩阵
- Z1 = sin(X1 + sin(Y1));
- subplot(1, 2, 1); mesh(X1, Y1, Z1); %mesh绘制空间曲面
- title('sin(x + sin(y))');
- x = -10 : 0.3 : 10;
- [X2, Y2] = meshgrid(x); %生成格点矩阵
- Z2 = X2 .^2 - 2 * Y2 .^2 + eps; %eps是一个很小的数字,避免出现此处为0的情况
- subplot(1, 2, 2); mesh(X2, Y2, Z2);
- title('马鞍面');
mesh,meshc meshz不同,自己对比画出图形的不同
- t = -8 : 0.3 : 8;
- [x, y] = meshgrid(t);
- r = sqrt(x.^2 + y.^2) + eps;
- z = sin(r) ./ r;
- subplot(1, 3, 1); meshc(x ,y, z);
- title('meshc') , axis( [ -8 8 -8 8 -0.5 0.8] );
- subplot(1,3,2) ,meshz(x,y,z), title('meshz' ) ,axis( [ -8 8 -8 8 -0.5 0.8] );
- subplot(1,3,3) ,mesh(x,y,z), title('mesh') , axis( [ -8 8 -8 8 -0.5 0.8] ) ;
surf:画表面图
- x = -10 : 0.3 : 10;
- [X2, Y2] = meshgrid(x); %生成格点矩阵
- Z2 = X2 .^2 - 2 * Y2 .^2 + eps; %eps
- subplot(1, 2, 1); mesh(X2, Y2, Z2);
- title('网格图');
- subplot(1, 2, 2); surf(X2, Y2, Z2);
- title('表面图');
- %空间平面的绘制
- t = -10 : 0.5 : 10;
- [x1, y1] = meshgrid(t);
- z1 = 5 * ones(length(t)); %ones(n)是生成阶数为n的矩阵
- subplot(1, 2, 1); mesh(x1, y1, z1); title('z1 = 5');
- t = -1 : 0.1 : 1
- [x2, y2] = meshgrid(t);
- z2 = 5 - 2 * x2 + 3 * y2;
- subplot(1, 2, 2); mesh(x2, y2, z2); title('2 * x2 + 3 * y2 + z2 = 5');
- %求两平面的交线
- x = -10 : 0.1 : 10;
- [x1, y1] = meshgrid(x); %生成格点矩阵
- z1 = x1 .^2 - 2 * y1 .^2 + eps;
- subplot(1, 3, 1); mesh(x1, y1, z1);
- title('马鞍面');
- a = input('a = (-50 < a < 50)'); %动态输入,在控制台输入即可
- z2 = a * ones(length(x));
- subplot(1, 3, 2); mesh(x1, y1, z2); title('平面');
- r0 = abs(z2 - z1) <= 1; % r0只可能为1:表示两图形间距小于1侧认为重合 或者r0为0:不重合
- z3 = r0 .* z2; y3 = r0 .* y1; x3 = r0 .* x1;
- subplot(1, 3, 3);
- plot3(x3(r0 ~= 0), y3(r0 ~= 0), z3(r0 ~= 0), 'x');
- title('交线');
- %球面
- v = [ -2 2 -2 2 -2 2 ] ;
- subplot (1 ,2 ,1 ), sphere(30), title('半径为1的球面');
- axis(v); %控制坐标系
- %半径为3的球面
- [x, y, z] = sphere(30);
- subplot (1, 2 ,2 ) , surf( 2*x , 2*y ,2*z)
- title('半径为2的球面'), axis(v); %控制坐标系,上面已经讲过
- %绘制柱面
- r = - 1: .1: 1; subplot (1,2,1 ), cylinder(1, 50 ) , title('柱面')
- subplot (1 ,2 ,2 ), cylinder( sqrt(abs(r)) , 50 ) , title ('旋转曲面');
下面给出几个练习题,里面出现的语句基本已经全部在前面讲过,如果发现不懂的地方,请再去看看前面的内容
- %test_1 :观察x^u当u取不同的值时的图像的特点
- %方法一
- t = -10 : 1 : 10;
- [x, y] = meshgrid(t);
- for j = 1 : 1 : 6
- z = x .^ j;
- surf(x, y, z);
- axis([-10 10 -10 10 -10 10]);
- hold on;
- end
- %方法二
- x = -10 : 0.1 : 10;
- for j = 1 : 1 : 6
- y = x .^j;
- plot(x, y);
- axis([-10 10 -10 10]);
- %axis equal;
- xlabel('x');
- ylabel('y');
- hold on;
- end
- %test_2 :观察plot与fplot画图的区别
- figure(1);1
- x = -4 : 0.1 : 4;
- y = x .^2 .* sin(x);
- plot(x, y, 'b-');
- figure(2);
- fplot('x .^2 .* sin(x)', [-4, 4], 'r.');
- %test_3 :用黄色,数据点为钻石画出3 * cos(x) * exp(sin(x))
- x = 0 : 0.1 : 5;
- y = 3 * cos(x) .* exp(sin(x));
- plot(x, y, 'yd--');
- %test_4:运用xlabel ylabel gtext axis legend title画出图形xsin(x), x*tan(1/x)*sin(x^3), x^3, tan(x) + sin(x)
- x = -pi : pi / 50 : pi;
- y = x .* sin(x);
- plot(x, y, 'b-');
- hold on; %只用写一次即可
- x = pi : pi / 50 : 4 * pi;
- y = x .* tan(1 ./ x) .* sin(x .^ 3);
- plot(x, y, 'r-');
- x = 1 : 0.1 : 8;
- y = x .^ 3;
- plot(x, y, 'k-');
- x = 1 : 0.1 : 8;
- y = tan(x) + sin(x);
- plot(x, y, 'g-');
- xlabel('x'), xlabel('y'), title('xsin(x) x*tan(1/x)*sin(x^3) x^3 tan(x) + sin(x)'),axis([-5 10 -4 15]);
- gtext('xsin(x)'), gtext('x*tan(1/x)*sin(x^3)'), gtext('x^3'), gtext('tan(x) + sin(x)');
- legend('xsin(x)', 'x*tan(1/x)*sin(x^3)', 'x^3', 'tan(x) + sin(x)');
- %test_6:在同一个图形窗口画出半径为一的球面,z = 4的平面马鞍面z = 2*x^2 - y^2
- subplot (2, 2, 1 ), sphere(30);
- title('半径为1的球面');
- axis([ -2 2 -2 2 -2 2 ]); %控制坐标系
- t = -2 : 0.1 : 2;
- [x, y] = meshgrid(t);
- z = 4 * ones(length(t));
- subplot(2, 2, 2); mesh(x, y, z);
- title('z = 4的平面');
- t = -2 : 0.1 : 2;
- [x, y] = meshgrid(t);
- z = 2 * x .^2 - y .^2;
- subplot('position' , [0.2,0.05,0.6,0.45] ) , mesh(x, y, z), title('马鞍面'); grid on;
- %test_7
- %求两平面的交线:马鞍面3x^3 - 2y^2与z =4的平面
- x = -10 : 0.1 : 10;
- [x1, y1] = meshgrid(x); %生成格点矩阵
- z1 = 3 * x1 .^2 - 2 * y1 .^2 + eps;
- subplot(1, 3, 1);
- mesh(x1, y1, z1);
- title('马鞍面');
- z2 = 4 * ones(length(x));
- hold on;
- subplot(1, 3, 2);
- mesh(x1, y1, z2); title('平面');
- r0 = abs(z2 - z1) <= 1; %r0
- z3 = r0 .* z2; y3 = r0 .* y1; x3 = r0 .* x1;
- subplot(1, 3, 3);
- plot3(x3(r0 ~= 0), y3(r0 ~= 0), z3(r0 ~= 0), 'x');
- title('交线');