【问题标题】:MATLAB Update trisurf handleMATLAB 更新 trisurf 句柄
【发布时间】:2021-06-17 14:38:27
【问题描述】:

我正在使用 Delaunay 三角化将散点图转换为曲面。为了使这个绘图动画化,我想更新trisurf 句柄而不是创建一个新的trisurf 绘图以减少开销并提高绘图速度。

基本上,在 for 循环中,我想更新 trisurf 句柄 h 的属性,以获得再次调用 trisurf 会产生的相同图。

MWE

x = linspace(0,1,11); 
y = x;
[X,Y] = meshgrid(x,y);
mag = hypot(X(:),Y(:)); % exemplary magnitude
T = delaunay(X(:),Y(:));

z = 0

h = trisurf(T, X(:), Y(:), z*ones(size(X(:))), mag, 'FaceColor', 'interp'); view([-90 90]);

for i = 1:10
    % Compute new values for X, Y, z, and mag
    % -> Update properties of handle h to redraw the trisurf plot instead
    %    of recalling the last line before the for loop again, e.g.,
    % h.FaceVertexCData = ...
    % h.Faces = ...
    % h.XData = ...
end

【问题讨论】:

    标签: matlab surf delaunay


    【解决方案1】:

    您可以更改trisurf() 返回的 Patch 对象的一些属性:

    for i = 1:9
      % Compute new values for X, Y, z, and mag
      % As an example:
      x = linspace(0,1,11-i);
      y = x;
      [X,Y] = meshgrid(x,y);
      mag = hypot(X(:),Y(:));
      T = delaunay(X(:),Y(:));
    
      z = i;
      Z = z*ones(size(X)); %we could have just called `meshgrid()` with 3 arguments instead
      % End recomputation
    
      % Update trisurf() patch: option 1
      set( h, 'Faces',T, 'XData',X(T).', 'YData',Y(T).', 'ZData',Z(T).', 'CData',mag(T).' );
      pause(0.25); %just so we can see the result
      % Update trisurf() patch: option 2
      set( h, 'Faces',T, 'Vertices',[X(:) Y(:) Z(:)], 'FaceVertexCData',mag(:) );
      pause(0.25); %just so we can see the result
    end
    

    假设z 始终是一个标量,就像对trisurf() 的原始调用一样。

    • 问:这些选项是否同样快?
    • A:我在我的计算机(R2019a,Linux)上运行了一些测试(参见下面的代码),发现当 x/y 位置的数量是 2 到 20 之间的随机数时,多个 set() 调用使用Vertices 可以比使用XData 和相关属性的set() 调用快20%,并且这些策略比多个trisurf() 调用快大约一个数量级。但是,当 x/y 位置的数量允许在 2 到 200 之间变化时,三种方法的运行时间大致相同。
    Nruns=1e3;
    Nxy_max=20;
    
    for i=1:Nruns
      if i==round(Nruns/10)
        tic(); %discard first 10% of iterations
      end
      x = linspace(0,1,randi(Nxy_max-1)+1); %randi([2,Nxy_max]) can be a bit slower
      [X,Y,Z] = meshgrid(x,x,randn());
      mag = hypot(X(:),Y(:));
      T = delaunay(X(:),Y(:));
      trisurf(T, X(:), Y(:), Z(:), mag, 'FaceColor', 'interp');
      view([-90 90]);
    end
    tmean_trisurf=1e3*toc()/(Nruns-round(Nruns/10)+1), %in [ms]
    
    h=trisurf(T, X(:), Y(:), Z(:), mag, 'FaceColor', 'interp');
    view([-90 90]);
    
    for i=1:Nruns
      if i==round(Nruns/10)
        tic();
      end
      x = linspace(0,1,randi(Nxy_max-1)+1);
      [X,Y,Z] = meshgrid(x,x,randn());
      mag = hypot(X(:),Y(:));
      T = delaunay(X(:),Y(:));
      set( h, 'Faces',T, 'XData',X(T).', 'YData',Y(T).', 'ZData',Z(T).', 'CData',mag(T).' );
    end
    tmean_xyzdata=1e3*toc()/(Nruns-round(Nruns/10)+1), %in [ms]
    
    for i=1:Nruns
      if i==round(Nruns/10)
        tic();
      end
      x = linspace(0,1,randi(Nxy_max-1)+1);
      [X,Y,Z] = meshgrid(x,x,randn());
      mag = hypot(X(:),Y(:));
      T = delaunay(X(:),Y(:));
      set( h, 'Faces',T, 'Vertices',[X(:) Y(:) Z(:)], 'FaceVertexCData',mag(:) );
    end
    tmean_vertices=1e3*toc()/(Nruns-round(Nruns/10)+1), %in [ms]
    
    

    【讨论】:

      猜你喜欢
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-24
      • 1970-01-01
      相关资源
      最近更新 更多