🥾
【GO】mathパッケージの三角関数を使ってAtCoder Beginner Contest 259のB問題を解く
概要
AtCoder Beginner Contest 259のB - Counterclockwise Rotationは、三角関数を使って解く問題となります。解法としては【数学ⅡB】点の回転【慶應義塾大・兵庫県立大・早稲田大】の記事で紹介されている公式点P(𝑎, 𝑏) を原点のまわりに𝜃だけ回転させて点をQとすると、Q(𝑎cos𝜃−𝑏sin𝜃, 𝑎sin𝜃+𝑏cos𝜃)
を使えば良いです。
今回はこの問題を、Goのmath
パッケージを使って解いてみます。
使うメソッド
math
パッケージのmath.Cos
とmath.Sin
を使用します。使い方は[math] コサイン(余弦)を求める (Cos)を参照ください。
実装サンプル
こちらが提出結果です。念のためコードものせておきます。
package main
import (
"fmt"
"math"
"strconv"
)
func main() {
var a, b, d float64
fmt.Scan(&a, &b, &d)
radian := d * math.Pi / 180
cos := math.Cos(radian)
sin := math.Sin(radian)
aResult := a*cos - b*sin
bResult := a*sin + b*cos
fmt.Println(strconv.FormatFloat(aResult, 'f', -1, 64) + " " + strconv.FormatFloat(bResult, 'f', -1, 64))
}
おまけ
2点間の角度を求める時には、[math] XY座標から角度を求める (Atan2)の記事にある通り、math.Atan2
を使用します。
Discussion
解説にもありますが、Golangもcomplex型で複素数を扱えるので複素数を使うと楽ちんです。
複素数は例えば下記のように初期化できます。
cmplx.Rect(r, theta)
で、長さr、角度θ(ラジアン)の複素数を表現できます。複素数における回転は、
かける複素数の長さが1でなく例えばr'だった場合、元の複素数の絶対値がr'倍になる
ですが、今回は原点なので単に掛け算して実部と虚部を出力するだけでOKです。
参考
実際の提出はこちら
コメントありがとうございます。
複素数扱えたんですね、知らなかった。。