Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将角度表示为cos/sin对_C++_Math_Rotation_Angle - Fatal编程技术网

C++ 将角度表示为cos/sin对

C++ 将角度表示为cos/sin对,c++,math,rotation,angle,C++,Math,Rotation,Angle,我正在使用一个类来表示旋转角度 class RotationAngle { protected: float cosval; float sinval; __forceinline RotationAngle(float c, float s) { cosval = c; sinval = s; } public: __forceinline RotationAngle(float radians) { Set(radians); } __forcei

我正在使用一个类来表示旋转角度

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); }
};

我想包括一个-=操作符来使用旋转角度的负表示(即逆时针旋转)。简单地使用-cos和-sin有效吗?我不确定考虑加入sin/cos的公式是否那么简单。有没有一种快速的方法来实现这一点?

对角度求反会对其正弦求反,但对其余弦保持不变。因此,定义一元否定可能是有意义的:

RotationAngle operator-() const {return RotationAngle(cosval, -sinval);}
然后用这个定义
-=

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