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 #ifndef MATH_EXTENSION_HH
00026 #define MATH_EXTENSION_HH
00027
00028 #include <cassert>
00029 #include <cmath>
00030
00031 class CVertex;
00032
00045
00046
00047
00048
00049 #ifndef MIN
00050 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
00051 #endif //MIN
00052
00053 #ifndef MAX
00054 #define MAX(a, b) (((a) > (b)) ? (a) : (b))
00055 #endif //MAX
00056
00057 #ifndef M_PI
00058 #define M_PI (3.141592653589793238462643383279)
00059 #endif // M_PI
00060
00061
00062
00063
00064
00065
00071 typedef double TCoordinate;
00072
00076 extern const TCoordinate EPSILON;
00077
00086 typedef enum
00087 {
00088 FUNCTION_LIN ,
00089 FUNCTION_QUAD ,
00090 FUNCTION_EXP ,
00091 FUNCTION_LOG ,
00092 FUNCTION_SIN ,
00093 FUNCTION_COS
00094 }
00095 TFunctionType;
00096
00100 static const int NB_FUNCTION_TYPES = 6;
00101
00102
00103
00104
00105
00106
00113 inline int sqr(int AValue)
00114 {
00115 return AValue*AValue;
00116 }
00117
00118 inline float sqr(float AValue)
00119 {
00120 return AValue*AValue;
00121 }
00122
00123 inline double sqr(double AValue)
00124 {
00125 return AValue*AValue;
00126 }
00127
00134 inline bool isPositive(const TCoordinate& AValue)
00135 {
00136
00137 return AValue > -EPSILON;
00138 }
00139
00146 inline bool isNegative(const TCoordinate& AValue)
00147 {
00148
00149 return AValue < +EPSILON;
00150 }
00151
00158 inline bool isZero(const TCoordinate& AValue)
00159 {
00160
00161 return fabs(AValue) < EPSILON;
00162 }
00163
00170 inline int sign(const TCoordinate& AValue)
00171 {
00172 if (isZero(AValue))
00173 return 0;
00174
00175 return AValue<0 ? -1 : +1;
00176 }
00177
00186 inline int combineSigns(int ASign1, int ASign2)
00187 {
00188 assert(-1 <= ASign1 && ASign1 <= +1);
00189 assert(-1 <= ASign2 && ASign2 <= +1);
00190
00191 if (ASign1==0 || ASign2==0)
00192 return 0;
00193
00194 return ASign1==ASign2 ? +1 : -1;
00195 }
00196
00205 inline bool isLessThan(const TCoordinate& AValue1, const TCoordinate& AValue2)
00206 {
00207 return AValue1 + EPSILON < AValue2;
00208 }
00209
00217 inline bool areEqual(const TCoordinate& AValue1, const TCoordinate& AValue2)
00218 {
00219 return fabs(AValue1 - AValue2) < EPSILON;
00220 }
00221
00228 inline TCoordinate deg(const TCoordinate& AAngle)
00229 {
00230 return AAngle/M_PI*180.0;
00231 }
00232
00239 inline TCoordinate rad(const TCoordinate& AAngle)
00240 {
00241 return AAngle*M_PI/180.0;
00242 }
00243
00250 inline TCoordinate dSin(const TCoordinate& AAngle)
00251 {
00252 return sin(rad(AAngle));
00253 }
00254
00261 inline TCoordinate dCos(const TCoordinate& AAngle)
00262 {
00263 return cos(rad(AAngle));
00264 }
00265
00272 inline TCoordinate dTan(const TCoordinate& AAngle)
00273 {
00274 return tan(rad(AAngle));
00275 }
00276
00283 inline TCoordinate dAsin(const TCoordinate& AValue)
00284 {
00285 return deg(asin(AValue));
00286 }
00287
00294 inline TCoordinate dAcos(const TCoordinate& AValue)
00295 {
00296 return deg(acos(AValue));
00297 }
00298
00305 inline TCoordinate dAtan(const TCoordinate& AValue)
00306 {
00307 return deg(atan(AValue));
00308 }
00309
00316 inline TCoordinate limit(const TCoordinate& AAngle)
00317 {
00318 TCoordinate angle = AAngle;
00319
00320 if (angle<0)
00321 while (angle<=-180)
00322 angle += 360;
00323 else
00324 while (angle> +180)
00325 angle -= 360;
00326
00327 return angle;
00328 }
00329
00336 inline TCoordinate positifAngle(const TCoordinate& AAngle)
00337 {
00338 TCoordinate angle = AAngle;
00339
00340 if ( angle<0 )
00341 {
00342 do { angle += 360; } while (angle<0);
00343 }
00344 else
00345 while (angle>=360 )
00346 angle -= 360;
00347
00348 return angle;
00349 }
00350
00358 inline TCoordinate angle(const TCoordinate& Ax, const TCoordinate& Ay)
00359 {
00360 if (isZero(Ax))
00361 {
00362 if (isZero(Ay))
00363 return 0;
00364
00365 if (Ay<0)
00366 return -90;
00367 else
00368 return +90;
00369 }
00370
00371 if (Ax>0)
00372 return dAtan(Ay/Ax);
00373 else
00374 return dAtan(Ay/Ax)+180.0;
00375 }
00376
00384 TCoordinate det(const CVertex& ALine1, const CVertex& ALine2,
00385 const CVertex& ALine3);
00386
00392 inline int pgcd(int Ax, int Ay)
00393 {
00394 assert(0 <= Ax);
00395 assert(0 <= Ay);
00396
00397 if (Ax < Ay)
00398 {
00399 int temp = Ax;
00400 Ax = Ay;
00401 Ay = temp;
00402 }
00403
00404 while (Ay != 0)
00405 {
00406 int temp = Ax % Ay;
00407 Ax = Ay;
00408 Ay = temp;
00409 }
00410
00411 return Ax;
00412 }
00413
00414
00415
00416 #endif // MATH_EXTENSION_HH
00417