2-ベクトルの回転を使用しようとしていますが、2 つの問題に遭遇しました。1 つ目はベクトルが逆方向に回転しているように見えること、2 つ目はベクトルが回転するときに 2 つの領域間をスキップすることです。
これは私が回転に使用しているコードです(ベクタークラスで とdouble x
を使用double y
):
public double radians()
{
return Math.Atan2(y, x);
}
public double len()
{
return Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2));
}
public vector mul(double d)
{
return new vector(x * d, y * d);
}
public vector div(double d)
{
return new vector(x / d, y / d);
}
public vector unit()
{
return div(len());
}
public vector rotate(vector v)
{
double theta = v.radians();
return new vector(
x * Math.Cos(theta) - y * Math.Sin(theta),
x * Math.Cos(theta) + y * Math.Sin(theta))
.unit().mul(len()); // without this, the rotated vector is smaller than the original
}
これらを使用してベクトルを回転させると、時計回りではなく反時計回りに回転するはずです。デモンストレーションのために、画像:
また、思った以上に回転しました。説明が難しいもう 1 つの問題は、回転がスパンの約 4 分の 2 でスムーズに機能するが、他の 2 つをスキップすることです。私が見つけたもう 1 つの問題は、ベクトルを回転させる角度が小さい場合 (私のテストでは (1, 10) を超えるもの)、回転が強く始まりますが、遅くなり、最終的には停止することです。これは C# の精度の問題のように見えますdouble
が、回転したベクトルの長さが変わらないようにすることで修正しようとしました。
とにかく、私の問題の 1 つまたはすべての原因を突き止めていただければ幸いです。