2015-06-26 291 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

太棒了!这在情节中给出了非常好的效果! –