#pragma once #include "Vector.h" #include "Point2D.h" namespace NBase { class AFX_EXT_CLASS CLine2D : public CPoint2D { public: CLine2D(void); ~CLine2D(void); int Create(double x1, double y1, double x2, double y2); double DistanceToPoint(double x, double y); double DistanceToPointOne(double x, double y); int One(void); double MininumPoint(double x, double y); double MininumPointOne(double x, double y); double x(double t); double y(double t); void Rotate(double xs, double ys, double angle); double Cross(CLine2D& OtherLine); int Cross(CLine2D& OtherLine, double& x, double& y); void Mirror(double& x, double& y); void operator+=(double t); void operator=(CLine2D& t); public: double a; double b; }; /*!\brief A Line3 is a line in space, with the equations: x = x0 + a*t y = y0 + b*t z = z0 + c*t 标准空间直线方程 (x-x0)/a = (y-y0)/b = (z-z0)/c = k (x0,y0,z0)为该直线原点 */ class AFX_EXT_CLASS CLine3D : public CPoint3D { public: CLine3D(void); ~CLine3D(void); int Create(const CPoint3D& pt1, const CPoint3D& pt2); int Create(double x1, double y1, double z1, double x2, double y2, double z2); int Create2(double x2, double y2, double z2); /** @brief 得到参数为t时直线上点的坐标*/ virtual double x(double t); ///< x0 + a*t virtual double y(double t); ///< y0 + b*t virtual double z(double t); ///< z0 + c*t int Cross(CLine3D& line, double& t1, double& t2); void operator=(CLine3D &t); void Write(FILE *& fw, double t1, double t2); double One(void); double One2(void); void ONE(void); double DistanceToPoint(double x, double y, double z); double DistanceToPointZ(double x, double y, double z); double DistanceToPointOne(double x, double y, double z); protected: double DistanceOne(double x,double y,double z); public: double a,b,c; ///< 方向向量(a,b,c),a,b,c代表各方向数 }; /** @brief 空间平面类,由空间直线CLine3D和直线外一点生成 (x0,y0,z0) A--------> AB 向量 (a,b,c) \ B \ \C AC向量 (aappend,bappend,cappend) */ class AFX_EXT_CLASS CPlane : public CLine3D { public: CPlane(void); ~CPlane(void); int Create(double x1, double y1, double m1, double n1, double step_m, double step_n, double angle); /** @brief 由三个空间点坐标生成基本空间平面*/ int Create(double x1, double y1, double z1, double x2, double y2, double z2, double x3, double y3, double z3); int Create( double x1, double y1, double z1, double x2, double y2, double z2, double x3, double y3, double z3, double m1,double n1,double step_m,double step_n); //根据对应三点生成平面(三点校位) int Create( double x1, double y1, double m1, double n1, double x2, double y2, double m2, double n2, double x3, double y3, double m3, double n3 ); //根据对应二点生成平面(二点校位) int Create(double x1, double y1, double m1, double n1, double x2, double y2, double m2, double n2); int Cross(CLine3D& line,double m_cross[3]); double Cross(CLine3D& line,CPoint3D &point); double Cross(CLine3D& line); bool Cross( CPlane& b, CLine3D& res ); //!<\param bWhichside if true, the distance along the normal will be returned, which can be negative. double DistanceToPoint( const CPoint3D& point, bool bWhichside = false); //A CPlane is a plane in space, with the equation: //Ax + By + Cz + D = 0 void GetEquation(double& A, double& B, double& C, double& D); //获得方程 void GetNormal(double& A, double& B, double& C); void GetNormal(CLine3D& line); void CreateNormal(double x1, double y1, double z1, double x2, double y2, double z2); void GetMN(double& m, double& n); void SetMN(double m1, double n1, double m2, double n2); void Rotate(double alfa,double beta); int Reflect(CLine3D& line); int Refraction(CLine3D &line,double v21,double &sinin); //v21=v2/v1 /** @brief 得到AB向量上m个长度单位,AC向量上n个长度单位的点坐标*/ double x(double m, double n); ///< CLine3D::x(t1)+t2*aappend double y(double m, double n); ///< CLine3D::y(t1)+t2*bappend double z(double m, double n); ///< CLine3D::z(t1)+t2*cappend int Write(FILE *&fw, double m1, double dm, int numm, double n1, double dn, int numn); int Read(CFile& fr); public: double aappend,bappend,cappend; ///< 原点到第3点的空间向量 (aappend,bappend,cappend) }; };