代码之家  ›  专栏  ›  技术社区  ›  user2255673

将角度表示为cos/sin对

  •  0
  • user2255673  · 技术社区  · 11 年前

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

    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的加法公式并不是那么简单,我不确定。有没有一种快速的方法可以做到这一点?

    1 回复  |  直到 11 年前
        1
  •  1
  •   Mike Seymour    11 年前

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

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

    然后定义 -= 就这一点而言

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