正如评论说,有照明的一些边缘没有简单的方法丝带表面,而不是其他。
但是,色带表面只是由边上的点定义的,所以它只是检索这些点并重新组织它们(内联它们)以获得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