1. 程式人生 > >matlab的三維繪圖和四維繪圖

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