2016-01-20 3 views
1
for m=1:10; 
    pause(0.2) 
    h1=figure(1); 
    set(h1,'Position',[200 200 600 500]); 
    pause(0.2) 
    h2=figure(2); 
    set(h2,'Position',[600 200 600 500]); 
end 

Когда я запускаю верхний код, появляются две фигуры, чередующиеся друг с другом, как показано ниже.Как остановить фигуру Matlab всплывающее окно

enter image description here

enter image description here

Я хотел бы, чтобы остановить эту всплывал собственность и сохранить позицию на протяжении всей итерации, как показано ниже.

enter image description here

Как я мог изменить это свойство?

Заранее спасибо.

Я добавляю код. в этом коде две цифры непрерывно мигают. Что я хочу сделать, это остановить это мигание.

clear all 
close all 
clc 
%%patch1%% 
x1=[-2 0 0 -2]; 
y1=[-1 -1 1 1]; 
z1=[0 0 0 0]; 
a=patch(x1,y1,z1,'green'); 
c=patch(x1,y1,z1,'green'); 

%%patch2%% 
x2=[0 2 2 0]; 
y2=[-1 -1 1 1]; 
z2=[0 0 0 0]; 
b=patch(x2,y2,z2,'red'); 
d=patch(x2,y2,z2,'red'); 

%h1=figure(1),grid on 

    for k=0:pi/10:10*pi 
     delete([a b]) 
     figure(1),grid on 
     a=patch(x1,y1,z1+[-0.1*sin(k) 0.3*sin(k) 0.3*sin(k) -0.1*sin(k)],'green'); 
     b=patch(x2,y2,z2+[0.3*sin(k) -0.1*sin(k) -0.1*sin(k) 0.3*sin(k)],'red'); 
     axis([-2.5 2.5 -1.5 1.5 -0.5 0.5]) 

     pause(0.05) 
     delete([c d]) 
     figure(2),grid on 
     c=patch(x1,y1,z1+[-0.3*sin(k) 0.05*sin(k) -0.05*sin(k) -0.4*sin(k)],'green'); 
     d=patch(x2,y2,z2+[0.05*sin(k) 0.4*sin(k) 0.3*sin(k) -0.05*sin(k)],'red'); 
     axis([-2.5 2.5 -1.5 1.5 -0.5 0.5]) 

     pause(0.05) 

    end 
+0

Рассматривали ли вы с помощью окна 1 рисунок 2 участков с помощью [ 'subplot'] (http://www.mathworks.com/help/matlab/ref/subplot.html?refresh=true)? – Dan

+0

Теперь я использую subplot. Но я хочу построить два движущихся графика на разных фигурах. Если нет путей, я буду продолжать использовать подзаголовок. – KKS

+1

Вы можете [управлять расположением и размером окна фигуры] (http://www.mathworks.com/help/matlab/ref/figure-properties.html#zmw57dd0e229553), чтобы просто не перекрывать их ... – Dan

ответ

2

Используйте ''Parent'' property из patch объекта, чтобы определить axes построить без необходимости в figure вызов для обновления current axes.

Используя ваш пример:

f(1) = figure; 
f(2) = figure; 
ax(1) = axes('Parent', f(1)); 
ax(2) = axes('Parent', f(2)); 

for ii = 1:length(ax) 
    axis(ax(ii), [-2.5 2.5 -1.5 1.5 -0.5 0.5]); 
    grid(ax(ii), 'on'); 
    hold(ax(ii), 'on'); 
end 

%%patch1%% 
x1=[-2 0 0 -2]; 
y1=[-1 -1 1 1]; 
z1=[0 0 0 0]; 
a=patch(x1,y1,z1,'green', 'Parent', ax(1)); 
c=patch(x1,y1,z1,'green', 'Parent', ax(2)); 

%%patch2%% 
x2=[0 2 2 0]; 
y2=[-1 -1 1 1]; 
z2=[0 0 0 0]; 
b=patch(x2,y2,z2,'red', 'Parent', ax(1)); 
d=patch(x2,y2,z2,'red', 'Parent', ax(2)); 

for k=0:pi/10:10*pi 
    delete([a b]) 
    a=patch(x1,y1,z1+[-0.1*sin(k) 0.3*sin(k) 0.3*sin(k) -0.1*sin(k)],'green', 'Parent', ax(1)); 
    b=patch(x2,y2,z2+[0.3*sin(k) -0.1*sin(k) -0.1*sin(k) 0.3*sin(k)],'red', 'Parent', ax(1)); 

    pause(0.05) 
    delete([c d]) 
    c=patch(x1,y1,z1+[-0.3*sin(k) 0.05*sin(k) -0.05*sin(k) -0.4*sin(k)],'green', 'Parent', ax(2)); 
    d=patch(x2,y2,z2+[0.05*sin(k) 0.4*sin(k) 0.3*sin(k) -0.05*sin(k)],'red', 'Parent', ax(2)); 
    pause(0.05) 
end 

for ii = 1:length(ax) 
    hold(ax(ii), 'off'); 
end 

Как и в стороне, вы также можете обновить свои патчи, изменяя 'XData', 'YData', and 'ZData' объектов патча, а не удалять & создание объектов патча с каждой петлей. Это, как правило, более эффективно.

Использование первичного for цикла в качестве примера (assumes R2014b or newer):

for k=0:pi/10:10*pi 
    a.ZData = z1+[-0.1*sin(k) 0.3*sin(k) 0.3*sin(k) -0.1*sin(k)]; 
    b.ZData = z2+[0.3*sin(k) -0.1*sin(k) -0.1*sin(k) 0.3*sin(k)]; 
    pause(0.05) 

    c.ZData = z1+[-0.3*sin(k) 0.05*sin(k) -0.05*sin(k) -0.4*sin(k)]; 
    d.ZData = z2+[0.05*sin(k) 0.4*sin(k) 0.3*sin(k) -0.05*sin(k)]; 
    pause(0.05) 
end 
+0

Спасибо за подробное объяснение – KKS

3

Вам следует избегать вызова фигуры в цикле! Это линии h1=figure(1); и h2=figure(2);, которые продолжают переключать фокус. Всякий раз, когда вы хотите поместить что-то в окно фигуры, используйте опционную пару 'parent',h1 или 'parent',ax1 для некоторых осей объекта ax1. чтобы избежать вызова figure. Я предлагаю вам использовать figure для создания фигурного окна.

Например, вместо того, чтобы использовать figure(1);image(img); начала путем создания фигуры и оси объектов (h1=figure(1);ax1=axes('Parent',h1);), а затем, когда вы хотите, чтобы обновить изображение на рисунке, используйте image(img,'Parent',ax1);.

+0

Я добавил код. Я использую патч на рисунках, когда я использую «parent» для патча, Matlab говорит, что это невозможно. – KKS

+0

В соответствии с http://se.mathworks.com/help/matlab/ref/patch-properties.html вы можете видеть, что родительское свойство объекта патча должно быть осями типа, поэтому вы можете добавить ', 'parent' , ax1' (где вы, конечно, уже определили свой объект axx 'ax1') в конце вашего вызова функции' patch'. –

+0

Я понял ваш ответ. Спасибо ~ – KKS

1

Вместо добавления и удаления каждого патча в каждой итерации, рассмотрим сначала создать их вне цикла, а затем просто изменить их внутри цикл:

%%patch1%% 
x1=[-2 0 0 -2]; 
y1=[-1 -1 1 1]; 
z1=[0 0 0 0]; 

%%patch2%% 
x2=[0 2 2 0]; 
y2=[-1 -1 1 1]; 
z2=[0 0 0 0]; 

figure(1),grid on 
a=patch(x1,y1,z1,'green'); 
b=patch(x2,y2,z2,'red'); 
axis([-2.5 2.5 -1.5 1.5 -0.5 0.5]) 

figure(2),grid on 
c=patch(x1,y1,z1,'green'); 
d=patch(x2,y2,z2,'red'); 
axis([-2.5 2.5 -1.5 1.5 -0.5 0.5]) 

for k=0:pi/10:10*pi 
    set(a, 'ZData', z1+[-0.1*sin(k) 0.3*sin(k) 0.3*sin(k) -0.1*sin(k)]); 
    set(b, 'ZData',z2+[0.3*sin(k) -0.1*sin(k) -0.1*sin(k) 0.3*sin(k)]); 

    pause(0.05) 
    set(c, 'ZData', z1+[-0.3*sin(k) 0.05*sin(k) -0.05*sin(k) -0.4*sin(k)]); 
    set(d, 'ZData', z2+[0.05*sin(k) 0.4*sin(k) 0.3*sin(k) -0.05*sin(k)]); 

    pause(0.05) 
end 
+0

Спасибо за ваш ответ ~ – KKS

Смежные вопросы