0

我正在尝试使用 2 向量的旋转,但我遇到了两个问题。首先,向量似乎在向后旋转,其次,向量在旋转时会在两个区域之间跳跃。

这是我用于旋转的代码(在矢量类中,带有 adouble xdouble 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, 10) 的角度),旋转开始时很强烈,但会减慢并最终停止。这在我看来像是 C# 的精度问题double,但我试图通过确保旋转矢量的长度不会改变来解决它。

无论如何,如果您能发现我的一个或所有问题的原因,那将不胜感激。

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 回答