www.pudn.com > Visual C++ CAD应用程序开发技术源代码ch6.rar > CadBase.h
#ifndef _CAD_DEF_H_ #define _CAD_DEF_H_ #include#include #define CAD_ZERO 1.0E-6 #define NC_ZERO 1.0E-3 #define IS_ZERO(x) (fabs(x)<=CAD_ZERO) #define IS_NCZERO(x) (fabs(x)<=NC_ZERO) #define IS_BETWEEN(x,min,max) (x<=max && x>=min) #define PI 3.1415926535 typedef struct tagPoint2D{ double x; double y; } POINT2D, *PPOINT2D; typedef struct tagVector2D{ double dx; double dy; } VECTOR2D,*PVECTOR2D; typedef struct tagPoint3D{ double x; double y; double z; } POINT3D, *PPOINT3D; typedef struct tagVector3D{ double dx; double dy; double dz; } VECTOR3D,*PVECTOR3D; typedef struct tagMatrix2D{ double A[3][3]; } MATRIX2D, *PMATRIX2D; typedef struct tagMatrix3D{ double A[4][4]; } MATRIX3D, *PMATRIX3D; class CPoint2D; class CPoint3D; class CVector2D; class CVector3D; class CMatrix2D; class CMatrix3D; class AFX_EXT_CLASS CPoint2D :public POINT2D { public: CPoint2D(); CPoint2D(double ix,double iy); CPoint2D(const double*); CPoint2D(POINT2D p); ~CPoint2D(); public: //operators CPoint2D operator*(const MATRIX2D& matrix) const; void operator*=(const MATRIX2D& matrix); //offsetting with vector CPoint2D operator+(VECTOR2D v) const; void operator+=(VECTOR2D v); CPoint2D operator-(VECTOR2D v) const; void operator-=(VECTOR2D v); //derived vector = this point - sp CVector2D operator-(POINT2D sp) const; } ; // Intersection Point structure typedef struct tagInterPOINT2D{ CPoint2D interPt; double t0; double t1; } INTERPOINT2D,*PINTERPOINT2D; class AFX_EXT_CLASS CVector2D : public VECTOR2D { public: CVector2D(); CVector2D(double ix,double iy=0.0); CVector2D(const double* pv); CVector2D(VECTOR2D v); virtual ~CVector2D(); public: //operators declaration CVector2D operator+(VECTOR2D v) const; CVector2D operator-(VECTOR2D v) const; void operator+=(VECTOR2D v); void operator-=(VECTOR2D v); CVector2D operator*(double d) const; void operator*=(double d); CVector2D operator/(double d) const; void operator/=(double d); // cross product CVector3D operator*(VECTOR2D v) const; // dot product double operator|(VECTOR2D v) const; //matrix transformation CVector2D operator*(const MATRIX2D& matrix ) const; void operator*=(const MATRIX2D& matrix ); //methods declaration double GetLength()const; CVector2D GetNormal()const; void Normalize(); BOOL IsZeroLength() const; }; class AFX_EXT_CLASS CPoint3D :public POINT3D { public: CPoint3D(); CPoint3D(double ix,double iy,double iz=0.0); CPoint3D(const double*); CPoint3D(POINT3D p); ~CPoint3D(); public: //operators CPoint3D operator*(const MATRIX3D& matrix) const; void operator*=(const MATRIX3D& matrix); //offsetting with vector CPoint3D operator+(VECTOR3D v) const; void operator+=(VECTOR3D v); CPoint3D operator-(VECTOR3D v) const; void operator-=(VECTOR3D v); BOOL operator==(POINT3D pos) const; BOOL operator!=(POINT3D pos) const; //derived vector = this point - sp CVector3D operator-(POINT3D sp) const; } ; class AFX_EXT_CLASS CVector3D: public VECTOR3D { public: CVector3D(); CVector3D(double dx,double dy,double dz=0); CVector3D(const double*); CVector3D(VECTOR3D v); virtual ~CVector3D(); //operator CVector3D operator+(VECTOR3D v) const; void operator+=(VECTOR3D v); CVector3D operator-(VECTOR3D v) const; void operator-=(VECTOR3D v); CVector3D operator*(double d) const; void operator*=(double d); CVector3D operator/(double d) const; void operator/=(double d); //cross product CVector3D operator*(VECTOR3D v) const; //dot product double operator|(VECTOR3D v) const; CVector3D operator*(const MATRIX3D& matrix) const; void operator*=(const MATRIX3D& matrix); //length double GetLength() const; double GetLengthXY() const; double GetLengthYZ() const; double GetLengthZX() const; CVector3D GetNormal() const; void Normalize(); BOOL IsZeroLength() const; }; class AFX_EXT_CLASS CMatrix2D : public MATRIX2D { public: CMatrix2D(); CMatrix2D(const MATRIX2D&); CMatrix2D(const double *); virtual ~CMatrix2D(); //operators CMatrix2D operator*(const MATRIX2D&) const; void operator*=(const MATRIX2D&); //methods void IdenticalMatrix(); double GetValue() const; public: // static member functions static double GetValue(double a00, double a01, double a10, double a11); static CMatrix2D CreateMirrorMatrix(VECTOR2D vect); static CMatrix2D CreateRotateMatrix(double angle); static CMatrix2D CreateScaleMatrix(double); static CMatrix2D CreateTransfMatrix(VECTOR2D vect); } ; class AFX_EXT_CLASS CMatrix3D : public MATRIX3D { public: CMatrix3D(); CMatrix3D(const MATRIX3D&); CMatrix3D(const double *); virtual ~CMatrix3D(); public: //operators CMatrix3D operator*(const MATRIX3D& matrix)const; void operator*=(const MATRIX3D& matrix); //methods void IdenticalMatrix(); double GetValue() const; public: // static member functions static double GetValue(double a00, double a01, double a02, double a10, double a11, double a12, double a20, double a21, double a22); static CMatrix3D CreateMirrorMatrix(VECTOR3D plnNorm); static CMatrix3D CreateRotateMatrix(double da,VECTOR3D bv); static CMatrix3D CreateScaleMatrix(double); static CMatrix3D CreateTransfMatrix(VECTOR3D vec); } ; ////////////////////////////////////////////////////////////////////////// // (x0,y0): the left and bottom corner // (x1,y1): the right and top corner ////////////////////////////////////////////////////////////////////////// typedef struct tagBox2D{ double x0; double y0; double x1; double y1; } BOX2D , *PBOX2D; class AFX_EXT_CLASS CBox2D : public BOX2D { //constructor && destructor public: CBox2D(); CBox2D(double ix0,double iy0,double ix1,double iy1); CBox2D(POINT2D pt0,POINT2D pt1); CBox2D(BOX2D b); CBox2D(POINT2D p,VECTOR2D v); virtual ~CBox2D(); // operator public: //// get the union box of this and box b. CBox2D operator+(BOX2D b) const; void operator+=(BOX2D b); //// get the intersect box of this and box b. CBox2D operator&(BOX2D b) const; void operator&=(BOX2D b); // get attribs public: BOOL IsZero() const; double Width() const; // Length of X direction double Height()const; // Length of Y direction // relationship culation public: enum {enumSeparated,enumIntersected}; UINT GetRelationWith(BOX2D b) const; protected: void normalize(); }; ////////////////////////////////////////////////////////////////////////// // (x0,y0): the left and bottom corner // (x1,y1): the right and top corner ////////////////////////////////////////////////////////////////////////// typedef struct tagBox3D{ double x0; double y0; double z0; double x1; double y1; double z1; } BOX3D , *PBOX3D; class AFX_EXT_CLASS CBox3D : public BOX3D { //constructor && destructor public: CBox3D(); CBox3D(double ix0,double iy0,double iz0, double ix1,double iy1, double iz1); CBox3D(POINT3D pt0,POINT3D pt1); CBox3D(BOX3D b); CBox3D(POINT3D p,VECTOR3D v); virtual ~CBox3D(); // operator public: //// get the union box of this and box b. CBox3D operator+(BOX3D b) const; void operator+=(BOX3D b); //// get the intersect box of this and box b. CBox3D operator&(BOX3D b) const; void operator&=(BOX3D b); CBox3D operator*( double sc ) const; void operator*= ( double sc ); CBox3D operator*( const MATRIX3D& matrix ) const; void operator*= ( const MATRIX3D& matrix ); BOOL operator<< ( BOX3D b )const ; BOOL operator>> ( BOX3D b ) const; BOOL operator>> ( POINT3D p ) const; CBox3D operator|(BOX3D b) const; void operator|=(BOX3D b); CBox3D operator+(VECTOR3D vect) const; void operator+=(VECTOR3D vect); CBox3D operator-(VECTOR3D vect)const; void operator-=(VECTOR3D vect); // get attribs BOOL IsEmpty() const; double Width() const; //// Length of X direction double Height() const; //// Length of Z direction double Length( )const; //// Length of Y direction enum {enumSeparated,enumIntersected}; UINT GetRelationWith(BOX3D b) const; protected: void normalize(); }; // exported API functions double AFX_EXT_API _AngleBetween(VECTOR2D v1,VECTOR2D v2); double AFX_EXT_API _AngleBetween(VECTOR3D v1,VECTOR3D v2); double AFX_EXT_API _DistOf(POINT2D pt0, POINT2D pt1); double AFX_EXT_API _DistOf(POINT3D pt0, POINT3D pt1); BOOL AFX_EXT_API _IsParallel(VECTOR2D v0,VECTOR2D v1); BOOL AFX_EXT_API _IsParallel(VECTOR3D v0,VECTOR3D v1); BOOL AFX_EXT_API _IsOrthogonal(VECTOR3D v0,VECTOR3D v1); #endif