Представление углов в виде пар cos / sin

Я использую класс для представления угла поворота …

class RotationAngle
{
protected:
float cosval;
float sinval;

__forceinline RotationAngle(float c, float s) { cosval = c; sinval = s; }

public:
__forceinline RotationAngle(float radians) { Set(radians); }
__forceinline RotationAngle(const RotationAngle& r) { Set(r); }

__forceinline void Set(float radians) { cosval = cos(radians); sinval = sin(radians); }
__forceinline void Set(const RotationAngle& r) { cosval = r.cosval; sinval = r.sinval; }

__forceinline float Cos() const { return cosval; }
__forceinline float Sin() const { return sinval; }

__forceinline RotationAngle& operator = (float radians) { Set(radians); return *this; }
__forceinline int operator == (const RotationAngle& r) const { return (r.cosval == cosval) && (r.sinval == sinval); }
__forceinline int operator != (const RotationAngle& r) const { return (r.cosval != cosval) || (r.sinval != sinval); }

};

Я использую это, чтобы добавить угол к точке или линии, используя оператор, и предварительно рассчитать синус и косинус. Было бы излишним пересчитывать синус и косинус углов каждый раз, когда точка поворачивалась на один и тот же угол.

class Point
{
public:
float x;
float y;

__forceinline void Set(float sx, float sy) { x = sx; y = sy; }
__forceinline void Rotate(const RotationAngle& a) { Set(x * a.Cos() - y * a.Sin(), x * a.Sin() + y * a.Cos()); }
__forceinline void operator += (const RotationAngle& a) { Rotate(a); }
};

Я хотел бы включить оператор — =, чтобы использовать отрицательное представление RotationAngle (то есть вращение против часовой стрелки). Будет ли работать просто -cos и -sin? Я не уверен, учитывая, что формула для добавления sin / cos не так проста. Есть ли быстрый способ сделать это?

0

Решение

Отрицание угла отрицает его синус, но оставляет его косинус неизменным. Так что может иметь смысл определить унарное отрицание:

RotationAngle operator-() const {return RotationAngle(cosval, -sinval);}

а затем определить -= с точки зрения этого

void operator -= (const RotationAngle& a) { Rotate(-a); }
1

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

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

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