为什么绘制命令如'矩形'和' line'忽视'推迟'?

时间:2014-08-08 16:45:30

标签: matlab plot matlab-figure

我试图在循环中显示一个变化的矩形,并暂停,它忽略了hold off(实际上它认为是默认值)。

这是一个简化版本的代码:

clc; close all; clear all;

rect = [10 10 20 30];

figure
axis([0 200 0 50]);

for i = 1 : 15
    rect(1) = rect(1) + i;
    rectangle('Position', rect, 'edgeColor', [1 0 0]);
    hold off;
    pause(0.2);
end

是故意的吗? 我错过了什么吗? 除了在每次迭代后将其绘制成白色之外,我还能做些什么来使之前的矩形消失?

谢谢..

编辑

非常简化的版本已经解决,但是如果我想在同一个数字上绘制另一个东西,另一个情节忽略了延迟。 在这种情况下我该怎么做?

再次感谢。

clc; close all; clear all;

rect = [10 10 20 30];

figure
axis([0 200 0 50]);

h1 = [];
for i = 1 : 15
    rect(1) = rect(1) + i;
    delete(h1);
    h1 = rectangle('Position', rect, 'edgeColor', [1 0 0]);
    hold on
    plot (5 + 5 * i, 5, '*g');
    hold off
    pause(0.2);
end

3 个答案:

答案 0 :(得分:7)

更新:Matlab R2014b及更高版本

使用Matlab R2014b中的update of the handle graphics engine,文档中的符号稍有改动。没有独特的网站 核心图形对象绘制对象了,但here您可以看到这两种对象现在称为绘制函数对象原始对象


原因是,为绘制而Core Graphics Objects与其子组Plot Objects之间存在差异,目的是显示数据,使用Core Graphics Objects执行此操作。

核心图形对象

  

核心图形对象包括基本绘图基元:

     
      
  • 线条,文本和多边形外壳(修补程序对象)

  •   
  • 像曲面这样的专业对象,由一个矩形的顶点网格组成

  •   
  • 图片

  •   
  • 灯光对象,不可见但会影响某些物体的着色方式

  •   

绘制对象

  

许多高级绘图功能会创建绘图对象。该   绘图对象的属性提供了对重要内容的轻松访问   绘图对象包含的核心图形对象的属性。

一个典型的例子是命令lineplot - 它们基本相同。但他们属于不同的群体。如果想要绘制数据,他会使用plot,完成任务。如果想要"画" 的内容更容易,您不需要hold一切。

所以回答你的问题:是的,这是故意的。

为了解决您的问题,我会使用plot编写一个新的矩形函数:

function h = plotRectangle(posX, posY, width, height)

x = [posX posX+width posX+width  posX        posX];
y = [posY posY       posY+height posY+height posY];

h = plot(x,y);

end

分别为:

function h = plotRectangle(PosVector)

X = PosVector;

x = [X(1) X(1)+X(3) X(1)+X(3)  X(1)        X(1)];
y = [X(2) X(2)      X(2)+X(4)  X(2)+X(4)   X(2)];

h = plot(x,y);

end

后者现在可以与您的代码一起使用:

rect = [10 10 20 30];

figure
axis([0 200 0 50]);

for i = 1 : 15
    rect(1) = rect(1) + i;
    plotRectangle(rect);
    hold off;
    pause(0.2);
end

答案 1 :(得分:2)

修改了你的代码:

clc; close all; clear all;

rect = [10 10 20 30];

figure
axis([0 200 0 50]);

h1 = [];
for i = 1 : 15
    rect(1) = rect(1) + i;
    delete(h1);
    h1 = rectangle('Position', rect, 'edgeColor', [1 0 0]);
    pause(0.2);
end

希望这会有所帮助..

答案 2 :(得分:1)

你可以使用湖泊已经提出的相同方法。下面我为第二个图添加了一个额外的句柄。

clc; close all; clear all;

rect = [10 10 20 30];

figure; hold on;
axis([0 200 0 50]);

h1 = [];
h2 = [];
for i = 1 : 15
    rect(1) = rect(1) + i;
    delete(h1);
    delete(h2);
    h1 = rectangle('Position', rect, 'edgeColor', [1 0 0]);
    h2 = plot (5 + 5 * i, 5, '*g');

    pause(0.2);
end