🥾

【GO】mathパッケージの三角関数を使ってAtCoder Beginner Contest 259のB問題を解く

2022/07/18に公開2

概要

AtCoder Beginner Contest 259のB - Counterclockwise Rotationは、三角関数を使って解く問題となります。解法としては【数学ⅡB】点の回転【慶應義塾大・兵庫県立大・早稲田大】の記事で紹介されている公式点P(𝑎, 𝑏) を原点のまわりに𝜃だけ回転させて点をQとすると、Q(𝑎cos𝜃−𝑏sin𝜃, 𝑎sin𝜃+𝑏cos𝜃)を使えば良いです。
今回はこの問題を、Goのmathパッケージを使って解いてみます。

使うメソッド

mathパッケージのmath.Cosmath.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

yu_s_1985yu_s_1985

解説にもありますが、Golangもcomplex型で複素数を扱えるので複素数を使うと楽ちんです。

package main

import (
	"fmt"
	"math"
	"math/cmplx"
)

func main() {
	var a, b, d float64
	fmt.Scan(&a, &b, &d)

	P := complex(a, b)
	rad := math.Pi / 180 * d
	P *= cmplx.Rect(1.0, rad)
	fmt.Println(real(P), imag(P))
}

複素数は例えば下記のように初期化できます。

P := 1 + 2i
P := complex(a, b)

cmplx.Rect(r, theta)で、長さr、角度θ(ラジアン)の複素数を表現できます。

複素数における回転は、

  1. 原点に移動
  2. 移動した複素数に対して長さ1、角度θの複素数の積を取る
    かける複素数の長さが1でなく例えばr'だった場合、元の複素数の絶対値がr'倍になる
  3. 元の座標に戻す

ですが、今回は原点なので単に掛け算して実部と虚部を出力するだけでOKです。

参考
https://golangdocs.com/complex-numbers-in-golang

実際の提出はこちら

なかつがわなかつがわ

コメントありがとうございます。
複素数扱えたんですね、知らなかった。。