我正在尝试使用 2 向量的旋转,但我遇到了两个问题。首先,向量似乎在向后旋转,其次,向量在旋转时会在两个区域之间跳跃。
这是我用于旋转的代码(在矢量类中,带有 adouble 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, 10) 的角度),旋转开始时很强烈,但会减慢并最终停止。这在我看来像是 C# 的精度问题double
,但我试图通过确保旋转矢量的长度不会改变来解决它。
无论如何,如果您能发现我的一个或所有问题的原因,那将不胜感激。