matlab的三維繪圖和四維繪圖
一、三維繪圖
1.曲線圖
- plot3(X1,Y1,Z1,...):以預設線性屬性繪製三維點集(X1,Y1,Z1)確定的曲線
- plot3(X1,Y1,Z1,LineSpec):以引數LineSpec確定的線性屬性繪製三維點集
- plot3(X1,Y1,Z1,'PropertyName',PropertyValue,...):根據指定的屬性繪製三維曲線
theta = 0:0.01*pi:2*pi; x = sin(theta); y = cos(theta); z = cos(4*theta); plot3(x,y,z,'LineWidth',2); hold on; theta = 0:0.02*pi:2*pi; x = sin(theta); y = cos(theta); z = cos(4*theta); plot3(x,y,z,'rd','MarkerSize',10,'LineWidth',2);
2.網格圖
繪製函式z=f(x,y)的三維網格圖的過程:
- 確定自變數x和y的取值範圍和取值間隔
- 利用meshgrid函式生成“格點”矩陣
- 計算自變數取樣“格點”上的函式值:Z = f(x,y)
matlab中提供了mesh函式用於實現繪製網格圖:
- mesh(X,Y,Z):繪製三維網格圖,顏色與曲面的高度相匹配
- mesh(Z):系統預設顏色與網格區域的情況下繪製資料Z的網格圖
- mesh(...,C,'PropertyName',PropertyValue):對指定的顏色C,指定的屬性值,畫出三維圖形
- meshc(...):用於畫網格圖與基本的等值線圖
- meshz(...):用於繪製包含零平面的網格圖
- h = mesh(...):返回圖形物件控制代碼屬性值向量h
[X,Y] = meshgrid(-3:.5:3); Z = 2 * X.^2-3 * Y.^2; subplot(2,2,1) plot3(X,Y,Z) title('plot3') subplot(2,2,2) mesh(X,Y,Z) title('mesh') subplot(2,2,3) meshc(X,Y,Z) title('meshc') subplot(2,2,4) meshz(X,Y,Z) title('meshz') set(gcf,'Color','w');
3.曲面圖
表示三維空間內資料的變化規律。函式有surf、surfc和surfl
- surf(X,Y,Z):繪製三維的彩色曲面圖。
- surf(X,Y,Z,C):圖形的顏色採用引數C,同樣可以新增屬性值
[x,y] = meshgrid(-3:1/8:3);
z = peaks(x,y);
subplot(2,2,1);surf(z);
title('surf(z)繪製形式');
subplot(2,2,2);surf(x,y,z);
title('surf(x,y,z)繪圖形式');
subplot(2,2,3);surfl(x,y,z);
title('surfl(x,y,z)繪圖形式');
subplot(2,2,4);surfc(x,y,z);
title('surfc(x,y,z)繪圖形式');
4.光照模型
光照是利用方向官員照亮物體的技術,這項技術能使表面微妙的差異更容易看到,光照也能用來對三維的影象增加現實感。
camlight函式:
- camlight('light'):在照相機的右上方設定一個光源
- camlight('light'):在照相機的左上方設定一個光源
- camlight(az,el):建立一個相對於照相方位角az與仰角el的光源
- camlight(...,'style'):設定光源的型別為'local'或‘infinite’
- light_handle = camlight(...):返回光源的控制代碼值
surf(peaks)
axis vis3d
h = camlight('left');
for i = 1:20;
camorbit(10,0)
camlight(h,'left')
pause(.1)
end
light函式:
- light('PropertyName',propertyvalue,...):可設定的光源的屬性有color,style,position
- handle = light(...):返回光源的控制代碼值
% 準備資料
[X,Y] = meshgrid(-1:0.1:1);
Z = sin(X.^2.*pi) + cos(Y.*pi);
% 設定無限遠平行光源光照效果
subplot(1,2,1);
surf(X,Y,Z);
light('Style','infinit','Position',[0 -0.6 1]);
title('無限遠平行光')
% 設定本地光源輻射源光照效果
subplot(1,2,2);
surf(X,Y,Z);
light('Style','local','Position',[0 -0.6 1]);
title('本地輻射光')
lighting函式:
- lighting flat:為入射光均勻灑落在圖形物件的每個面上,主要與faced配合使用
- lighting gouraud:先對定點顏色插補,在對定點勾畫的面色進行插補,用於曲面表現
- lighting phong:對定點出的法線插值,在計算個畫素的反光,效果好,但費時
- lighting none:關閉所有光源
[x,y,z] = sphere(25);
subplot(2,2,1);surf(x,y,z);
axis equal;shading interp;
hold on;
title('lighting none')
subplot(2,2,2);surf(x,y,z);
axis equal;
light('position',[0,0.5 1]);
shading interp;lighting flat;
hold on;
title('lighting flat');
subplot(2,2,3);surf(x,y,z);
axis equal;
light('position',[0,0.5 1]);
shading interp;lighting gouraud;
hold on;
title('lighting gouraud');
subplot(2,2,4);surf(x,y,z);
axis equal;
light('position',[0,0.5 1]);
shading interp;lighting phong;
hold on;
title('lighting phong');
set(gcf,'color','w');
lightangle函式:
- lightangle(az,el):az與el表示燈光的方位角和仰角
- light_handle = lightangle(az,el):返回球形座標光源的控制代碼值
sphere(25);
axis vis3d
h = light;
for az = -50:10:50
lightangle(h,az,30)
pause(.2)
end
5.等值線
等值線圖又叫等高線圖。預設情況下,MATLAB就是畫出了相應於一系列相等的空間Z值得等值線。matlab提供了contour和contour3函式繪製二維和三維的等高線。下面的格式contour換成contour3就是三維的等值線。
- contour(z):直接繪製矩陣z的等高線
- contour(x,y,z):用x和y指定等高線的x,y座標
- contour(z,n)或contour(x,y,z,n):用標量n指定繪製等高線的線條數,即從最低位置到最高位置所用的線條總數
- contour(z,v)或contour(x,y,z,v):向量v中的元素指定繪製等高線的位置,該向量的長度對應繪製的線條數
- [c,h] = contour(...):返回等高線矩陣c和列向量h,h是線條物件或補片物件的控制代碼。
6.三維特殊圖形
MATLAB中,也提供了相應的函式用於實現特殊數的三維繪圖。
t = 0:pi/10:2*pi;
[X1,Y1,Z1] = cylinder(2 + cos(t));
subplot(2,3,1);surf(X1,Y1,Z1)
axis square;title('三維柱面圖');
subplot(2,3,2);sphere
axis equal;title('三維球體');
x1 = [1 3 0.5 2.5 2];
explode = [0 1 0 0 0];
subplot(2,3,3);pie3(x1,explode)
title('三維餅圖');axis equal;
X2 = [0 1 1 2;1 1 2 2;0 0 1 1];
Y2 = [1 1 1 1;1 0 1 0;0 0 0 0];
Z2 = [1 1 1 1;1 0 1 0;0 0 0 0];
C = [0.5000 1.0000 1.0000 0.5000;
1.0000 0.5000 0.5000 0.1667;
0.3330 0.3330 0.5000 0.5000];
subplot(2,3,4);fill3(X2,Y2,Z2,C);
colormap hsv
title('三維填充圖');axis equal;
[x2,y2] = meshgrid(-3:.5:3,-3:.1:3);
z2 = peaks(x2,y2);
subplot(2,3,5);ribbon(y2,z2)
colormap hsv
title('三維綵帶圖');axis equal;
[X3,Y3] = meshgrid(-2:0.25:2,-1:0.2:1);
Z3 = X3 .* exp(-X3.^2 - Y3.^2);
[U,V,W] = surfnorm(X3,Y3,Z3);
subplot(2,3,6);quiver3(X3,Y3,Z3,U,V,W,0.5);
hold on
surf(X3,Y3,Z3);
colormap hsv
view(-35,45);
title('三維向量場圖');axis equal;
set(gcf,'Color','w');
7.視角設定
從不同的角度觀察物體,所看到的物體形狀是不一樣的。同樣,從不同視點繪製的三維圖形其形狀也是不一樣的。
視點的位置可由方位角和仰角表示。方位角又稱旋轉角,它是視點與原點連線在xy平面上的投影與y軸負方向形成的角度,正值表示逆時針,負值表示順時針。仰角又稱為視角,它是視點與原點連線與xy平面的夾角,正值表示視點在xy平面上方。負值表示視點在xy平面下方。
matlab中提供了view和rotate函式用於設定觀察圖的視角。view函式用於調整圖形的視角效果。
- view(az,el)或view([az,el]):az帶表方位角,el代表視角
- view([x,y,z]):在直角座標中設定視角的座標為(x,y,z)
- view(2)或view(3):分別使用matlab中預設的二維視角設定(az=0,el=90)和三維視角設定(az=-38.5,el=30)
- view(ax,...):使用ax軸代替當前軸顯示圖的視角
- [az,el] = view:返回圖形的視角與俯視角值
- T = view:返回一個4x4階的當前變換矩陣
x = -5:0.5:5;
[x,y] = meshgrid(x);
z = x.^2-y.^2-2;
subplot(2,2,1);surf(x,y,z);
view(-38.5,30);
title('方位角為-38.5,俯視角為30');
subplot(2,2,2);surf(x,y,z);
view(-38.5+90,30);
title('方位角為-38.5+90,俯視角為30');
subplot(2,2,3);surf(x,y,z);
view(-38.5,60);
title('方位角-38.5,俯視角為60');
subplot(2,2,4);surf(x,y,z);
view(180,0);
title('方位角為180,俯視角為0');
set(gcf,'color','w'); % 設定圖形的背景顏色
rotate函式用於旋轉三維圖形,函式的格式為
- rotate(h,direction,alpha):將圖形的控制代碼值h的物件繞方向旋轉一個角度,h表示是被旋轉的對;direction有兩種設定方法,球座標設定法,將其設定為[theta,phi],其單位為‘度’;直角座標法,也就是[x,y,z];引數alpha是繞方向按照右手法則旋轉的角度。
- rotate(...,origin):引數origin為方向軸的“支點”座標,系統預設為座標原點。
sp11 = subplot(2,2,1);
hll = surf(sp11,peaks(20));
title('無旋轉')
sp12 = subplot(2,2,2);
h12 = surf(sp12,peaks(20));
title('繞x軸旋轉')
zdir = [1 0 0];
rotate(h12,zdir,25)
sp21 = subplot(2,2,3);
h21 = surf(sp21,peaks(20));
title('繞Y軸旋轉')
zdir = [0 1 0];
rotate(h21,zdir,25)
sp22 = subplot(2,2,4);
h22 = surf(sp22,peaks(20));
title('繞X-Y軸旋轉')
zidr = [1 1 0];
rotate(h22,zdir,25)
set(gcf,'color','w');
二、四維繪圖
在MATLAB中,提供了meshgrid、slice、contourslice函式,可充分體現四維圖形的效果。
1.slice函式
matlab提供了中表現四維空間的方式,即使用色彩,這種方式需要使用者呼叫slice函式來顯示“切片”圖。
- slice(V,sx,sy,sz):繪製立體V在x軸,y軸,z軸方向上與sx,sy,sz向量所對應點的切片圖。其中V為mxnxp的三維立體陣列。
- slice(X,Y,Z,V,X1,Y1,Z1):沿著由陣列X1,Y1與Z1定義的曲面繪製穿過立體V的切片。
- slice(...,'method'):指定內插的方法,method以下方法之一
- slice(axes_handle,...):在控制代碼值axes_handle的座標值中繪製立體切片圖
- h = slice(...):返回組成立體切片圖的surface圖形物件控制代碼值向量h.
[x,y,z] = meshgrid(-2:.2:2,-2:.25:2,-2:.16:2);
v = x.*exp(-x.^2-y.^2-z.^2);
xslice = [-1.2,.8,2];
yslice = 2;
zslice = [-2,0];
[xsp,ysp,zsp] = sphere;
slice(x,y,z,v,[-2,2],2,-2)
for i = -3:.2:3
hsp = surface(xsp + i,ysp,zsp);
rotate(hsp,[1 0 0],90)
xd = get(hsp,'XData');
yd = get(hsp,'YData');
zd = get(hsp,'ZData');
delete(hsp)
hold on
hslicer = slice(x,y,z,v,xd,yd,zd);
axis tight
xlim([-3,3])
view(-10,35)
drawnow
delete(hslicer)
hold off
end
2.contourslice函式
用於實現三元函式切面等高線的效果圖。
contourslice(X,Y,Z,V,Sx,Sy,Sz):X,Y,Z是維數為m x n x p的自變數“格點”陣列;V是與X,Y,Z同維的函式值陣列;Sx,Sy,Sz是決定切片位置的數值向量。假如取空陣,就表示不取切片。
[x y z v] = flow;
h = contourslice(x,y,z,v,[1:9],[],[0],linspace(-8,2,10));
axis([0,10,-3,3,-3,3]);daspect([1,1,1])
camva(24);
camproj perspective;
campos([-3,-15,5])
set(gcf,'Color',[.5,.5,.5],'Renderer','zbuffer')
set(gca,'Color','black','XColor','white',...
'YColor','white','Zcolor','white')
box on