//-----------------------------------------------------------------------------+ // Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd. // = FileName : TPGeCurve2D.h // = Version : ver2.0 // = Author : xlc // = CreateDate : 2002-09-09 // = Description: 类的声明 ,平面有向连续参数曲线 // 参数延曲线方向增长,如果有起点,起点参数0,如果有终点,终点参数为1 // = Maintainers: // //-----------------------------------------------------------------------------+ #ifndef _TPGECURVE2D_H_ #define _TPGECURVE2D_H_ #ifndef _TGOBJECT2D_H_ #include "TGObject2D.h" #endif #ifndef _TGPOINT_H_ #include "TGPoint.h" #endif #ifndef _TTABLE_H_ #include "TTable.h" #endif #ifndef _TWFLAG_H_ #include "TWFlag.h" #endif #ifndef _TGOBJECT_H_ #include "TGObject.h" #endif #ifndef _TPGELINE2D_H_ #include "TPGeLine2D.h" #endif #ifndef _TGOBJECTLIST_H_ #include "TGObjectList.h" #endif class TGMLine2D; class TGObject3D; class GEOAPI TPGeCurve2D : public TGObject2D { DECLARE_RUN_TIME_CLASS(TPGeCurve2D) public: virtual ~TPGeCurve2D(); virtual void GetStartPoint(TGPoint& pt) const; virtual void GetEndPoint(TGPoint& pt) const; //是否封闭曲线,封闭曲线一定是有限曲线 virtual bool IsClosed() const; //非曲线段必须重载! //是否有起点或终点 virtual bool IsFinite(bool bStart) const; //存在重复子集 virtual bool IsSelfCross() const; //用于封闭不自交曲线! virtual bool IsClockwise() const; //由曲线参数得到点 virtual void Pa2Pt(double pa,TGPoint& pt) const; //由点得到曲线参数,适用于非自交时! virtual void Pt2Pa(const TGPoint& pt,double& pa) const; //取正切线,返回单位向量 virtual void GetTangent(double pa,TPGeLine2D& line) const; //对[pa0,pa1]进行面积积分 virtual double Integration(double pa0,double pa1) const; //用于封闭不自交曲线! virtual double Area() const; //用于有限曲线 //此处实现了求复合曲线的长度,基本曲线类要重载 virtual double Length() const; //反向 virtual void Reverse(); //用于有限曲线,如果paDist<=0,则使用该实体默认精度 //此处实现了曲线段的线性化,有限曲线但不是曲线段时,或为了提高效率子类可能需要重载 virtual TGMLine2D* MLinearize(double paDist = 0) const; //,尽量转化为TGPLine2D,其余同上 virtual TGMLine2D* PLinearize(double paDist = 0) const; //取线型化的默认精度 virtual double GetMLinePrec() const; //取延伸曲线,外部析构 virtual TPGeCurve2D* GetExtendCurve() const; //取子曲线段,外部析构 //取同曲线方向的子曲线,pa0,pa1必须有效,不封闭时必须pa1>pa0,封闭时pa0==pa1表示一点切割 virtual TPGeCurve2D* GetSubCurve(double pa0,double pa1) const; //按参数表分解曲线,paTable为有序表,参数表中参数必须有效!允许冗余参数 //此处实现了曲线段的Split,无性能要求曲线段子类可不重载 virtual void Split(const TTable & paTable,TGObjectList& res) const; //取样测试点,不取端点、节点之类的不光滑点! virtual TGPoint GetSamplePoint() const; //不能是自交曲线!!不能切割三维实体! //封闭曲线切割结果为左为内,右为外,不考虑曲线方向! //不封闭的有限曲线段切割时,要求其可以正确进行结果分发时的左右测试!! //切割曲线时交点处全要打断,子类如重载,也应满足此要求! //不完全适用于切割自交曲线,即切割在自交处一般会出错!! //子类需要加速才需要重载 virtual void Cut(const TGObject& obj,TGObjectList& left,TGObjectList& right,TGObjectList& mid) const; //左偏移为负,右偏移为正,失败返回false且不改变数据 virtual bool Offset(double offset); //默认是转化为TGPCurve3D virtual TGObject3D* Convert3D() const; //此处实现了任意曲线的点测试(封闭时测试GR_OUTSIDE/GR_INSIDE),曲线封闭时不能自交!! //子类无特别速度要求时不需重载 virtual GRelation HitTest(const TGPoint& pt) const; //在TGObject2D基础上过滤了TGRegion2D virtual bool IsInclude(const TGObject& obj) const; void GetMidPoint(TGPoint&pt)const; //两段曲线是否可以连接,终点与seg的起点相同 bool IsConnect(const TPGeCurve2D&seg)const; //是否有两端点 bool IsCurveSeg()const; //ok有限曲线(封闭或是曲线段) bool IsFinite()const; //完全无限曲线 bool IsInfinite()const; //有限曲线的面积积分 double AllIntegration()const; }; #endif