楕円パラメータの相互変換 (幾何学的 ⇔ 代数的)
楕円の表現
この記事では、楕円を表す2種類の形式(方程式)と、 それらの間の相互変換について述べる。 2種類の形式は、一般に canonical form, general form と呼ばれることが多いが、 ここでは便宜上、「幾何学的な表示形式」、「代数的な表示形式」と呼ぶことにする。 wikipedia(英語版) の ellipse の項をみると相互変換に関する解析解が掲載されている。 それを使っても良いが、式の形や導出がけっこうややこしいので、 別解として、比較的簡単に数値的に求める方法を紹介する。
楕円の幾何学的な表示形式
幾何学的に楕円を表現する時は、パラメータとして を選ぶことが多い。 ここで、 は楕円の中心、 は楕円の傾き、 は楕円の半径(横方向と縦方向)である。 , を で表すと、楕円の方程式は、以下の通り。
楕円の代数的な表示形式
代数的に楕円を表現する時は、係数を x, y の冪乗ごとにまとめる。 の係数が 1 になるように規格化し、残りの項の係数を とすれば、 楕円の方程式(一般的な二次曲線)は、以下の通り。
幾何学的な表示(x0,y0,θ,a,b) ⇒ 代数的な表示(A,B,C,D,E)
幾何学的な表現を展開したあと、 の冪でまとめなおして係数を比較する。
ここで、
である。 代数的なパラメータ は、上の関係から直ちに求まる。
代数的な表示(A,B,C,D,E) ⇒ 幾何学的な表示(x0,y0,θ,a,b)
を消去して、全体を で割ると以下を得る。
は、最初の2式を連立して求める。行列形式で表せば、
は、以下の関係を使って、A,B から直接求める。
は、 を最後の式に代入して求める。
は、 を の定義式に代入して、それらを連立して求める。
備考
「超精度くりこみ法」というのを知ったのをきっかけに、 楕円のパラメーター推定をあれこれ試しています。その過程で、 楕円パラメータの相互変換が必要になったので、忘備録として記事を書きました。 部分的なアークから楕円を推定する方法は、 天文の分野でも応用が広そうですね。参考文献に挙げた 「3次元~」は、 各種アルゴリズムのソースコードが出版社のページで公開されていてます。 コードを眺めるだけで動かしていませんが、こういうサービスはうれしいですね。
実装例
def geo_fm_ana5(A, B, C, D, E): """ Parameters ---------- A~E : 楕円方程式の係数 (x^2 + A*x*y + B*y^2 + C*x + D*y + E = 0) Returns ------- xc, yc : [-] 中心座標 th : [rad] 回転角 ra, rb : [-] 横半径, 縦半径 """ xc, yc = np.linalg.solve([[-2, -A], [-A, -2*B]], [C, D]) th = np.arctan2(A, 1 - B)/2 c = np.cos(th) s = np.sin(th) k = 1/(xc*xc + B*yc*yc + A*xc*yc - E) a_inv2, b_inv2 = np.linalg.solve([[c*c, s*s], [s*s, c*c]], [k, k*B]) ra = np.sqrt(1/a_inv2) rb = np.sqrt(1/b_inv2) return xc, yc, th, ra, rb