我为正在制作的游戏编写了自定义Vector2D类。据我所知,旋转函数在数学上是正确的,但是在测试时却得到奇怪的输出。
很明显,我使用浮点数做错了事,但是我对于诊断和解决这些问题迷失了。
以下是我测试代码的所有相关功能:
float Vector2D::Magnitude() const
{
return sqrtf((X * X) + (Y * Y));
}
float Vector2D::Angle() const
{
float rad = atanf(Y / X);
float degrees = rad * 180.0f / PI;
return degrees;
}
void Vector2D::Rotate(float degrees)
{
float angle = degrees * PI / 180.0f;
float s = sinf(angle);
float c = cosf(angle);
float newX = (c * X) - (s * Y);
float newY = (s * X) + (c * Y);
X = newX;
Y = newY;
}
我的测试设置:
Vector2D c(1.0f, 1.0f);
for (int i = 0; i < 8; i++)
{
c.Rotate(90);
std::cout << "Angle: " << c.Angle() << " Magnitude: " << c.Magnitude() << " X: " << c.X << " Y: " << c.Y << std::endl;
}
1.0f,1.0f,如X和Y给出以下输出:
Angle: -45 Magnitude: 1.41421 X: -1 Y: 1
Angle: 45 Magnitude: 1.41421 X: -1 Y: -1
Angle: -45 Magnitude: 1.41421 X: 1 Y: -1
Angle: 45 Magnitude: 1.41421 X: 1 Y: 1
Angle: -45 Magnitude: 1.41421 X: -1 Y: 1
Angle: 45 Magnitude: 1.41421 X: -1 Y: -1
Angle: -45 Magnitude: 1.41421 X: 1 Y: -1
Angle: 45 Magnitude: 1.41421 X: 1 Y: 1
当使用1.0f,0.0f作为X和Y测试上面的代码时,这是我得到的输出:
Angle: -90 Magnitude: 1 X: -4.37114e-08 Y: 1
Angle: 5.00896e-06 Magnitude: 1 X: -1 Y: -8.74228e-08
Angle: -90 Magnitude: 1 X: 1.31134e-07 Y: -1
Angle: 1.00179e-05 Magnitude: 1 X: 1 Y: 1.74846e-07
Angle: -90 Magnitude: 1 X: -2.18557e-07 Y: 1
Angle: 1.50269e-05 Magnitude: 1 X: -1 Y: -2.62268e-07
Angle: -90 Magnitude: 1 X: 3.0598e-07 Y: -1
Angle: 2.00358e-05 Magnitude: 1 X: 1 Y: 3.49691e-07
这些都不正确。我对1.0f,1.0f的期望值:
Angle: 90 Magnitude: 1 X: 1 Y: 1
Angle: 180 Magnitude: 1 X: -1 Y: -1
Angle: 270 Magnitude: 1 X: 1 Y: -1
Angle: 360 (or 0): Magnitude: 1 X: 1 Y: 1
以此类推,在接下来的4次循环中。
对于1.0f,0.0f,输出应为:
角度:90幅度:1 X:0 Y:1 角度:180幅度:1 X:-1 Y:0 角度:270幅度:1 X:0 Y:-1 角度:360(或0)幅度:1 X:1 Y:0
如果有人能很好地解释我做错了什么,我将非常感谢指导。
答案 0 :(得分:0)
没关系,这个问题不是我的数学问题(除了atan2f与atan问题)。 问题是我如何在代码的另一个区域中使用旋转。
感谢您的帮助,我应该检查过与Vector类一起使用的代码是否正确。