旋转 2 向量,向后移动和跳过区域。 C#
Rotating 2-vectors, moving backwards and skipping regions. C#
我正在尝试使用 2 向量的旋转,但我有 运行 两个问题。首先,向量似乎在向后旋转,其次,向量在旋转时会在两个区域之间跳跃。
这是我用于旋转的代码(在向量 class 中,带有 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
}
当我使用这些旋转矢量时,它会旋转 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));
}
这修复了跳跃、向后旋转、长度缩短和停止。
希望这对像我这样的人有所帮助。
我正在尝试使用 2 向量的旋转,但我有 运行 两个问题。首先,向量似乎在向后旋转,其次,向量在旋转时会在两个区域之间跳跃。
这是我用于旋转的代码(在向量 class 中,带有 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
}
当我使用这些旋转矢量时,它会旋转 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));
}
这修复了跳跃、向后旋转、长度缩短和停止。
希望这对像我这样的人有所帮助。