1樓:匿名使用者
1 不同的顏色 hsv 2 用球(點)的大小來代表資料大小 plot3 三維構圖
2樓:追憶小土豆
圖形三維立體視覺化在matlab中的實現和處理
三維圖形的繪製除了常用的網格圖、表面圖和等高線等方法外,matlab還提供了一些立體視覺化函式用於繪製更為複雜的立體和向量物件。
這些函式通常在三維空間中構建標量和向量的圖形:
由於這些函式構建的[b][color=red]是立體而不是一個簡單的曲面[/color][/b],因此它們需要三維陣列作為引數,其中三維陣列的每一維分別代表一個座標軸,三維陣列中的點定義了座標軸柵格和座標軸上的座標點。
[b][color=blue][size=4]所謂標量圖形[/size][/color][/b],就是由一個數學表示式所確定的三維立體圖形,比如v=sqrt(x^2+cos(y)^2+z^2)+z,當v取不同值時的影象。像這樣的隱式三維圖形在matlab中是沒法直接繪製的。感興趣的網友可以看看這個帖中對隱函式繪圖的討論
如果要繪製的函式是一個標量函式,則繪製函式需要4個三維陣列,其中3個陣列各代表一個座標軸,第四個陣列代表了這些處的標量資料,這些陣列通常記做x、y、z和v。
[b][size=4][color=blue]所謂向量圖[/color][/size][/b],就是在圖形在滿足某個方程同時,還具有方向性,比如散度(divergence)、旋度(curl),梯度(gradient)等
如果要繪製的函式是一個向量函式,則需要6個三維陣列,其中3個各表示一個座標軸,剩下3個用來表示座標點處的向量,這些陣列通常記做x、y、z、u、v和w。
要正確合理的使用matlab提供的立體和向量視覺化函式,我們必須對與立體和向量有關的一些術語有所瞭解。
比如散度(divergence)、旋度(curl)等用於描述向量過程,而等值面(isosu***ces)和等值頂(isocaps)則用於描述立體的視覺外觀。
如果我們要生成和處理比較複雜的立體物件,就需要參考相應的文獻對這些術語進行深入的瞭解。
[b][color=blue]由於向量立體視覺化,具有相當的專業背景,比如:流體力學,空氣動力學,場論和向量等,故下面我們只是介紹[color=red]標量三維立體視覺化[/color],感興趣的網友可以直接檢視matlab的幫助文件[/color][/b]
在下面的內容我們主要介紹以下內容:
2# 如何生成三維立體資料
3# 三維立體截面圖
4# 三維立體等值面
5# 三維立體資料平滑化
如何生成三維立體資料
我們考查如下三維立體圖形的性質
v=v=f(x,y,z)=(x+y+z)(xy+xz+yz)-10xyz
當v取不同值時,會對應不同的[b][color=red]曲面圖形[/color][/b],但是假如說我們將v取為[b][color=red]一個區間的連續值[/color][/b]時,那麼就得到了一個由許多曲面構成的[b][color=red]三維立體[/color][/b]了
我們現在感興趣的就是那個由許多曲面組成的[b][color=red]三維立體[/color][/b],因為matlab為它們提供了相關的直接的函式
但是有時我們不對整個立體感興趣,[b][color=red]只對某個曲面感興趣[/color][/b],問題就出在這裡,matlab中[b][color=red]沒有提供[/color][/b]三維隱函式繪圖的直接函式,但是我們可以間接的獲得,那就是從立體中擷取出某個我們感興趣的曲面,[color=blue]這就是說matlab對三維曲面的視覺化(特別是隱式的)必須先立體化處理,然後再擷取我們感興趣的[/color]
下面我們看一個利用上面提到的標量函式構建立體圖形的例子。首先,我們必須生成一個構建立體物件的座標系:
[code]x=0:0.5:10;
y=x;
z=x;
[x,y,z]=meshgrid(x,y,z);[/code]
上面的**演示使用meshgrid函式在三維空間中的應用。其中xyz為定義柵格的3個三維陣列,它們是由xyz經過三維柵格擴充套件形成的。也就是說,x是將x複製擴充套件成具有length(y)行和length(z)頁的三維陣列;y是先將y轉置為一個列向量,然後複製擴充套件成為具有length(x)列和length(z)頁的三維陣列;z則是先將z轉換為1×1×length(z)的三維向量,然後擴充套件成為length(y)行和length(x)列的三維陣列。
下面我們還需要定義一個以三維陣列為自變數的標量函式v:
[code]v=(x+y+z).*(x.*y+x.*z+y.*z)-10*x.*y.*z;[/code]
好,[b][color=blue]這就得到立體視覺化的需要的資料x、y、z和v了[/color][/b],下面就是對我們感興趣的部分或者曲面進行視覺化和處理了
三維立體截面圖
在2#中我們利用標量函式v=f(x,y,z)=(x+y+z)(xy+xz+yz)-10xyz定義一個立體物件,並準備所需的所有資料,為了使該立體物件視覺化,我們可以利用下面的命令檢視該立體物件的一些截面。
v=(x+y+z)(xy+xz+yz)-10xyz=0的圖形大概如下:
[align=center][attach]1187[/attach][/align]
[align=center][attach]1188[/attach][/align]
[align=center][b][size=5][color=blue]三維立體平面擷取[/color][/size][/b][/align][code]slice(x,y,z,v,[6 8],[5 9],[3 5])%擷取x=6和8,y=5和9,z=3和5等6個截面檢視
xlabel('x')
ylabel('y')
zlabel('z')[/code]
[align=center][attach]1184[/attach][/align]
從圖中我們可以看到命令為我們擷取x=6和8,y=5和9,z=3和5等6個截面檢視,注意圖中的顏色是根據v的自動繪製的。
在上面我們演示了立體圖形的平面截面,在立體影象中,也可以顯示立體圖形的曲面截面。[code][xs,ys]=meshgrid(x,y);
zs=sin(-xs+ys/2);
slice(x,y,z,v,xs,ys,zs)%採用正弦函式擷取立體圖形的截面,也就是擷取滿足方程z=sin(-x+y/2)的曲面
xlabel('x')
ylabel('y')
zlabel('z')
[/code][align=center][attach]1185[/attach][/align]
除了截圖平面和曲面以外,還可以使用contourslice函式為擷取的平面新增等高線[code]slice(x,y,z,v,[7 3],[5 9],[3 5])
hold on
h=contourslice(x,y,z,v,7,[5 9],5);%在x=7,y=5和9,z=5截面上新增等高線
set(h,'edgecolor','k','linewidth',1.5)%設定等高線的的顏色和線寬
xlabel('x')
ylabel('y')
zlabel('z')[/code][align=center][attach]1189[/attach][/align]
三維立體等值面圖——三維隱函式繪圖
我們總是罵mathworks真是該死,什麼函式只要能想得到的就一定有,可以卻偏偏沒有提供三維隱函式的繪圖
呵呵其實,matlab雖然沒有提供直接的繪製三維隱函式圖形的函式,但是我們可以使用[b][color=red]等值面[/color][/b]圖來繪製
[b][color=blue][size=4]所謂等值面圖[/size][/color][/b],就是v=f(x,y,z)=c,這個c的值確定的時候的曲面圖形,它只是三維立體v中的一個曲面而=,相當於3#的擷取了一個特殊的曲面而已
除了檢視立體物件的截面之外,尋找使v等於某個特定值的表面(等值面),也十分常見。在matlab中,這以操作可以使用isosu***ce()函式來實現,該函式與delaunay函式類似,也是返回若干三角形的頂點。將isosu***ce函式返回的引數傳遞給patch函式,就可以繪製出有這些三角形構成的等值面了。
[code][x,y,z,v]=flow(13);
fv=isosu***ce(x,y,z,v,-2);%顯示v=-2等等值面
subplot(121)
p=patch(fv);
set(p,'facecolor',[0.5 0.5 0.5],'edgecolor','k');
view(3)
axis equal tight
grid on
subplot(122)
p=patch(shrinkfaces(fv,0.3));%shrinkfaces功能是使表面收縮
set(p,'facecolor',[0.5 0.5 0.5],'edgecolor','k');
view(3)
axis equal tight
grid on[/code][align=center][attach]1190[/attach][/align]
當我們顯示的立體圖形僅僅是為了觀察大體結構時,就沒有必要針對所有的資料點作圖,因為資料點太多會降低顯示速度。[color=blue]利用matlab中的reducevolume()和reducepatch()函式可以使用圖形在顯示之前刪除一些資料點或者對一些圖形顯示影響很小的碎片,從而提高圖形顯示效率[/color]。
再比如說,我們要繪製三維隱函式x^2+y^2+z^2=5的球體的圖形,由於matlab沒有提供直接的繪製三維隱函式圖形的函式,故我們只能通過三維立體的等值面來擷取,雖然繪製等值面比較麻煩且得到的圖形不是很漂亮,但至少比沒有好
[b]1、構建三維立體模型[/b]
v=x^2+y^2+z^2-5;
[b]2、獲取三維立體資料[/b][code][x,y,z]=meshgrid(-10:0.5:10);
v=x.^2+y.^2+z.^2-5;[/code][b]3、繪製等值面[/b][code]%x^2+y^2+z^2=5相當於v=0的等值面
fv=isosu***ce(x,y,z,v,0);%顯示v=0等等值面
p=patch(fv);
set(p,'facecolor','red','edgecolor','none');%設定圖形的相關屬性
view(3)
camlight
lighting gouraud
axis equal tight[/code][align=center][attach]1191[/attach][/align]
三維立體資料平滑化
三維資料也可以通過smooth3()函式來過濾而實現其平滑化[code]data=rand(10,10,10);
datas=smooth3(data,'box',3);%box是光滑方法,matlab中提供可好幾種方法,具體檢視幫助
subplot(121)
p=patch(isosu***ce(data,0.5));
patch(isocaps(data,0.5));
isonormals(data,p);
camlight
lighting phong
axis vis3d off
view(3)
subplot(122)
p=patch(isosu***ce(datas,0.5));
patch(isocaps(datas,0.5));
isonormals(datas,p);
camlight
lighting phong
axis vis3d off
view(3)[/code]上面用到的isocaps和isonormals函式的用法如下:
isocaps生成塊狀圖的外層表面,而isonormals調整所畫碎片的屬性,使所顯示的圖形有正確的光照效果
matlab中怎樣將三維陣列的維賦給二維如A1)賦給二維的B
1,直接賦值 b a 1 試了一下可以。2.先用次sum求每行元素和,因為要求 每個元素都除以每列之和 所以得用1次for迴圈 1 三維陣列中的各個為也是二維陣列,所以賦值可以直接賦即可!假設a是三維陣列,b是二維陣列 b a 1 b a 2 b a 3 分別把a的三維中的 一 二 三維賦給b。2 ...
C Builder中如何實現三維圖形
用directx d3d 或者opengl來做,前者最常見於windows,後者偏向多平臺。dx的自學教材相對多一些。開發裝置需要裝上相關的二進位制支援檔案 exe dll lib等 和sdk h cpp等 真正開發時建議使用將directx opengl封裝好的庫以便減少不必要的工作。c buil...
求助matlab中如何畫這樣三維圖形
例如 x 0 1 10 y 0 0.5 6 x,y meshgrid x,y 生成13 11的矩陣z 1 143 z值是隨意的,你可以用自己的版資料z reshape z,13,11 變為權13 11矩陣surf x,y,z x 0 0.5 100 y 0 2.0 12.0 x,y meshgrid...