【问题标题】:MATLAB streamribbon edge colorMATLAB流带边缘颜色
【发布时间】:2015-08-06 18:31:21
【问题描述】:

在流带图中,如何绘制丝带本身的边缘,而不是每个面的边缘?

例如:

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 进行了编辑,以表明我正在追逐的东西):

【问题讨论】:

  • 您只想要边缘还是边缘和面(如上一张图片中所示)? PD:无主之地。
  • 我不认为有一个简单的方法。 streamribbon 返回的句柄是每个功能区的表面句柄。在那里,知道边缘是否在边界中并绘制它(但不是内部的边缘)绝对不是简单的。我想你可以编写一个代码来获取一个表面并告诉你哪些点位于该表面的边缘,然后你可以在那里绘制 3D 线。我猜在计算上并不便宜,但结果非常好。
  • @AnderBiguri。有用。确实不错的结果。从计算上讲,这并不是最糟糕的,因为我们只需要重用/重新排序现有数据(没有新的计算)。

标签: matlab


【解决方案1】:

正如评论中所说,没有简单的方法可以照亮色带表面的某些边缘而不是其他边缘。

但是,带状表面仅由边缘上的点定义,因此只需检索这些点并重新组织(内联)它们即可获得 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) ;

【讨论】:

  • 干得漂亮!我确实必须将“xData”更改为“XData”——运行 R2014b,才能使其正常工作。非常感谢!
  • @James,谢谢,现在已经更正了(功能也稍作修改)。
  • 太棒了!这在情节中产生了非常好的效果!
猜你喜欢
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 2017-09-17
  • 2011-09-05
相关资源
最近更新 更多