正如評論說,有照明的一些邊緣沒有簡單的方法絲帶表面,而不是其他。
但是,色帶表面只是由邊上的點定義的,所以它只是檢索這些點並重新組織它們(內聯它們)以獲得3D線的完美座標集。
要獲得關閉配置文件,我們只需要複製配置文件末尾的第一個點。
我把它打包成一個函數,它將返回一組尺寸與色帶手柄陣列相同的handles
,並將任何可以發送到內部plot3
函數的附加參數傳送出去。這樣的使用是非常簡單:
所以使用完全相同比的問題相同的代碼(其檢索色帶表面手柄的在可變h
陣列),增加:
hs = StreamEdges(h , 'k','Linewidth',1) ;
會產生:
當然,你總是可以得到瘋狂和組設置您的線路屬性:
set(hs,'LineWidth',1,'Color','c')
%// or
set(hs,'LineWidth',2,'Color','r','Marker','none')
代碼功能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
狀態開始,該函數的行爲與大多數高級別的繪圖函數相同,也就是說,它們將直接轉到當前的axes
(gca
),或者創建一個新函數(如果不存在)。
您可以輕鬆地修改函數接受一個axes
句柄作爲目標,或者乾脆不加修改,在參數明確地調用它:
hs = StreamEdges(h , 'Parent','target_axes_handle' , 'Color','k','Linewidth',1) ;
你想只是邊緣或eddges和麪(如您最後一張圖片)? PD:無主之地。 –
我不認爲有一個簡單的方法來解決這個問題。 'streamribbon'返回的句柄是每個功能區的表面句柄。在那裏,知道邊緣是否在邊界內並繪製(但不是內部的邊界)絕對不是直截了當的。我想你可以編寫一個代碼來獲取表面,並告訴你哪些點位於該表面的邊緣,然後你可以在那裏繪製3D線。計算上我並不便宜,但非常好的評論。 –
@AnderBiguri。有用。確實很好的結果。而且從計算角度來看,這不是最糟糕的,因爲我們只需要重新使用/重新排序現有數據(沒有新的計算)。 – Hoki