旋转 2 向量,向后移动和跳过区域。 C#

Rotating 2-vectors, moving backwards and skipping regions. C#

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

这是我用于旋转的代码(在向量 class 中,带有 double 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
}

当我使用这些旋转矢量时,它会旋转 counter-clockwise,而不是我认为应该顺时针旋转的方向。为了演示,一张图片:

它的旋转也比我想象的要多得多。另一个更难解释的问题是旋转在大约四分之二的范围内顺利进行,但跳过了另外两个。我发现的另一个问题是,如果我旋转矢量的角度很小(在我的测试中,超过 (1, 10)),旋转会开始强烈,但会减慢并最终停止。在我看来,这像是 C# double 的精度问题,但我试图通过确保旋转矢量的长度不变来修复它。

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

我通过更改函数 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));
}

这修复了跳跃、向后旋转、长度缩短和停止。

希望这对像我这样的人有所帮助。