Python/Numpyで楕円方程式を描画する!

  • このエントリーをはてなブックマークに追加

画像処理でグラフィカルなアニメーションを作ったりする場合、軌跡の座標点に円や楕円方程式を使いたくなる場合があります。楕円は円の拡張なので、ここでは楕円方程式の描画をやってみます。

こんにちは。wat(@watlablog)です。
画像処理関連で色々やりたく、その前段階で楕円を扱いたくなったので、ここでは楕円方程式の描画をやってみます

楕円方程式をPythonで描画する

楕円方程式

今回は\(y\)軸上に焦点のある楕円方程式を扱います。楕円方程式は以下の式で表すことができます。

$$\frac{x^{2}}{a^{2}}+\frac{y^{2}}{b^{2}}=1$$

\(y\)について整理すると、以下の式になります。\(x\)の値によっては2値をとるので、±が付いていますね。

$$y=\pm b\sqrt{1-\frac{x^{2}}{a^{2}}}$$

楕円方程式のパラメータと円の形

ここで\(a\)と\(b\)の値が楕円の潰れ具合を決めるパラメータです。\(a=b\)の時は真円となりますが、等しくない場合は以下の図のように潰れ方が変わります。

楕円方程式の概要

今回はこれをグラフ描画してみます。

Pythonコード

インポートするパッケージ

import文でインポートするパッケージはNumPyとmatplotlibです。

楕円方程式の関数を作る

楕円方程式の関数は、先に紹介した式をdef文で作っておきます。

軸とパラメータを作る

楕円方程式中の\(a, b\)を定義します。また、円は第1象限から第4象限まで、形こそ相似ですが符号が異なります。今回は後の画像処理で使えるように全範囲の\(x\)の値と\(y\)の値をセットで手に入れたい(さらに順番も円の軌跡を描けるように)ので一工夫しています。

まず\(t\)として±πの範囲の軸を作ります。
次に位相phaseと振幅\(a\)を考慮して\(x\)を\(t\)を使って表現することで、楕円方程式の\(x\)軸を、\(-a\)から\(a\)の範囲で作成します。

np.gradientで勾配\(g\)を作成しているのは、符号の変化を判別する時に使います。

全象限の値を計算する

勾配の符号が変化したタイミングで\(y\)の値を符号変換(-1をかける)することで、\(x\)が折り返した時にスムーズに円を描く軌跡をとります。

グラフの設定

最後にグラフの設定です。正直ここは単純にプロットするだけでも十分ですが、ちょっと見た目にこだわったためグラフ設定が長くなってしまいました。

実行結果

上記コードを全て貼り付け実行すると以下の結果が得られます。楕円を描くことができました。

まとめ

本ページでは楕円方程式の紹介と、Pythonによる描画コーディングを紹介しました。

今回はやってみた回です。後で画像処理でグラフィカルにアニメーションを作ることをやりたくて、楕円方程式を描画しました。

ただ単に描画するだけであれば、\(x, y\)が共に正の時の値だけを計算しておいて、符号を入れかえれば良いのですが(位相の考慮もせず)、今回はあえて全象限の座標を計算しました。

後程画像処理のカテゴリで結果を紹介したいと思います。

今回はあえて全ての範囲の楕円方程式の座標を計算しました。その目的は後程。

Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメント

コメントを残す

*