2015-06-26 223 views
4

在流線圖中,您如何繪製色帶本身的邊緣,而不是每張臉的邊緣?MATLAB streamribbon邊緣顏色

例如:

figure 
load wind 
[sx sy sz] = meshgrid(80,20:10:50,0:5:15); 
h = streamribbon(x,y,z,u,v,w,sx,sy,sz); 
axis tight 
shading interp; 
view(3); 
camlight 
lighting gouraud 

產地: Raw output

如果我添加set(h,'edgecolor','k')

我得到: Output with edge turned to 'k'

而我要找的東西像這樣的(頂部和圖像的左右兩側已編輯用GIMP,做出什麼我追逐的點): Edited with gimp

+0

你想只是邊緣或eddges和麪(如您最後一張圖片)? PD:無主之地。 –

+0

我不認爲有一個簡單的方法來解決這個問題。 'streamribbon'返回的句柄是每個功能區的表面句柄。在那裏,知道邊緣是否在邊界內並繪製(但不是內部的邊界)絕對不是直截了當的。我想你可以編寫一個代碼來獲取表面,並告訴你哪些點位於該表面的邊緣,然後你可以在那裏繪製3D線。計算上我並不便宜,但非常好的評論。 –

+0

@AnderBiguri。有用。確實很好的結果。而且從計算角度來看,這不是最糟糕的,因爲我們只需要重新使用/重新排序現有數據(沒有新的計算)。 – Hoki

回答

2

正如評論說,有照明的一些邊緣沒有簡單的方法絲帶表面,而不是其他。

但是,色帶表面只是由邊上的點定義的,所以它只是檢索這些點並重新組織它們(內聯它們)以獲得3D線的完美座標集。
要獲得關閉配置文件,我們只需要複製配置文件末尾的第一個點。

我把它打包成一個函數,它將返回一組尺寸與色帶手柄陣列相同的handles,並將任何可以發送到內部plot3函數的附加參數傳送出去。這樣的使用是非常簡單:

所以使用完全相同比的問題相同的代碼(其檢索色帶表面手柄的在可變h陣列),增加:

hs = StreamEdges(h , 'k','Linewidth',1) ; 

會產生:
streamborder

當然,你總是可以得到瘋狂和組設置您的線路屬性:

set(hs,'LineWidth',1,'Color','c') 
%// or 
set(hs,'LineWidth',2,'Color','r','Marker','none') 

other edges


代碼功能StreamEdges.m

function hs = StreamEdges(hribbon,varargin) 

wasOnHold = ishold ;   %// save hold state 
hold on 

hs = zeros(size(hribbon)) ; %// initialize output handle array 
for ih=1:numel(hribbon) ; 
    %// retrieve X, Y, and Z data of each surface 
    hsurf = handle(hribbon(ih)) ; %// for pre-HG2 (2014a) versions 
    xx = hsurf.XData ; 
    yy = hsurf.YData ; 
    zz = hsurf.ZData ; 

    %// reoder coordinates to linearise surface profile (edge) 
    xx = [xx(:,1) ; flipud(xx(:,2)) ; xx(1)] ; 
    yy = [yy(:,1) ; flipud(yy(:,2)) ; yy(1)] ; 
    zz = [zz(:,1) ; flipud(zz(:,2)) ; zz(1)] ; 

    %// return double to stay compatible with pre-HG2 
    hs(ih) = double(plot3(xx(:),yy(:),zz(:), varargin{:})) ; 
end 

if ~wasOnHold ; hold off ; end  %// restore hold state 
hs = handle(hs) ;     %// convert "double" handle back to HG2 handles 

功能應與預HG2或版本(=預2014B),HG2崗位工作。它將返回的句柄數組將採用HG2格式(=真實句柄,而不僅僅是它們的double表示形式)。這使您可以訪問圖形對象上的點符號,即使對於HG2版本也是如此。如果你不舒服的是,僅僅評論功能的最後一行(或獲得老手柄樣式,你可以隨時使用的功能hs = double(hs)


目標axes

除了從保存hold狀態開始,該函數的行爲與大多數高級別的繪圖函數相同,也就是說,它們將直接轉到當前的axesgca),或者創建一個新函數(如果不存在)。
您可以輕鬆地修改函數接受一個axes句柄作爲目標,或者乾脆不加修改,在參數明確地調用它:

hs = StreamEdges(h , 'Parent','target_axes_handle' , 'Color','k','Linewidth',1) ; 
+0

工作很好!我確實必須將'xData'更改爲'XData' - 運行R2014b,才能正常工作。非常感謝! – James

+0

@詹姆斯,感謝它現在已經得到糾正(也對函數做了輕微的修改)。 – Hoki

+0

太棒了!這在情節中給出了非常好的效果! –