Go
golang

golang complex(複素数)型の計算をする

More than 1 year has passed since last update.


golang

golang complex(複素数)型を使うで基本的な使い方を解説しています。

今回はこういう画像を使って解説します。

Shiny Window 2016_10_11 21_07_03.png

縦軸=虚数 (上が3i、下が-3i)

横軸=実数 (左が-3、右が3)


絶対値

math/cmplxパッケージのAbs()関数で絶対値を求めることができます。

Shiny Window 2016_10_12 14_08_51.png

水色の矢印の長さが絶対値です。

水色の線と、黄色の点から垂直に降りる線と、横軸の線をつなぐと直角三角形で、黄色の点の座標から水色の線(斜辺)の長さを求めることができます。

これはピタゴラスの定理の計算です。

実数型と複素数型で比較してみます。

float64でのピタゴラスの定理の計算


f1 := 1.0
f2 := 2.0
ans := math.Sqrt(math.Pow(f1, 2) + math.Pow(f2, 2))


complex128での絶対値の計算


c := 1+2i
ans := math.Abs(c)


複素数の仕組みさえ分かっていれば、このようにとても短く書くことができます。


加算,減算 -> 座標の移動とベクトルの加算・減算

Shiny Window 2016_10_12 13_29_30.png

赤は加算、緑は減算した結果を表しています。

黄色の円黄色の円は初期値(足される、引かれる前の数)です。

加算すると右上に、左下に来ることがわかります。

加算と減算はそのまま座標がずれる計算です。

f688df36-761f-5478-f0a0-534f8ad7480f.png

また同時に、ベクトルの計算でもあります。

こういった動画の方がイメージがつかみやすいでしょうか。

Dimensions 第5章 複素数


乗算,除算 = 回転と絶対値の変化

Shiny Window 2016_10_12 13_29_48.png

青は乗算、白は除算した結果を表しています。

黄色い点が基準になるよう青が左回転し、白がその逆方向に回転しています。

また、黄色の点が基準になるように青が拡大され、白が縮小されています。

これは、実数の値だけ拡大縮小され、虚数の値だけ回転するという複素数の性質によるものです。

虚数の値をかけるだけで画像の回転を実現したり、実数をかけるだけで拡大縮小ができてしまいます。

画像の加工で大活躍ですね!


べき乗

べき乗は複雑な計算に思えるかもしれませんが、虚数に対してのべき乗は座標上の回転量の調整に過ぎません。

先ほど載せたDimensions 第5章 複素数こちらを見ていただければわかるかと思いますが、虚数をかけることは座標上の1/4回転にあたります。

cmplx.Pow(1i, 2)

1/4*2 = 1/2回転、つまり実数の-1と同じです。

cmplx.Pow(1i, 1.0/2.0)

1/4*1/2 = 1/8回転です。

v := 1+0i  //初期位置=1

c := cmplx.Pow(1i, 1.0/50.0) // 一度に(1/200)の回転
for n := 0; n < 200; n++{ //200回なので1回転
fmt.Println(real(v), imag(v))
v *= c
}

たったこれだけで半径1の円座標の計算ができてしまいます。


その他

描画は自作ツールです。

github: rcwindow

スレッドセーフなどかなり気を使っていますが、低レベルなことしか出来ません。

自由にドットを表示するだけのパッケージなので動画再生や画像の表示、加工のアニメーション等も出来ます(自動圧縮等しないので超遅い)