概要
平面上の2次元ベクトルを回転させたいときのやり方についてのメモ。
Quaternionを使う方法もあるけど2次元の場合はもっと簡単な方法がある。
結論
複素数(Complex)を掛け算するだけでよい
用例
Complex構造体は内容的にはVector2と同じものである。
https://docs.microsoft.com/ja-jp/dotnet/api/system.numerics.complex?view=net-5.0
complexインスタンスにおけるRealがVector2のX、ImaginaryがYと考えて問題ない。
complexクラスには * のオーバーロードが実装されており、complex同士を掛けると掛けた分だけcomplexの各要素が反時計回りに回転するという性質がある。
なので、
・まず回転させたいVector2からComplexを作成する
・回転させたい角度のComplexを作成する
・上記2つのcomplexを掛ける
ことで目的のVector2を得られる。
下記がサンプルコード。Unityで利用するためMathfを利用しているが、特にUnityだけで利用するものでもないため適宜Mathなどに読み替えて利用すること。
/// <summary>
/// Vector2を回転させる
/// </summary>
/// <param name="from">回転させたいVector2</param>
/// <param name="angle">回転させる角度</param>
/// <returns></returns>
public static Vector2 Rotate(Vector2 from, float angle)
{
Complex a = new Complex(from.x, from.y);
float cos = Mathf.Cos(Mathf.Deg2Rad * angle);
float sin = Mathf.Sin(Mathf.Deg2Rad * angle);
Complex b = new Complex(cos, sin);
Complex result = a * b;
return new Vector2((float) result.Real, (float) result.Imaginary);
}
以上。