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
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
00137 public:
00138
00139 static TVOID RegisterCodedFunctions();
00140 protected:
00141
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() { };
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