LoginSignup
7
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-10-12

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
スレッドセーフなどかなり気を使っていますが、低レベルなことしか出来ません。
自由にドットを表示するだけのパッケージなので動画再生や画像の表示、加工のアニメーション等も出来ます(自動圧縮等しないので超遅い)

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4