0

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 つまたはすべての原因を突き止めていただければ幸いです。

4

1 に答える 1

0

radians()関数とを変更することで問題を解決しましたrotate()。その他の機能は問題ありませんでした。

radians()修繕:

public double radians()
{
    return Math.Atan2(x, y); // swap the x and y
}

rotate()修繕:

public vector rotate(vector v)
{
    double theta = v.radians();

    // use the clockwise rotation matrix:
    // |  cos(theta) sin(theta) |
    // | -sin(theta) cos(theta) |
    return new vector(
        x * Math.Cos(theta) + y * Math.Sin(theta),
        x * -Math.Sin(theta) + y * Math.Cos(theta));
}

これにより、スキップ、逆回転、長さの短縮、および停止が修正されました。

これが私のような人に役立つことを願っています。

于 2016-10-02T23:07:14.240 に答える