From 08463035d28394d2d700da1de70ccf8054ca2ba7 Mon Sep 17 00:00:00 2001 From: DarkWyrm Date: Sat, 9 Nov 2002 21:28:02 +0000 Subject: [PATCH] Forgot to add Angle class to build git-svn-id: file:///srv/svn/repos/haiku/trunk/current@1895 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/proto7/Angle.cpp | 292 +++++++++++++++++++++++++++++++ src/servers/app/proto7/Angle.h | 46 +++++ 2 files changed, 338 insertions(+) create mode 100644 src/servers/app/proto7/Angle.cpp create mode 100644 src/servers/app/proto7/Angle.h diff --git a/src/servers/app/proto7/Angle.cpp b/src/servers/app/proto7/Angle.cpp new file mode 100644 index 0000000000..cd509621dd --- /dev/null +++ b/src/servers/app/proto7/Angle.cpp @@ -0,0 +1,292 @@ +#include "Angle.h" + +#ifndef ANGLE_PI + #define ANGLE_PI 3.14159268979323846 +#endif + +bool tables_initialized=false; +float sintable[360], costable[360], tantable[360]; + +Angle::Angle(float angle) +{ + angle_value=angle; + if(tables_initialized==false) + { + InitTrigTables(); + tables_initialized=true; + } +} + +Angle::Angle(void) +{ + angle_value=0; + if(tables_initialized==false) + { + InitTrigTables(); + tables_initialized=true; + } +} + +Angle::~Angle(void) +{ +} + +void Angle::Normalize(void) +{ + // if the value of the angle is >=360 or <0, make it so that it is + // within those bounds + + if(angle_value>359) + { + while(angle_value>359) + angle_value-=360; + return; + } + if(angle_value<0) + { + while(angle_value<0) + angle_value+=360; + } +} + +float Angle::Sine(void) +{ + return sintable[(int)angle_value]; +} + +Angle Angle::InvSine(float value) +{ + // Returns the inverse sine of a value in the range 0 <= value <= 1 via + // reverse-lookup any value out of range causes the function to return 0 + uint16 i=90; + + // Filter out bad values + if(value<0) + value*=-1; + + if(value > 1) + return 0; + + while(value < sintable[i]) + i--; + + // current sintable[i] is less than value. Pick the degree value which is closer + // to the passed value + if( (value - sintable[i]) > (sintable[i+1] - value) ) + return (i+1); + + return Angle(i); // value is closer to previous +} + + +float Angle::Cosine(void) +{ + return costable[(int)angle_value]; +} + +Angle Angle::InvCosine(float value) +{ + // Returns the inverse cosine of a value in the range 0 <= value <= 1 via + // reverse-lookup any value out of range causes the function to return 0 + uint16 i=90; + + // Filter out bad values + if(value<0) + value*=-1; + + if(value > 1) + return 0; + + while(value > costable[i]) + i--; + + // current costable[i] is less than value. Pick the degree value which is closer + // to the passed value + if( (value - costable[i]) < (costable[i+1] - value) ) + return (i+1); + + return Angle(i); // value is closer to previous +} + +float Angle::Tangent(int *status=NULL) +{ + if(angle_value==90 || angle_value==270) + { + if(status) + *status=0; + return 0.0; + } + + return tantable[(int)angle_value]; +} + +Angle Angle::InvTangent(float value) +{ + // Returns the inverse cosine of a value in the range 0 <= value <= 1 via + // reverse-lookup any value out of range causes the function to return 0 + uint16 i=90; + + // Filter out bad values + if(value<0) + value*=-1; + + if(value > 1) + return 0; + + while(value > tantable[i]) + i--; + + // current costable[i] is less than value. Pick the degree value which is closer + // to the passed value + if( (value - tantable[i]) < (tantable[i+1] - value) ) + return (i+1); + + return Angle(i); // value is closer to previous +} + +uint8 Angle::Quadrant(void) +{ + // Returns a value based on what quadrant the angle is in. + // 1: 0 <= angle <90 + // 2: 90 <= angle < 180 + // 3: 180 <= angle < 270 + // 4: 270 <= angle < 360 + + + // We can get away with not doing extra value checks because of the order in + // which the checks are done. + if(angle_value < 90) + return 1; + + if(angle_value < 180) + return 2; + + if(angle_value < 270) + return 3; + + return 4; +} + +Angle Angle::Constrain180(void) +{ + // Constrains angle to 0 <= angle < 180 + float val=angle_value; + + if(angle_value<180) + return Angle(angle_value); + + while(!(val<180)) + val-=90; + return Angle(val); +} + +Angle Angle::Constrain90(void) +{ + // Constrains angle to 0 <= angle < 90 + float val=angle_value; + + if(angle_value<90) + return Angle(angle_value); + + while(!(val<90)) + val-=90; + return Angle(val); +} + +void Angle::SetValue(float angle) +{ + angle_value=angle; + Normalize(); +} + +float Angle::Value(void) const +{ + return angle_value; +} + +void Angle::InitTrigTables(void) +{ + int8 i; + double sval,cval,tval,current_radian; + + for(i=0;i<90; i++) + { + current_radian=(i * ANGLE_PI)/180.0; + + // Get these so that we can do some superfast assignments + sval=(float)sin(current_radian); + cval=(float)cos(current_radian); + + // Do 4 assignments, taking advantage of sin/cos symmetry + sintable[i]=sval; + sintable[i+90]=cval; + sintable[i+180]=sval * -1; + sintable[i+270]=cval * -1; + + costable[i]=cval; + costable[i+90]=sval * -1; + costable[i+180]=cval * -1; + costable[i+270]=sval; + + tval=sval/cval; + + tantable[i]=tval; + tantable[i+90]=tval; + tantable[i+180]=tval; + tantable[i+270]=tval; + } +} + +Angle & Angle::operator=(const Angle &from) +{ + angle_value=from.angle_value; + return *this; +} + +Angle & Angle::operator=(const float &from) +{ + angle_value=from; + return *this; +} + +Angle & Angle::operator=(const long &from) +{ + angle_value=(float)from; + return *this; +} + +Angle & Angle::operator=(const int &from) +{ + angle_value=(float)from; + return *this; +} + +bool Angle::operator==(const Angle &from) +{ + return (angle_value==from.angle_value)?true:false; +} + +bool Angle::operator!=(const Angle &from) +{ + return (angle_value!=from.angle_value)?true:false; +} + +bool Angle::operator>(const Angle &from) +{ + return (angle_value>from.angle_value)?true:false; +} + +bool Angle::operator<(const Angle &from) +{ + return (angle_value=(const Angle &from) +{ + return (angle_value>=from.angle_value)?true:false; +} + +bool Angle::operator<=(const Angle &from) +{ + return (angle_value<=from.angle_value)?true:false; +} diff --git a/src/servers/app/proto7/Angle.h b/src/servers/app/proto7/Angle.h new file mode 100644 index 0000000000..d6d4d9163c --- /dev/null +++ b/src/servers/app/proto7/Angle.h @@ -0,0 +1,46 @@ +#ifndef _ANGLE_H_ +#define _ANGLE_H_ + +#include + +class Angle +{ +public: + Angle(float angle); + Angle(void); + virtual ~Angle(void); + + void Normalize(void); + + float Sine(void); + Angle InvSine(float value); + + float Cosine(void); + Angle InvCosine(float value); + + float Tangent(int *status=NULL); + Angle InvTangent(float value); + + uint8 Quadrant(void); + Angle Constrain180(void); + Angle Constrain90(void); + + void SetValue(float angle); + float Value(void) const; + Angle &operator=(const Angle &from); + Angle &operator=(const float &from); + Angle &operator=(const long &from); + Angle &operator=(const int &from); + bool operator==(const Angle &from); + bool operator!=(const Angle &from); + bool operator<(const Angle &from); + bool operator>(const Angle &from); + bool operator>=(const Angle &from); + bool operator<=(const Angle &from); + +protected: + float angle_value; + void InitTrigTables(void); +}; + +#endif