2016-05-24 14 views
0

私の英語が少し錆びているなら、こんにちは。私はパラメトリック関数に沿って移動する円を作成しようとしています(座標はベクトルに格納されます)。私は円を描画するための関数を記述していると私は円の形を作成し、楕円を避けるためにあなたは、MATLABの軸の等しいコマンドを使用することができます知っている。私の問題は、私がこれを行うと、プロットされたグラフに対してFigureウィンドウが非常に広くなることです。すべての入力をいただければ幸いです。matlab:グラフと軸に沿って円を動かす

MAIN CODE:

t = linspace(0,3); 
x = 30*cos(pi/4)/2*(1-exp(-0.5*t)); 
y = (30*sin(pi/4)/2 + 9.81/0.5^2)*(1-exp(0.5*t)) - 9.81*t/0.5; 

for i = 1:length(t) 
    plot(x,y) 
    axis equal 
    hold on 
    cirkel(x(i),y(i),1,1,'r') % argument #3 is the radius #4 is 1 for fill 
    hold off     
    pause(0.01) 
end 

CIRCLEのCODE:

function cirkel(x,y,r,f,c) 
angle = linspace(0, 2*pi, 360); 
xp = x + r*cos(angle); 
yp = y + r*sin(angle); 
plot(x,y) 
if f == 1 && nargin == 5 
    fill(xp,yp,c) 
end 
+0

これは正しく動作しているようです。 Axis equalはグラフのスケールを変更して、両方の軸で等しい比率になるようにします。プロットの範囲(y軸エクステント)がドメイン(x軸エクステント)よりもはるかに大きい場合、プロットの場合と同様に、MATLABはx軸を拡張して正しい表示比率を作成する必要があります。これは、すべて完全に正常な動作です。 [0,10]の範囲でx軸を維持して、グラフの曲率を見ることができるようにするには、ちょうど小さな "円"を楕円としてプロットして、スケーリングが円形に見えるようにします。 – gariepy

答えて

0

あなたは小さなドットが円形表示したい、とあなたは合理的なドメイン(x軸の範囲を)持っているしたい場合は、してみてくださいこれ:

function cirkel(x,y,r,f,c) 
angle = linspace(0, 2*pi, 360); 
xp = x + 0.04*r*cos(angle); %% adding scale factor of 0.04 to make it appear circular 
yp = y + r*sin(angle); 
plot(x,y) 
if f == 1 && nargin == 5 
    fill(xp,yp,c) 
end 

xpの計算におけるスケールファクタの添加。これを自動化したい場合は、別のパラメータをcirkel()に追加して、それをスケールファクタを含むsとしましょう。ドメインへの範囲の比率(yエクステントをxエクステントで割ったもの)を計算することによって、スクリプトのスケール係数を計算できます。

+0

これは素晴らしい作品です、私は軸の等しいコマンドを削除する必要がありました、ありがとう!私はまた、円が "図の境界線の外にある"ときに、MATLABがウィンドウのサイズを調整するのを防ぐことができるのだろうかと思います。例えば、アニメーションが始まるとき。 – Seeker

+0

@Seeker:そうするには、最初のプロットを生成するときにxlimitとylimitsを手動で設定するだけです(一般的には良いアイデアです)。 'xlim([0 10])'を使って、x軸の限界を '0'と '10'に設定します。これにより、Figureのauto-resizeプロパティもオフになります。そのため、MATLABはそれ以降はサイズ変更されません。手動でサイズを変更することができます。 – gariepy

5

axis equalを呼び出すと、x軸の1単位がy軸の1単位と同じサイズになります。あなたのy値はx値よりもはるかに広いので、あなたが何を見ているのですか?

これに対処する1つの方法は、現在の軸の縦横比とx/yの制限を照会することです(the second part of this answer)。しかし、円をプロットするのにfillを使用するのではなく、軸のアスペクト比に関係なく循環する円マーカーをscatterとして使用する方が簡単です。サイドノートとして

t = linspace(0,3); 
x = 30*cos(pi/4)/2*(1-exp(-0.5*t)); 
y = (30*sin(pi/4)/2 + 9.81/0.5^2)*(1-exp(0.5*t)) - 9.81*t/0.5; 

% Plot the entire curve 
hplot = plot(x, y); 
hold on; 

% Create a scatter plot where the area of the marker is 50. Store the handle to the plot 
% in the variable hscatter so we can update the position inside of the loop 
hscatter = scatter(x(1), y(1), 50, 'r', 'MarkerFaceColor', 'r'); 

for k = 1:length(t) 
    % Update the location of the scatter plot 
    set(hscatter, 'XData', x(k), ... % Set the X Position of the circle to x(k) 
        'YData', y(k))  % Set the Y Position of the circle to y(k) 

    % Refresh the plot 
    drawnow 
end 

enter image description here

、それはupdate existing plot objectsにかなり新しいものを作成するよりも最高です。

+0

答えをありがとう。これは最高の解決策だと思われますが、初心者としては、これらのコマンドのいくつかは私には慣れていないmatlabに来るとき。私はそれを理解するために全力を尽くします。 – Seeker

+0

@Seeker明示的にどのコマンドを実行しますか?私は必要に応じていくつかの説明を追加することができます – Suever

+0

私は今、それは次の引数は実際のデータになることをインスタンスの場合はxdataのように私が認識しなかった引数を持っていると思う。私は最初にプログラミングのその方法を理解していませんでした。私は正しい?もしそうなら、私はあなたの解決策を理解します。 – Seeker

関連する問題