假设我有一个非常简单的循环

for i=1:10
    [xO, yO, xA, yA, xB, yB, xC, yC] = DoSomething(i);
    line([xO,xA,xB,xC],[yO,yA,yB,yC]);
    pause(0.1);
end

我正在绘制的坐标对应于多体系统的关节,我正在模拟它们随时间变化的位置(请参见此处的绘图示例):
由于某些链接以周期性方式移动,因此在视觉上跟踪移动会变得很混乱出于这个原因,现在出现了一个问题:我如何绘制线,以便在绘制新线时,逐渐淡出以前的线换句话说,这样我就有了一个从最近绘制的数据(最不透明)到最旧数据(逐渐透明,直到完全消失)的渐变。
这样,当一条新线被绘制在与非常旧的数据相同的位置时,我会注意到它是一条新线。

最佳答案

我添加了第二个答案来明确区分两种完全不同的方法My1st answer对行使用无证(截至2018b,已折旧)透明度选项。
此答案为没有兼容性问题的线条绘制提供了不同的方法(这两个“功能”可以独立实现):
创建固定的n行并更新它们的位置,而不是创建越来越多的行。
回忆线条,淡入白色,而不是改变透明度。
下面是代码,详细信息请参见注释:

% "Buffer" size, number of historic lines to keep, and governs the
% corresponding fade increments.
nFade = 100;

% Set up some demo values for plotting around a circle
dt = 0.05; a = 0:dt:2*pi+(dt*nFade); n = numel(a); b = a.*4;
[x1,y1] = pol2cart( a, ones(1,n) ); [x2,y2] = pol2cart( b, 0.4*ones(1,n) );
x = [zeros(1,n); x1; x1+x2]; y = [zeros(1,n); y1; y1+y2];

% Initialise the figure, set up axes etc
f = figure(1); clf; xlim([-1.5,1.5]); ylim([-1.5,1.5]);

% Draw all of the lines, initially not showing because NaN vs NaN
lines = arrayfun( @(x)line(NaN,NaN), 1:nFade, 'uni', 0 );
% Set up shorthand for recolouring all the lines
recolour = @(lines) arrayfun( @(x) set( lines{x},'Color',ones(1,3)*(x/nFade) ), 1:nFade );

for ii = 1:n
    % Shift the lines around so newest is at the start
    lines = [ lines(end), lines(1:end-1) ];
    % Overwrite x/y data for oldest line to be newest line
    set( lines{1}, 'XData', x(:,ii), 'YData', y(:,ii) );
    % Update all colours
    recolour( lines );
    % Pause for animation
    pause(0.01);
end

结果:
matlab - 当我添加新输入时,如何使先前的输入在Matlab图中逐渐淡出-LMLPHP

09-04 10:31