【问题标题】:Representing angles as cos/sin pairs将角度表示为 cos/sin 对
【发布时间】:2013-10-01 16:54:48
【问题描述】:

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

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 的公式不是那么简单。有没有快速的方法来完成这个?

【问题讨论】:

    标签: c++ math rotation angle


    【解决方案1】:

    取反一个角度将取反其正弦,但保持其余弦不变。所以定义一元否定可能是有意义的:

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

    然后据此定义-=

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

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 2022-11-11
      • 1970-01-01
      • 2015-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      相关资源
      最近更新 更多