+#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.
**
protected:
typedef value_type unit;
- unit v; //! Stored in rotations
-
+ unit v; //! Stored in radians
+
public:
-
+
/*
** Arithmetic Operators
*/
angle
operator/(const unit &rhs)const
{ return angle(*this)/=rhs; }
-
+
//! Angle Negation
angle
operator-()const
ret.v=-v;
return ret;
}
-
+
//! 180 degree rotation operator
/*! Returns the angle directly opposite of
the given angle, and will yield a result
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
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
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
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; }
/*! 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 std::abs(dist(rhs).v)>epsilon; }
//! Angle Difference Function
/*! This function will return the
angle ret;
ret.v=v-rhs.v;
-
+
ret.v-=rot_floor(ret.v+PI);
-
+
return ret;
}
ret.v-=rot_floor(ret.v);
return ret;
}
-
+
static angle
zero()
{
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); }
-
+
+ static const value_type epsilon = 1.0e-6;
+
public:
/*
- ** Converstion Classes
+ ** Conversion Classes
*/
class rad;
class rot;
/*
- ** Trigometric Classes
+ ** Trigonometric Classes
*/
class sin;
class cos;
- class tan;
+ class tan;
/*
** Friend classes
//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;
// 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; }
};