2016-06-12 12 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

トリックは、X/Yデータを変更するfill()の戻り値を使用することです。

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

関連する問題