楕円パラメータの相互変換 (幾何学的 ⇔ 代数的)
楕円の表現
この記事では、楕円を表す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
参考文献
パソコン(ノートPC)を使った温度と湿度の計測 (USB9097 の紹介)
計測システム
温度や湿度の計測に使っているシステムの構成を紹介します。
- ノートPC + windows10 (USB ポート を使用)
- 1-wire adapter : USB9097 (PCsensor.com ShenZhen/China)
- 温度センサー: DS18B20
- 温度/湿度センサー : HIH-5030 + DS2438Z (TaaraLabs Estonia)
- 計測ソフト 自作(100% pure python) :
写真(左)にあるように、ステレオミニの二又ケーブルを使えば、センサーはいくつでも増やせます。ケーブルの総延長も 100m くらいまでなら、あまり気にせずに実現できると思います。参考までに、amazon などで安い二又ケーブルを探すと、左右チャンネルを入れ替える(謎な)商品もあるようで注意が必要です ^^;
自作のソフトは UART を直接制御する 100% pure python の実装ですので、USB/シリアルポートの設定さえできれば、OS には依存しないはずです。
1-Wire に関する補足
ダラス・セミコンダクター(今は maxima の子会社)が開発した 1- wire bus は、 いもづる式に温度計や湿度計を接続できて、PCを使った多点計測/記録に重宝します。
DS9097U と DS9490
昔ながらの RS-232C ポートがあるデスクトップPC を使ってシステムを構築するのであれば、DS9097U というアダプタを使うのが簡単です。maxima が販売している USB 用の DS9490というアダプタもあるのですが、こちらは USB デバイスの設定方法が OS によって色々で、数年前に試した時は windows に java や C++ 環境を導入して動かすのがやっとという感じでした。
USB9097
そんなときに見つけたのが (PCsensor.com ShenZhen/China)の USB9097 です。こちらは、USB / RS-232C 変換 と DS9097U を一つにまとめたような製品です。利点は
- USB ポートに接続するが DS9097U と同じプログラムが使える
- stereo-mini プラグ(3線)により外部電源(Vcc)を前提としてシステムを組める
といったところです。特に Vcc を前提とするとパラサイト電源周りの制御が不要になってソフトウェアは簡単になり、温度計測の安定性も向上します。もっとも、Vcc なしでもシステムを構築できることが 1-wire の大きな魅力の一つではあるのですが、実用の点からは Vcc が利用できるなら利用するという判断でokでしょう。