c++ - Vector2D 数学没有给我正确的结果
c++ - Vector2D math not giving me the right results
我正在尝试为我的游戏创建一个 vector2D class,但我认为我的数学有误。
当我创建一个新的 vector2d 对象时,它会在构造函数中自动将其 x 和 y 设置为 1, 1。
Vector2D vec;
std::cout << " x: " << vec.GetX() << " y: " << vec.GetY() << " angle rad: " << vec.GetAngleRad() << " magnitude: " << vec.GetMagnitude() << std::endl;
system("pause");
return 0;
它输出:
x: 1
是:1
弧度角度:0.785398
震级:1.41421
(这正是我所期望的)
但问题是当我将任何内容解析到 setAngle 函数时,我得到了一些有线结果。
例如:
Vector2D vec;
vec.SetAngleRad(3);
std::cout << " x: " << vec.GetX() << " y: " << vec.GetY() << " angle rad: " << vec.GetAngleRad() << " magnitude: " << vec.GetMagnitude() << std::endl;
system("pause");
return 0;
我希望它以 rad 为单位输出角度:3
但我得到了
弧度角度:0.141593.
这是 vector2D class(我试着评论我的代码,这样你就可以看到我写代码时的想法):
#include "Vector2D.h"
Vector2D::Vector2D():
_x(1.0f),
_y(1.0f)
{
}
Vector2D::~Vector2D()
{
}
void Vector2D::SetX(float x)
{
_x = x;
}
float Vector2D::GetX()
{
return _x;
}
void Vector2D::SetY(float y)
{
_y = y;
}
float Vector2D::GetY()
{
return _y;
}
void Vector2D::SetAngleRad(float angle)
{
float hypotenuse = GetMagnitude();
SetX( cos(angle) * hypotenuse); // cos of angle = x / hypotenuse
// so x = cos of angle * hypotenuse
SetY( sin(angle) * hypotenuse); //sin of angle = y / hypotenuse
// so y = sin of angle * hypotenuse
}
float Vector2D::GetAngleRad()
{
float hypotenuse = GetMagnitude();
return asin( _y / hypotenuse ); // if sin of angle A = y / hypotenuse
// then asin of y / hypotenuse = angle
}
void Vector2D::SetMagnitude(float magnitude)
{
float angle = GetAngleRad();
float hypotenuse = GetMagnitude();
SetX( (cos(angle) * hypotenuse) * magnitude ); // cos of angle = x / hypotenuse
// so cos of angle * hypotenuse = x
// multiplied by the new magnitude
SetY( (sin(angle) * hypotenuse) * magnitude); //sin of angle = y / hypotenuse
// so sin of angle * hypotenuse = y
// multipied by the new magnitude
}
float Vector2D::GetMagnitude()
{
return sqrt( (_x * _x) + (_y * _y) ); // a^2 + b^2 = c^2
//so c = sqrt( a^2 + b^2 )
}
所以,如果有人能向我解释我在这里做错了什么,我将不胜感激:)
要获得全圆范围内的角度,您必须将 y 和 x 分量与 atan2
函数一起使用
return atan2( _y, _x );
注意结果范围 -Pi..Pi
,如果需要范围 0..2*Pi
,则按 +2*Pi
更正负数
另一个问题::SetMagnitude
方法实际上是将当前幅度乘以 magnitude
倍数,而名称假定该方法应该设置它(因此应用 SetMagnitude(2)
后的向量长度 2 将具有幅度 4 )).
所以最好删除 *hypotenuse
乘法(或更改方法名称)
我正在尝试为我的游戏创建一个 vector2D class,但我认为我的数学有误。
当我创建一个新的 vector2d 对象时,它会在构造函数中自动将其 x 和 y 设置为 1, 1。
Vector2D vec;
std::cout << " x: " << vec.GetX() << " y: " << vec.GetY() << " angle rad: " << vec.GetAngleRad() << " magnitude: " << vec.GetMagnitude() << std::endl;
system("pause");
return 0;
它输出:
x: 1
是:1
弧度角度:0.785398
震级:1.41421
(这正是我所期望的)
但问题是当我将任何内容解析到 setAngle 函数时,我得到了一些有线结果。
例如:
Vector2D vec;
vec.SetAngleRad(3);
std::cout << " x: " << vec.GetX() << " y: " << vec.GetY() << " angle rad: " << vec.GetAngleRad() << " magnitude: " << vec.GetMagnitude() << std::endl;
system("pause");
return 0;
我希望它以 rad 为单位输出角度:3
但我得到了
弧度角度:0.141593.
这是 vector2D class(我试着评论我的代码,这样你就可以看到我写代码时的想法):
#include "Vector2D.h"
Vector2D::Vector2D():
_x(1.0f),
_y(1.0f)
{
}
Vector2D::~Vector2D()
{
}
void Vector2D::SetX(float x)
{
_x = x;
}
float Vector2D::GetX()
{
return _x;
}
void Vector2D::SetY(float y)
{
_y = y;
}
float Vector2D::GetY()
{
return _y;
}
void Vector2D::SetAngleRad(float angle)
{
float hypotenuse = GetMagnitude();
SetX( cos(angle) * hypotenuse); // cos of angle = x / hypotenuse
// so x = cos of angle * hypotenuse
SetY( sin(angle) * hypotenuse); //sin of angle = y / hypotenuse
// so y = sin of angle * hypotenuse
}
float Vector2D::GetAngleRad()
{
float hypotenuse = GetMagnitude();
return asin( _y / hypotenuse ); // if sin of angle A = y / hypotenuse
// then asin of y / hypotenuse = angle
}
void Vector2D::SetMagnitude(float magnitude)
{
float angle = GetAngleRad();
float hypotenuse = GetMagnitude();
SetX( (cos(angle) * hypotenuse) * magnitude ); // cos of angle = x / hypotenuse
// so cos of angle * hypotenuse = x
// multiplied by the new magnitude
SetY( (sin(angle) * hypotenuse) * magnitude); //sin of angle = y / hypotenuse
// so sin of angle * hypotenuse = y
// multipied by the new magnitude
}
float Vector2D::GetMagnitude()
{
return sqrt( (_x * _x) + (_y * _y) ); // a^2 + b^2 = c^2
//so c = sqrt( a^2 + b^2 )
}
所以,如果有人能向我解释我在这里做错了什么,我将不胜感激:)
要获得全圆范围内的角度,您必须将 y 和 x 分量与 atan2
函数一起使用
return atan2( _y, _x );
注意结果范围 -Pi..Pi
,如果需要范围 0..2*Pi
+2*Pi
更正负数
另一个问题::SetMagnitude
方法实际上是将当前幅度乘以 magnitude
倍数,而名称假定该方法应该设置它(因此应用 SetMagnitude(2)
后的向量长度 2 将具有幅度 4 )).
所以最好删除 *hypotenuse
乘法(或更改方法名称)