在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

生产:
如果我添加set(h,'edgecolor','k')
我得到:
而我要找的是这样的东西(图片的顶部和左侧已经用gimp进行了编辑,以说明我所追求的重点):

最佳答案

正如评论中所说,没有简单的方法可以照亮带状表面的某些边缘,而不是其他边缘。
但是,带状曲面只是由边上的点定义的,因此只需检索这些点并重新组织它们(内联它们)即可获得三维直线的完美坐标集。
为了得到一个封闭的概要文件,我们只需要复制概要文件末尾的第一个点。
我将其打包到一个函数中,该函数将返回一组与功能区句柄数组大小相同的handles,并将可以发送到内部plot3函数的任何其他参数传递给该函数所以用法很简单:
因此,使用与问题中完全相同的代码(在变量h中检索带状曲面句柄数组),添加:

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

将产生:
当然,你总是可以疯狂地在组中设置行属性:
set(hs,'LineWidth',1,'Color','c')
%// or
set(hs,'LineWidth',2,'Color','r','Marker','none')

函数代码:
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格式(=实际句柄,而不仅仅是它们的StreamEdges.m表示形式)这使您可以访问图形对象上的点符号,即使对于HG2之前的版本也是如此如果您对此不满意,只需注释函数的最后一行(或者为了获得旧的句柄样式,您可以始终使用函数double
目标hs = double(hs)
除了保存axes状态之外,函数将像最高级的绘图函数一样,意味着它们将直接进入当前holdaxes),或者如果没有,则创建一个新的函数。
您可以很容易地修改函数以接受gca句柄作为目标,或者只需不做修改就在参数中显式调用它:
hs = StreamEdges( h , 'Parent','target_axes_handle' , 'Color','k','Linewidth',1) ;

10-07 16:30