00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00045 #ifndef _GEOMETRY_
00046 #define _GEOMETRY_
00047
00048 #include "math.h"
00049 #include <string>
00050
00051 typedef double AngRad;
00052 typedef double AngDeg;
00054 #define EPSILON 0.0001
00056 // auxiliary numeric functions for determining the
00057
00058 double max ( double d1, double d2 );
00059 double min ( double d1, double d2 );
00060 int sign ( double d1 );
00061
00062
00063
00064 AngDeg Rad2Deg ( AngRad x );
00065 AngRad Deg2Rad ( AngDeg x );
00066 double cosDeg ( AngDeg x );
00067 double sinDeg ( AngDeg x );
00068 double tanDeg ( AngDeg x );
00069 AngDeg atanDeg ( double x );
00070 double atan2Deg( double x, double y );
00071 AngDeg acosDeg ( double x );
00072 AngDeg asinDeg ( double x );
00073
00074
00075 bool isAngInInterval ( AngDeg ang, AngDeg angMin, AngDeg angMax );
00076 AngDeg getBisectorTwoAngles( AngDeg angMin, AngDeg angMax );
00077
00083 enum CoordSystemT {
00084 CARTESIAN,
00085 POLAR
00086 };
00087
00088
00089
00090
00091
00098 class VecPosition
00099 {
00100
00101 private:
00102
00103 double m_x;
00104 double m_y;
00106
00107 public:
00108
00109 VecPosition ( double vx = 0,
00110 double vy = 0,
00111 CoordSystemT cs = CARTESIAN);
00112
00113
00114 VecPosition operator - ( );
00115 VecPosition operator + ( const double &d );
00116 VecPosition operator + ( const VecPosition &p );
00117 VecPosition operator - ( const double &d );
00118 VecPosition operator - ( const VecPosition &p );
00119 VecPosition operator * ( const double &d );
00120 VecPosition operator * ( const VecPosition &p );
00121 VecPosition operator / ( const double &d );
00122 VecPosition operator / ( const VecPosition &p );
00123 void operator = ( const double &d );
00124 void operator += ( const VecPosition &p );
00125 void operator += ( const double &d );
00126 void operator -= ( const VecPosition &p );
00127 void operator -= ( const double &d );
00128 void operator *= ( const VecPosition &p );
00129 void operator *= ( const double &d );
00130 void operator /= ( const VecPosition &p );
00131 void operator /= ( const double &d );
00132 bool operator != ( const VecPosition &p );
00133 bool operator != ( const double &d );
00134 bool operator == ( const VecPosition &p );
00135 bool operator == ( const double &d );
00136
00137
00138 friend ostream& operator << ( ostream &os,
00139 VecPosition p );
00140 void show ( CoordSystemT cs = CARTESIAN);
00141 string str ( CoordSystemT cs = CARTESIAN);
00142
00143
00144 bool setX ( double dX );
00145 double getX ( ) const;
00146 bool setY ( double dY );
00147 double getY ( ) const;
00148
00149
00150 void setVecPosition ( double dX = 0,
00151 double dY = 0,
00152 CoordSystemT cs = CARTESIAN);
00153 double getDistanceTo ( const VecPosition p );
00154 VecPosition setMagnitude ( double d );
00155 double getMagnitude ( ) const;
00156 AngDeg getDirection ( ) const;
00157
00158
00159 bool isInFrontOf ( const VecPosition &p );
00160 bool isInFrontOf ( const double &d );
00161 bool isBehindOf ( const VecPosition &p );
00162 bool isBehindOf ( const double &d );
00163 bool isLeftOf ( const VecPosition &p );
00164 bool isLeftOf ( const double &d );
00165 bool isRightOf ( const VecPosition &p );
00166 bool isRightOf ( const double &d );
00167 bool isBetweenX ( const VecPosition &p1,
00168 const VecPosition &p2 );
00169 bool isBetweenX ( const double &d1,
00170 const double &d2 );
00171 bool isBetweenY ( const VecPosition &p1,
00172 const VecPosition &p2 );
00173 bool isBetweenY ( const double &d1,
00174 const double &d2 );
00175
00176
00177 VecPosition normalize ( );
00178 VecPosition rotate ( AngDeg angle );
00179 VecPosition globalToRelative ( VecPosition orig,
00180 AngDeg ang );
00181 VecPosition relativeToGlobal ( VecPosition orig,
00182 AngDeg ang );
00183 VecPosition getVecPositionOnLineFraction( VecPosition &p,
00184 double dFrac );
00185
00186
00187 static VecPosition getVecPositionFromPolar( double dMag,
00188 AngDeg ang );
00189 static AngDeg normalizeAngle ( AngDeg angle );
00190 };
00191
00192
00193
00194
00195
00197 class Geometry
00198 {
00199
00200 public:
00201
00202
00203 static double getLengthGeomSeries(double dFirst,double dRatio,double dSum );
00204 static double getSumGeomSeries (double dFirst,double dRatio,double dLength);
00205 static double getSumInfGeomSeries(double dFirst,double dRatio );
00206 static double getFirstGeomSeries (double dSum, double dRatio,double dLength);
00207 static double getFirstInfGeomSeries(double dSum,double dRatio );
00208
00209
00210 static int abcFormula(double a,double b, double c, double *s1, double *s2);
00211 };
00212
00213
00214
00215
00216
00219 class Circle
00220 {
00221 VecPosition m_posCenter;
00222 double m_dRadius;
00224 public:
00225 Circle( );
00226 Circle( VecPosition pos, double dR );
00227
00228 void show ( ostream& os = cout );
00229
00230
00231 bool setCircle ( VecPosition pos, double dR );
00232 bool setRadius ( double dR );
00233 double getRadius ( );
00234 bool setCenter ( VecPosition pos );
00235 VecPosition getCenter ( );
00236 double getCircumference ( );
00237 double getArea ( );
00238
00239
00240 bool isInside ( VecPosition pos );
00241 int getIntersectionPoints ( Circle c, VecPosition *p1, VecPosition *p2);
00242 double getIntersectionArea ( Circle c );
00243
00244
00245 } ;
00246
00247
00248
00249
00250
00254 class Line
00255 {
00256
00257 double m_a;
00258 double m_b;
00259 double m_c;
00261 public:
00262 Line( double a, double b, double c );
00263
00264
00265 void show( ostream& os = cout );
00266 friend ostream& operator << (ostream & os, Line l);
00267
00268
00269 VecPosition getIntersection ( Line line );
00270 int getCircleIntersectionPoints( Circle circle,
00271 VecPosition *posSolution1,
00272 VecPosition *posSolution2 );
00273 Line getTangentLine ( VecPosition pos );
00274 VecPosition getPointOnLineClosestTo ( VecPosition pos );
00275 double getDistanceWithPoint ( VecPosition pos );
00276 bool isInBetween ( VecPosition pos,
00277 VecPosition point1,
00278 VecPosition point2 );
00279
00280
00281 double getYGivenX ( double x );
00282 double getXGivenY ( double y );
00283 double getACoefficient ( ) const;
00284 double getBCoefficient ( ) const;
00285 double getCCoefficient ( ) const;
00286
00287
00288 static Line makeLineFromTwoPoints ( VecPosition pos1,
00289 VecPosition pos2 );
00290 static Line makeLineFromPositionAndAngle( VecPosition vec,
00291 AngDeg angle );
00292 };
00293
00294
00295
00296
00297
00300 class Rectangle
00301 {
00302 VecPosition m_posLeftTop;
00303 VecPosition m_posRightBottom;
00305 public:
00306 Rectangle ( VecPosition pos, VecPosition pos2 );
00307
00308 void show ( ostream& os = cout );
00309
00310
00311 bool isInside ( VecPosition pos );
00312
00313
00314 void setRectanglePoints( VecPosition pos1,
00315 VecPosition pos2 );
00316 bool setPosLeftTop ( VecPosition pos );
00317 VecPosition getPosLeftTop ( VecPosition pos );
00318 bool setPosRightBottom ( VecPosition pos );
00319 VecPosition getPosRightBottom ( VecPosition pos );
00320 };
00321
00322 #endif