楕円パラメータの相互変換 (幾何学的 ⇔ 代数的)
楕円の表現
この記事では、楕円を表す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