前言:
小白路过,只是想在学习高等数学三重积分时让图像更直观一些,在网上粗略学习了一下MATLAB,本图来自张宇高数18讲例18.11
代码:
首先创建一个函数文件isocurve3,用以绘制交线:
- function [nX,nY,nZ]=isocurve3(X,Y,Z,f1,f2)
- % 获取f1隐函数的三角面和三角顶点
- V1=f1(X,Y,Z);
- hel=isosurface(X,Y,Z,V1,0);
- % 将f1获取的三角顶点带入f2求得数值
- V2=f2(hel.vertices(:,1),hel.vertices(:,2),hel.vertices(:,3));
- % 检查三个顶点的数值是否同时含有有大于0数值及小于0数值
- mask=V2>0;
- outcount=sum(mask(hel.faces),2);
- cross=(outcount==2)|(outcount==1);
- crossing_tris=hel.faces(cross,:);
- % 通过旋转交换三个顶点次序,将小于0的点放在第一列
- out_vert=mask(crossing_tris);
- flip=sum(out_vert,2)==1;
- out_vert(flip,:)=1-out_vert(flip,:);
- ntri=size(out_vert,1);
- overt=zeros(ntri,3);
- for i=1:ntri
- v1i=find(~out_vert(i,:));
- v2i=1+mod(v1i,3);
- v3i=1+mod(v1i+1,3);
- overt(i,:)=crossing_tris(i,[v1i v2i v3i]);
- end
- % 类似于求重心
- u=(-V2(overt(:,1)))./(V2(overt(:,2))-V2(overt(:,1)));
- v=(-V2(overt(:,1)))./(V2(overt(:,3))-V2(overt(:,1)));
- uverts=repmat((1-u),[1 3]).*hel.vertices(overt(:,1),:)+repmat(u,[1 3]).*hel.vertices(overt(:,2),:);
- vverts=repmat((1-v),[1 3]).*hel.vertices(overt(:,1),:)+repmat(v,[1 3]).*hel.vertices(overt(:,3),:);
- % 因为可能含有多条曲线,因此逐段连线
- nX=nan(3,ntri);
- nX(1,:)=uverts(:,1)';
- nX(2,:)=vverts(:,1)';
- nY=nan(3,ntri);
- nY(1,:)=uverts(:,2)';
- nY(2,:)=vverts(:,2)';
- nZ=nan(3,ntri);
- nZ(1,:)=uverts(:,3)';
- nZ(2,:)=vverts(:,3)';
- end
然后,创建主文件,绘制曲面及交线:
- clear all
- clc
-
- u = 0; %控制坐标区间
- lmax = 2; hmax = 4;
- if u == 0
- lx = lmax; tx = -lx; %tx:x负半轴长;lx:x正半轴长
- ly = lx; ty = -ly; % 全轴
- lz = hmax; tz = 0;
- elseif u == 1
- lx = lmax; tx = 0;
- ly = lx; ty = 0; % 正半轴
- lz = hmax; tz = 0;
- else
- lx = 0; tx = -lmax;
- ly = 0; ty = tx; % 负半轴
- lz = 0; tz = -hmax;
- end
-
- for i = 1:4
- subplot(2,2,i) %绘制四个视图
-
- f1 = @(x,y,z) 2*x - z; %绘制隐函数曲面
- f2 = @(x,y,z) x.^2 + y.^2 - z;
- fimplicit3(f1,[tx lx ty ly tz lz],'EdgeColor','none',...
- 'FaceColor','cyan')
- hold on
- fimplicit3(f2,[tx lx ty ly tz lz],'EdgeColor','none',...
- 'FaceColor','y')
- alpha(0.3) %曲面透明度
- axis equal
-
- [X,Y,Z]=meshgrid(-5:.1:5); %绘制交线
- [nX,nY,nZ]=isocurve3(X,Y,Z,f1,f2);
- line(nX(:),nY(:),nZ(:),'LineWidth',1.5,'Color',[0.5,0,1]);
-
-
- hold on %绘制XYZ轴
- plot3([tx,0,lx],[0,0,0],[0,0,0],'r',[0,0,0],[ty,0,ly],...
- [0,0,0],'g',[0,0,0],[0,0,0],[tz,0,lz],'b')
- xlabel('x轴');ylabel('y轴');zlabel('z轴');
-
- if i == 1
- title('三维图')
- elseif i == 2
- view([1,0,0])
- title('yOz平面')
-
- elseif i == 3
- view([0,-1,0])
- title('xOz平面')
- else
- view([0,0,1])
- title('xOy平面')
- end
- axis equal
- hold off
- end
展示效果:
PS:交线部分的函数来自这位大佬https://blog.csdn.net/slandarer/article/details/125710021
我也是小白,很多错误不是很了解