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 乘法(或更改方法名称)