Main Page   Class Hierarchy   Data Structures   File List   Data Fields   Globals  

/lib/libtvubase/tvu_maths.h

Go to the documentation of this file.
00001 
00011 #ifndef __TVU_MATHS_H__
00012 #define __TVU_MATHS_H__
00013 
00014 #ifndef __TVU_TYPESDEF_H__
00015 #include "tvu_typesdef.h"
00016 #endif 
00017 
00018 #include <math.h> 
00019 
00020 /*-------------------------------------------------------*/
00021 // Function names
00022 #define FN_MATHS_WHILE             "While"
00023 #define FN_MATHS_SIN               "Sin"
00024 #define FN_MATHS_COS               "Cos"
00025 #define FN_MATHS_TANG              "Tang"
00026 #define FN_MATHS_COTANG            "Cotang"
00027 #define FN_MATHS_QRT               "Qrt"
00028 #define FN_MATHS_SQRT              "Sqrt"
00029 /*========================================================*/
00030 #define INT_COMPARE(a, b) (((TINT)a) == (TINT)b)
00031 /*--------------------------------------------------------*/
00033 class CTMaths : public CTObject
00034 {
00035         public:
00037                 CTMaths();
00038                 ~CTMaths();
00039         public:
00041                 static double PI, PI_2, PI_4, PIx2, PIx3, PIx4, EPSILON;
00042                 static CTMaths Default;
00043         public:
00044                 enum {INTERSEC_NONE = 0x00, INTERSEC_YES = 0x77, INTERSEC_WELL = 0x11,  
00045                           INTERSEC_L1 = 0x01, INTERSEC_L1_1 = 0x02, INTERSEC_L1_2 = 0x04, 
00046                           INTERSEC_L2 = 0x10, INTERSEC_L2_1 = 0x20, INTERSEC_L2_2 = 0x40};
00047         public:
00048                 CTPoint3D& Move(TPOINT3D& pt);
00049                 CTPoint3D& Rotate(TPOINT3D& pt);
00050                 CTPoint3D& Expand(TPOINT3D& pt);
00051                 CTPoint3D& RotateMove(TPOINT3D& pt);
00052                 CTPoint3D& Project(TPOINT3D& pt); 
00053 
00054                 void PrepareMove(CTPoint3D& Coordinate);
00055                 void PrepareRotate(CTAngles& Angles);
00056                 void PrepareExpand(CTSize3D& Size);
00057                 void PrepareProject(CTPoint3D& Coordinate, CTAngles& Angles, CTSize3D& Size);
00059                 void CreateTransformMatrix(TLPSTR lpMatrix, TBOOL bTo = TTRUE);
00060         public:
00062                 static TBOOL Equal(TINT x1, TINT x2, TINT r=0) { return (x1-r <= x2) && (x2 <= x1+r); }
00063                 static TBOOL Equal(double x1, double x2, double r=EPSILON) { return (x1-r <= x2) && (x2 <= x1+r); }
00064                 static TBOOL NotEqual(double x1, double x2, double r=EPSILON) { return (x2 < x1-r) || (x1+r < x2); }
00065                 static TBOOL Zero(double x, double r=EPSILON) { return (-r <= x) && (x <= r); }
00066                 static TBOOL NotZero(double x, double r=EPSILON) { return (x < -r) || (r < x); }
00067                 static TBOOL InInterval(double x, double x1, double x2) { return (x1 <= x2) ? ((x1<=x) && (x<=x2)) : ((x2<=x) && (x<=x1)); }
00068                 static TBOOL NotInInterval(double x, double x1, double x2) { return (x1 <= x2) ? ((x<x1) || (x2<x)) : ((x<x2) || (x1<x)); }             
00073                 static TINT   SolveEquation(double a, double b, double* x, TBOOL TestOnly = TFALSE); 
00075                 static TINT   SolveEquation(double a, double b, double c, double* x, TBOOL TestOnly = TFALSE); 
00078                 static TINT   SolveEquations(double a1, double b1, double c1, double a2, double b2, double c2, double* x, double* y, TBOOL TestOnly = TFALSE);
00080                 static double R2D(double r) { return r*180./PI; }
00081                 static double D2R(double d) { return d/180.*PI; }
00082                 static double ValidAngle(double a) { return (a <= PI) ? a : (a - 2*PI); }
00084                 static double VectNormSquare(double x, double y) { return x*x + y*y; }
00085                 static double VectNorm(double x, double y) { return sqrt(VectNormSquare(x, y)); }
00086                 static double VectAngleY(double x, double y) 
00087                     { double a = asin(x/VectNorm(x, y)); return (y >= 0.) ? ((a >= 0.) ? a : (2*PI+a)) : (PI-a); }
00088                 static double VectAngleX(double x, double y) 
00089                     { return VectAngleY(y, -x); }
00090                 static double VectAngleVect(double x1, double y1, double x2, double y2) 
00091                     { return VectAngleY(x2, y2) - VectAngleY(x1, y1); }
00092                 static void VectGetNextPoint(double x, double y, double Angle, double distance, double* nx, double* ny) 
00093                     { *nx = x + distance*sin(Angle); *ny = y + distance*cos(Angle); }
00094                 static void VectGetNextPoint(double xVect, double yVect, double x, double y, double distance, double* nx, double* ny) 
00095                     { double t = distance/VectNorm(xVect, yVect); *nx = x + t*xVect; *ny = y + t*yVect; }
00097                 static double Vect3DNormSquare(double x, double y, double z) { return x*x + y*y + z*z; }
00098                 static double Vect3DNorm(double x, double y, double z) { return sqrt(Vect3DNormSquare(x, y, z)); }
00099                 static double Vect3DAngleZ_Y(double x, double y, double z) 
00100                     { return VectAngleY(y, z); }
00101                 static double Vect3DAngleY_Z(double x, double y, double z) 
00102                     { return VectAngleX(y, z); }
00103                 static double Vect3DAngleZ_X(double x, double y, double z) 
00104                     { return VectAngleY(x, z); }
00105                 static double Vect3DAngleX_Z(double x, double y, double z) 
00106                     { return VectAngleX(x, z); }
00107                 static double Vect3DAngleY_X(double x, double y, double z) 
00108                     { return VectAngleY(x, y); }
00109                 static double Vect3DAngleX_Y(double x, double y, double z) 
00110                     { return VectAngleX(x, y); }
00111                 static double Vect3DAngleXY(double x, double y, double z)  
00112                     { return asin(z/Vect3DNorm(x, y, z)); }
00113                 static double Vect3DAngleYZ(double x, double y, double z)  
00114                     { return asin(x/Vect3DNorm(x, y, z)); }
00115                 static double Vect3DAngleZX(double x, double y, double z)  
00116                     { return asin(y/Vect3DNorm(x, y, z)); }
00117                 static void Vect3DGetNextPoint(double xVect, double yVect, double zVect, double x, double y, double z, double distance, double* nx, double* ny, double* nz) 
00118                     { double t = distance/Vect3DNorm(xVect, yVect, zVect); *nx = x + t*xVect; *ny = y + t*yVect; *nz = z + t*zVect; }
00120                 static TBOOL SegmentIntersection(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, double* x, double* y);
00121                 static TBOOL SegmentIntersectionValid(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, double* x, double* y);
00122                 static TINT  SegmentRelation(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, double* x, double* y);
00124                 static TBOOL IsPointInsidePolygon(CTList pPolygon, double px, double py, double pz);
00125         protected:
00127                 CTPoint3D       m_Position;
00128                 CTAngles        m_Angles;
00129                 CTSize3D        m_Size;
00131                 double sin_a, cos_a, sin_b, cos_b, sin_g, cos_g;
00132                 double xX, yX, zX, xY, yY, zY, xZ, yZ, zZ;
00134                 CTPoint3D m_TempPoint;
00135 
00136         //===== FOR CODED FUNCTIONS ==========
00137         public:
00138                 // For register coded funtions of this class
00139                 static TVOID RegisterCodedFunctions();
00140         protected:
00141                 // Coded functions
00142                 static CTObject* While(CTList pParams);
00143                 //
00144                 static CTObject* Sin(CTList pParams);
00145                 static CTObject* Cos(CTList pParams);
00146                 static CTObject* Tang(CTList pParams);
00147                 static CTObject* Cotang(CTList pParams);
00148                 static CTObject* Qrt(CTList pParams);
00149                 static CTObject* Sqrt(CTList pParams);
00150 };
00151 /*-------------------------------------------------------*/
00153 class CTSinCos : public CTObject
00154 {
00155         public:
00157                 CTSinCos(TINT nStep);
00158                 CTSinCos(double Radian);
00159                 ~CTSinCos() { /*if (m_SinCos) delete [] m_SinCos; */ };
00160         public:
00161                 typedef struct tagSINCOS
00162                 {
00163                         double sin, cos;
00164                 } SINCOS, *LPSINCOS;
00165         public:
00166                 SINCOS m_SinCos[128];
00167 };
00168 /*========================================================*/
00169 #endif 

Generated at Wed Aug 6 15:58:58 2003 for TVU's libraries for video surveillance: by doxygen1.2.8.1 written by Dimitri van Heesch, © 1997-2001