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