マトリョーシカ的日常

ワクワクばらまく明日のブログ。

matlabで楕円を描く方法(改)

 いつだったか、記事にmatlabで楕円を描くには行列の固有値が必要とか書きました。しかし、あれは間違いでした。今日の記事はその修正版です。先日から始めたアクセス解析を見ると「matlab 楕円」で検索してこのブログに来てくれる方がいらっしゃるようですし。

 matlabのplotコマンドを用いて図形を描くときは、その図形のxy座標の式を直接用いることはできず、媒介変数表示でx=○、y=△と書く必要があります。
 例えば直径1の円形を描くときは以下のようなプログラムになります。

t=0:10:360;
x=cosd(t);y=sind(t);
figure(1)
plot(x,y)

 次に楕円の描き方を説明します。楕円の式は
{\frac{x^2}{a^2}+\frac{y^2}{b^2}=1}と表します。これを媒介変数表示すると、{x=a\cos(t),y=b\sin(t)}となります。つまり

t=0:10:360;
a=2;b=3;
x=a*cosd(t);y=b*sind(t);
figure(1)
plot(x,y)

 となります。



 「それだけじゃ物足りない!x軸からθだけ回転させた楕円は描けないの?」

 できます。回転行列Rというものを導入します。

R=[cosθ -sinθ;
  sinθ cosθ]

 これを先ほどのx,y座標に書けるとあら不思議、回転した楕円がかけます。

t=0:10:360;
a=2;b=3;
theta=30;
x1=[a*cosd(t);
b*sind(t)];
R=[cosd(theta) -sind(theta);
sind(theta) cosd(theta)];
X=R*x1;
figure(1)
plot(X(1),X(2))

 また楕円を原点から(x0,y0)だけ離れたところを中心に描くとすると以下のようになります。

t=0:10:360;
n=length(t)
a=2;b=3;
theta=30;
x0=5;y0=3;
c=[x0*ones(1,n);y0*ones(1,n)];
x1=[a*cosd(t);
b*sind(t)];
R=[cosd(theta) -sind(theta);
sind(theta) cosd(theta)];
X=R*x1+c;
figure(1)
plot(X(1),X(2))


補足
t=0:10:360 %tを0から360まで10刻みで変化させた行列。t=[0 10 20 ... 360];となる。
n=length(n) %行列の要素数を計算。ここではn=36;
ones(m,n)  %要素がすべて1のm行n列の行列。

X=R*x1+[x0;y0]とすると多分行列のサイズが合ってないというエラーが起こるとおもったのでonesを使ってみました。

 実は今日描いたプログラムはmatlab上で起動させていません。無事に動くかどうかは分かりません。なにか問題があったらコメントしてくださるとありがたいです。

以上。



追記:(20120817)--------
このプログラムを使えば、正n角形を描くことも可能です。プログラムの「t=0:10:360」に注目してください。これは角度を10度刻みで点をプロットすることを意味しています。つまり360/10=正36角形を描いていることになります。つまり正8角形を描きたければ360/8=45 つまりt=0:45:360とすればOKです。

追記:(20130213)--------
検索サイトから来ていただいた方へ
x軸からθだけ傾けたときの楕円の方程式は

{(\frac{(\cos(\theta))^2}{a^2}+\frac{(\sin(\theta))^2}{b^2})x^2+2\sin(\theta)\cos(\theta)(\frac{1}{a^2}-\frac{1}{b^2})xy+(\frac{(\sin(\theta))^2}{a^2}+\frac{\cos(\theta)^2}{b^2})y^2=1}

となります。

二次形式を利用します。

EMANの物理学・物理数学・二次形式


MATLAB/Simulinkと実機で学ぶ制御工学-PID制御から現代制御まで- (Physical Computing Lab)

MATLAB/Simulinkと実機で学ぶ制御工学-PID制御から現代制御まで- (Physical Computing Lab)