Tekkotsu Homepage
Demos
Overview
Downloads
Dev. Resources
Reference
Credits

Measures.h

Go to the documentation of this file.
00001 #ifndef INCLUDED_Measures_h_
00002 #define INCLUDED_Measures_h_
00003 
00004 #include <cmath>
00005 
00006 typedef float coordinate_t; //!< type used for positional coordinates
00007 typedef float orientation_t; //!< type used for orientation values (0 to Pi)
00008 typedef float direction_t; //!< type used for direction values (0 to 2*Pi)
00009 
00010 const direction_t Pi=M_PI; //!< shorthand for ::M_PI from math.h
00011 const direction_t TwoPi=2*M_PI; //!< shorthand for 2*M_PI 
00012 
00013 typedef coordinate_t Slope; //!< type used for ratio of coordinate offsets
00014 const Slope BIG_SLOPE=5000.0; //!< slopes larger than this are considered vertical, or in other words, infinite slopes are rounded to this
00015 
00016 //! Circular arithmetic on angles between 0 and pi (180 degrees)
00017 class AngPi {
00018   friend AngPi angdist(AngPi const &arg1, AngPi const &arg2);
00019 public:
00020   AngPi(void) : value(0) {}; //!< constructor, #value defaults to 0
00021   AngPi(orientation_t const &v) : value(v) { normalize(); } //!< conversion operator allows implicit construction from primitive
00022   
00023   AngPi operator+(AngPi const &arg) const { return AngPi(value+arg.value); };
00024   AngPi operator-(AngPi const &arg) const { return AngPi(value-arg.value); };
00025   AngPi operator*(orientation_t const &arg) const { return AngPi(value*arg); };
00026   AngPi operator/(orientation_t const &arg) const { return AngPi(value/arg); };
00027   
00028   AngPi& operator=(AngPi const &arg) { value = arg.value; return(*this); };
00029   AngPi& operator=(orientation_t const &arg) { value = arg; normalize(); return(*this); };
00030   AngPi& operator+=(orientation_t const &arg) { value += arg; normalize(); return(*this); };
00031   AngPi& operator-=(orientation_t const &arg) { value -= arg; normalize(); return(*this); };
00032   AngPi& operator*=(orientation_t const &arg) { value *= arg; normalize(); return(*this); };
00033   AngPi& operator/=(orientation_t const &arg) { value /= arg; normalize(); return(*this); };
00034   
00035   operator orientation_t() const { return value; }; //!< conversion operator for going back to the primitive type
00036   
00037 protected:
00038   void normalize(); //!< modifies #value to put it back in range
00039   orientation_t value; //!< holds the angle, should be kept normalized at all times
00040 };
00041 
00042 //! Angular distance: value is between 0 and pi/2
00043 AngPi angdist(AngPi const &arg1, AngPi const &arg2);
00044 
00045 //! Circular arithmetic on angles between 0 and two pi (360 degrees)
00046 class AngTwoPi {
00047   friend AngPi angdist(AngTwoPi const &arg1, AngTwoPi const &arg2);
00048 public:
00049   AngTwoPi(void) : value(0) {}; //!< constructor, #value defaults to 0
00050   AngTwoPi(direction_t const &v) : value(v) { normalize(); } //!< conversion operator allows implicit construction from primitive
00051   
00052   AngTwoPi operator+(AngTwoPi const &arg) const { return AngTwoPi(value+arg.value); };
00053   AngTwoPi operator-(AngTwoPi const &arg) const { return AngTwoPi(value-arg.value); };
00054   AngTwoPi operator*(direction_t const &arg) const { return AngTwoPi(value*arg); };
00055   AngTwoPi operator/(direction_t const &arg) const { return AngTwoPi(value/arg); };
00056   
00057   AngTwoPi& operator=(AngTwoPi const &arg) { value = arg.value; return(*this); };
00058   AngTwoPi& operator=(direction_t const &arg) { value = arg; normalize(); return(*this); };
00059   AngTwoPi& operator+=(direction_t const &arg) { value += arg; normalize(); return(*this); };
00060   AngTwoPi& operator-=(direction_t const &arg) { value -= arg; normalize(); return(*this); };
00061   AngTwoPi& operator*=(direction_t const &arg) { value *= arg; normalize(); return(*this); };
00062   AngTwoPi& operator/=(direction_t const &arg) { value /= arg; normalize(); return(*this); };
00063   
00064   operator direction_t() const { return value; }; //!< conversion operator for going back to the primitive type
00065   
00066 protected:
00067   void normalize(); //!< modifies #value to put it back in range
00068   direction_t value; //!< holds the angle, should be kept normalized at all times
00069 };
00070 
00071 //! Angular distance: value is between 0 and pi
00072 AngPi angdist(AngTwoPi const &arg1, AngTwoPi const &arg2);
00073 
00074 //! Circular arithmetic on angles between -pi and pi (360 degrees)
00075 class AngSignPi {
00076   friend AngPi angdist(AngSignPi const &arg1, AngSignPi const &arg2);
00077 public:
00078   AngSignPi(void) : value(0) {}; //!< constructor, #value defaults to 0
00079   AngSignPi(direction_t const &v) : value(v) { normalize(); } //!< conversion operator allows implicit construction from primitive
00080   
00081   AngSignPi operator+(AngSignPi const &arg) const { return AngSignPi(value+arg.value); };
00082   AngSignPi operator-(AngSignPi const &arg) const { return AngSignPi(value-arg.value); };
00083   AngSignPi operator*(direction_t const &arg) const { return AngSignPi(value*arg); };
00084   AngSignPi operator/(direction_t const &arg) const { return AngSignPi(value/arg); };
00085   
00086   AngSignPi& operator=(AngSignPi const &arg) { value = arg.value; return(*this); };
00087   AngSignPi& operator=(direction_t const &arg) { value = arg; normalize(); return(*this); };
00088   AngSignPi& operator+=(direction_t const &arg) { value += arg; normalize(); return(*this); };
00089   AngSignPi& operator-=(direction_t const &arg) { value -= arg; normalize(); return(*this); };
00090   AngSignPi& operator*=(direction_t const &arg) { value *= arg; normalize(); return(*this); };
00091   AngSignPi& operator/=(direction_t const &arg) { value /= arg; normalize(); return(*this); };
00092   
00093   operator direction_t() const { return value; }; //!< conversion operator for going back to the primitive type
00094 
00095 protected:
00096   void normalize(); //!< modifies #value to put it back in range
00097   direction_t value; //!< holds the angle, should be kept normalized at all times
00098 };
00099 
00100 //! Angular distance: value is between 0 and pi
00101 AngPi angdist(AngSignPi const &arg1, AngSignPi const &arg2);
00102 
00103 #endif

Tekkotsu v4.0
Generated Thu Nov 22 00:54:54 2007 by Doxygen 1.5.4