Vector2D математика не дает мне правильных результатов

Я пытаюсь создать класс 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 )
}

Так что я был бы очень признателен, если бы кто-нибудь объяснил мне, что я здесь делаю не так 🙂

-1

Решение

Чтобы получить угол в диапазоне полного круга, вы должны использовать компоненты y и x с atan2 функция

return atan2( _y, _x );

Отметьте диапазон результатов -Pi..Pi и исправить отрицательный по одному +2*Pi если вам нужен диапазон 0..2*Pi

Еще одна проблема: :SetMagnitude Метод действительно умножает текущую величину на magnitude множитель, в то время как имя предполагает, что метод должен установить его (поэтому длина вектора 2 после применения SetMagnitude(2) будет иметь величину 4)).

Так что лучше бы убрать *hypotenuse умножение (или изменение имени метода)

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]