2016-06-12 141 views
2

我想创建几何形状的填充图,可以通过按钮或键盘击中来上下移动。首先,不会同时出现,所以我不得不使用它们。按下后,他们确实向上移动,但他们以前的位置仍保持填充状态,即它们被复制,虽然我已经转过身.PS,我也想在被某个物体碰触时摧毁一个物体。我们如何解决这个问题?MATLAB:通过按钮同时绘制使用坐标轴绘制的GUI对象

这里是一段代码:

global x 
global y 
global a 
global b 

a = [ 7 8 9 8 ]; 
b = [ 2 1 2 3 ]; 
x= [ 1 3 3 1]; 
y = [ 1 1 3 3]; 

fill(x,y,[0.3 0.7 0.2]); 

fill(a,b,[0.3 0.2 0.7]) 

axis([0,15,0,15]) 


% --- Executes on button press in up. 
function up_Callback(hObject, eventdata, handles) 

hold off 
global x 
global y 
global a 
global b 
y = y+2; 
b=b+2; 
hold on 
fill(x,y,[0.3 0.7 0.2]) 
fill(a,b,[0.3 0.2 0.7]) 
hold off 
axis([0,15,0,15]) 

回答

1

的技巧是使用的fill()的返回值来改变X/Y的数据。

function main 

    close all; 
    figure; 
    hold on; 

    objects(1) = struct('X',[ 7 8 9 8 ],'Y',[ 2 1 2 3 ],'fill_handle',[],'Color',[0.3 0.7 0.2]); 
    objects(2) = struct('X',[ 1 3 3 1],'Y',[ 1 1 3 3],'fill_handle',[],'Color',[0.3 0.2 0.7]); 
    objects(3) = struct('X',[ 1 5 3 1]+3,'Y',[ 1 2 3 3]+2,'fill_handle',[],'Color',[0.6 0.6 0.3]); 

    for i=1:length(objects) 
     objects(i).fill_handle = fill(objects(i).X,objects(i).Y,objects(i).Color); 
    end 

    axis([0,15,0,15]) 

    function keyPressCallback(~,eventdata) 
     disp(eventdata.Key); 
     dx = 0; 
     dy = 0; 
     if strcmp(eventdata.Key, 'rightarrow') 
      dx = 1; 
     elseif strcmp(eventdata.Key, 'leftarrow') 
      dx = -1; 
     elseif strcmp(eventdata.Key, 'uparrow') 
      dy = 1; 
     elseif strcmp(eventdata.Key, 'downarrow') 
      dy = -1; 
     elseif strcmp(eventdata.Key, 'delete') 
      i=1; 
      delete(objects(i).fill_handle); 
      objects(i) = []; 
     elseif strcmp(eventdata.Key, 'escape') 
      close all; 
      return; 
     end 

     for i=1:length(objects) 
      objects(i).X = objects(i).X + dx; 
      objects(i).Y = objects(i).Y + dy; 
      set(objects(i).fill_handle, 'XData', objects(i).X); 
      set(objects(i).fill_handle, 'YData', objects(i).Y); 
     end 

    end 
    set(gcf,'WindowKeyPressFcn',@keyPressCallback); 

end 
+0

Gracias!这样可行! 任何提示如何执行摧毁部分? –

+0

当场。只有一件事不起作用,就是通过键盘移动。每当我按下时,它都不会做任何事情,或者让我去控制显示最后命令的控制台。其次,是否填写命令支持填写属性的编辑?像边框颜色等。 –

+0

不知道为什么用箭头键移动不起作用,在这里很好(R2015a,win64)。您可以使用'set()'和'get()'编辑填充图,请阅读文档以获取详细信息:http://mathworks.com/help/matlab/ref/patch-properties.html – janismac