The angle comparison code was considering 90+359 degrees to be greater than 90 degree...
[synfig.git] / ETL / trunk / ETL / _angle.h
index df69027..34bc9f5 100644 (file)
@@ -1,7 +1,8 @@
+#include <stdio.h>
 /* ========================================================================
 ** 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,10 +60,10 @@ public:
 protected:
        typedef value_type unit;
 
-       unit v; //! Stored in rotations
-       
+       unit v; //! Stored in radians
+
 public:
-       
+
        /*
        ** Arithmetic Operators
        */
@@ -104,7 +105,7 @@ public:
        angle
        operator/(const unit &rhs)const
                { 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,8 +123,8 @@ 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
@@ -131,16 +132,14 @@ public:
                right-hand side is clockwise */
        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 */
        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
@@ -149,8 +148,7 @@ public:
                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
@@ -159,24 +157,21 @@ public:
                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 dist(rhs).v==(value_type)0.0; }
 
        /*! Returns false 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; }
 
        //! Angle Difference Function
        /*! This function will return the
@@ -189,9 +184,9 @@ public:
                angle ret;
 
                ret.v=v-rhs.v;
-               
+
                ret.v-=rot_floor(ret.v+PI);
-               
+
                return ret;
        }
 
@@ -205,7 +200,7 @@ public:
                ret.v-=rot_floor(ret.v);
                return ret;
        }
-       
+
        static angle
        zero()
        {
@@ -233,13 +228,13 @@ public:
        bool operator!()const { return v==0; }
 
 private:
-       
+
        static value_type rot_floor(value_type x)
        { return static_cast<value_type>(std::floor(x/(PI*2))*PI*2); }
-       
+
 public:
        /*
-       ** Converstion Classes
+       ** Conversion Classes
        */
 
        class rad;
@@ -247,12 +242,12 @@ public:
        class rot;
 
        /*
-       ** Trigometric Classes
+       ** Trigonometric Classes
        */
 
        class sin;
        class cos;
-       class tan; 
+       class tan;
 
        /*
        ** Friend classes
@@ -408,7 +403,7 @@ struct affine_combo<etl::angle, T>
 
        //affine_combo() { std::cerr<<"affine_combo<etl::angle,float>: I was created!"<<std::endl; }
        //~affine_combo() { std::cerr<<"affine_combo<etl::angle,float>: I was DELETED!"<<std::endl; }
-       
+
        etl::angle operator()(const etl::angle &a,const etl::angle &b,const time_type &t)const
        {
                return b.dist(a)*(float)t+a;
@@ -430,7 +425,7 @@ struct distance_func<etl::angle> : public std::binary_function<etl::angle, etl::
                //      return delta+etl::angle::one();
                return delta;
        }
-       
+
        etl::angle cook(const etl::angle &x)const { return x; }
        etl::angle uncook(const etl::angle &x)const { return x; }
 };