X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=ETL%2Ftrunk%2FETL%2F_angle.h;h=67989cae60c6ae9e0f57e5009ab0c405e6cbe559;hb=8ceee9e55e8fb6a4d32d81f7ff9f46f4d86a1209;hp=df69027ab071eccb95b556540787f22b0ef3b347;hpb=b3016b249333ac0ab0008d8c6c4d9029b2ff30c9;p=synfig.git diff --git a/ETL/trunk/ETL/_angle.h b/ETL/trunk/ETL/_angle.h index df69027..67989ca 100644 --- a/ETL/trunk/ETL/_angle.h +++ b/ETL/trunk/ETL/_angle.h @@ -1,7 +1,8 @@ +#include /* ======================================================================== ** Extended Template and Library ** Angle Abstraction Class Implementation -** $Id: _angle.h,v 1.1.1.1 2005/01/04 01:31:46 darco Exp $ +** $Id$ ** ** Copyright (c) 2002 Robert B. Quattlebaum Jr. ** @@ -59,52 +60,52 @@ public: protected: typedef value_type unit; - unit v; //! Stored in rotations - + unit v; //! Stored in radians; positive values indicate counter-clockwise. + public: - + /* ** Arithmetic Operators */ const angle & operator+=(const angle &rhs) - { v+=rhs.v; return *this; } + { v+=rhs.v; return *this; } const angle & operator-=(const angle &rhs) - { v-=rhs.v; return *this; } + { v-=rhs.v; return *this; } const angle & operator*=(const unit &rhs) - { v*=rhs; return *this; } + { v*=rhs; return *this; } const angle & operator/=(const unit &rhs) - { v/=rhs; return *this; } + { v/=rhs; return *this; } //! Angle Addition Operator angle operator+(const angle &rhs)const - { return angle(*this)+=rhs; } + { return angle(*this)+=rhs; } //! Angle Subtraction Operator /*! \sa angle dist(const angle &) */ angle operator-(const angle &rhs)const - { return angle(*this)-=rhs; } + { return angle(*this)-=rhs; } //! Angle Scalar Multiplication Operator /*! This operator will multiply the given angle by the given scalar value. */ angle operator*(const unit &rhs)const - { return angle(*this)*=rhs; } + { return angle(*this)*=rhs; } angle operator/(const unit &rhs)const - { return angle(*this)/=rhs; } - + { return angle(*this)/=rhs; } + //! Angle Negation angle operator-()const @@ -113,7 +114,7 @@ public: ret.v=-v; return ret; } - + //! 180 degree rotation operator /*! Returns the angle directly opposite of the given angle, and will yield a result @@ -122,61 +123,55 @@ public: operator~()const { angle ret; - ret.v=(value_type)std::floor(v+0.5f); - return ret; + ret.v = v+PI; + return ret.mod(); } /*! Returns true if the shortest - angle between the left-hand and - right-hand side is clockwise */ + angle from the left-hand to the + right-hand side is counter-clockwise */ bool operator<(const angle &rhs)const - { return v(const angle &rhs)const - { return v>rhs.v; } -// { return dist(rhs).v>(value_type)0.0; } + { return dist(rhs).v>(value_type)0.0; } /*! Returns true if the shortest - angle between the left-hand and - right-hand side is clockwise, + angle from the left-hand to the + right-hand side is counter-clockwise, or if the angles are refer to the same point on the unit circle. */ bool operator<=(const angle &rhs)const - { return v<=rhs.v; } -// { return dist(rhs).v<=(value_type)0.0; } + { return dist(rhs).v<=(value_type)0.0; } /*! Returns true if the shortest - angle between the left-hand and - right-hand side is counter-clockwise, + angle from the left-hand to the + right-hand side is clockwise, or if the angles are refer to the same point on the unit circle. */ bool operator>=(const angle &rhs)const - { return v>=rhs.v; } -// { return dist(rhs).v>=(value_type)0.0; } + { return dist(rhs).v>=(value_type)0.0; } /*! Returns true if the angles are refer to the same point on the unit circle. */ bool operator==(const angle &rhs)const - { return v==rhs.v; } -// { return dist(rhs).v==(value_type)0.0; } + { return std::abs(dist(rhs).v)epsilon; } //! Angle Difference Function /*! This function will return the @@ -187,11 +182,8 @@ public: dist(const angle &rhs)const { angle ret; - ret.v=v-rhs.v; - ret.v-=rot_floor(ret.v+PI); - return ret; } @@ -205,7 +197,8 @@ public: ret.v-=rot_floor(ret.v); return ret; } - + + //! Zero Rotation (0 degrees) static angle zero() { @@ -214,32 +207,36 @@ public: return ret; } + //! One Complete Rotation (360 degrees) static angle one() { angle ret; - ret.v=PI; + ret.v=PI*2; return ret; } + //! One Half Rotation (180 degrees) static angle half() { angle ret; - ret.v=PI*0.5; + ret.v=PI; return ret; } bool operator!()const { return v==0; } private: - + static value_type rot_floor(value_type x) { return static_cast(std::floor(x/(PI*2))*PI*2); } - + + static const value_type epsilon = 1.0e-6; + public: /* - ** Converstion Classes + ** Conversion Classes */ class rad; @@ -247,12 +244,12 @@ public: class rot; /* - ** Trigometric Classes + ** Trigonometric Classes */ class sin; class cos; - class tan; + class tan; /* ** Friend classes @@ -408,7 +405,7 @@ struct affine_combo //affine_combo() { std::cerr<<"affine_combo: I was created!"<: I was DELETED!"< : public std::binary_function