Я пытаюсь создать класс vector2D для своей игры, но думаю, что неправильно понял математику.
Когда я создаю новый объект 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;
и это выводит:
х: 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;
Я ожидал бы, что это выведет угол в рад: 3
но вместо этого я получаю
угол в рад: 0,141593.
Это класс vector2D (я попытался прокомментировать свой код, чтобы вы могли увидеть, о чем я думал, когда писал его):
#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 magnitudeSetY( (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
и исправить отрицательный по одному +2*Pi
если вам нужен диапазон 0..2*Pi
Еще одна проблема: :SetMagnitude
Метод действительно умножает текущую величину на magnitude
множитель, в то время как имя предполагает, что метод должен установить его (поэтому длина вектора 2 после применения SetMagnitude(2)
будет иметь величину 4)).
Так что лучше бы убрать *hypotenuse
умножение (или изменение имени метода)
Других решений пока нет …