//-------------------------------------------------------------------------------------------------------+ // Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd. // = FileName : TGPLine2D 类 // = Version : ver2.0 // = Author : wlw // = CreateDate : 2002-09-09 // = Description: TGPLine2D 声明 // = Maintainers: // //-------------------------------------------------------------------------------------------------------+ #ifndef _TGPLINE2D_H_ #define _TGPLINE2D_H_ #ifndef _TGMLINE2D_H_ #include "TGMLine2D.h" #endif #ifndef _TGPOINT_H_ #include "TGPoint.h" #endif #ifndef _TPGECIRCLE2D_H_ #include "TPGeCircle2D.h" #endif #ifndef _TPGEARC2D_H_ #include "TPGeArc2D.h" #endif #ifndef _TARRAY_H_ #include "TArray.h" #endif #ifndef _TTABLE_H_ #include "TTable.h" #endif #ifndef _TPGELINE2D_H_ #include "TPGeLine2D.h" #endif #ifndef _TPGECURVE2D_H_ #include "TPGeCurve2D.h" #endif #ifndef _TWFLAG_H_ #include "TWFlag.h" #endif #ifndef _TGOBJECTLIST_H_ #include "TGObjectList.h" #endif #ifndef _TPGEGLINERAY2D_H_ #include "TPGeGLineRay2D.h" #endif #ifndef _TPGEGLINESEG2D_H_ #include "TPGeGLineSeg2D.h" #endif class GEOAPI TGPLine2D : public TGMLine2D { DECLARE_RUN_TIME_CLASS(TGPLine2D) public: //contruct TGPLine2D(long vertexNum=0,bool bClosed=false); TGPLine2D(const TArray& vertexs,bool bClosed=false); TGPLine2D(const TTable& vertexs,bool bClosed=false); TGPLine2D(const TArray& vertexs,const TArray& angles,bool bClosed=false); TGPLine2D(const TTable& vertexs,const TTable& angles,bool bClosed=false); TGPLine2D(const TGMLine2D& mLine); TGPLine2D(const TPGeCircle2D& cir); TGPLine2D(const TPGeArc2D& arc); virtual ~TGPLine2D(); //override TGMLine2D virtual void SetVertexNum(long num,bool bCopy=false); //消除相邻重合点,如使之有效返回true virtual bool RemoveDupPoint(); virtual bool OffsetSeg(long i,double offset); //override TPGeCurve2D //参数区间为各段参数区间之和,即[0,GetSegNum()],弧段参数规范到[0,1] virtual void Pa2Pt(double pa,TGPoint& pt) const; virtual void Pt2Pa(const TGPoint& pt,double& pa) const; virtual void Reverse(); virtual void GetTangent(double pa,TPGeLine2D& line) const; //只有相邻段有且只有一点交(封闭且段数为2时,有两点交) virtual bool IsSelfCross() const; virtual double Integration(double pa0,double pa1) const; //如果paDist>0,paDist为弧度间隔,不是曲线参数间隔! virtual TGMLine2D* MLinearize(double paDist=0) const; virtual TGMLine2D* PLinearize(double paDist=0) const; virtual TPGeCurve2D* GetSubCurve(double pa0,double pa1) const; virtual bool Offset(double offset); //override TGObject //节点数大于1,无相邻重合点,所有包络角在(-PI2,PI2)区间 virtual bool IsValid() const; //分解为TPGeGLineSeg2D或TPGeArc2D virtual bool Explode(TGObjectList& res) const; virtual TGObject * Clone() const; virtual GRelation HitTest(const TGPoint& pt) const; virtual bool IsInclude(const TGObject& obj) const; virtual bool GetExtend2D(TPGeExtend2D& ext) const; //edit double& operator ()(long i); void SetClosed(bool bClosed=true,double angle=0); //query double GetBulge(long i) const; bool IsArc(long i) const; void GetSegment(long i,TPGeArc2D& seg) const; void GetSegment(long i,TPGeLine2D& seg) const; //外部释放 TPGeCurve2D* GetSegment(long i) const; bool IsArcExist() const; //operate void QuickCut(const TPGeGLine2D& line,TGObjectList& left,TGObjectList& right,TGObjectList& mid) const; void QuickCut(const TPGeGLineRay2D& line,TGObjectList& left,TGObjectList& right,TGObjectList& mid) const; void QuickCut(const TPGeGLineSeg2D& seg,TGObjectList& left,TGObjectList& right,TGObjectList& mid) const; protected: //包络角(-PI2,PI2) TArray bulges; }; inline void TGPLine2D::GetSegment(long i,TPGeArc2D& seg) const { seg.Init(points.GetAt(i),points.GetAt((i+1)%points.GetLength()),GetBulge(i)); } inline TPGeCurve2D* TGPLine2D::GetSegment(long i) const { if(IsArc(i)) { return new TPGeArc2D(points.GetAt(i),points.GetAt((i+1)%points.GetLength()),GetBulge(i)); } else { return new TPGeGLineSeg2D(points.GetAt(i),points.GetAt((i+1)%points.GetLength())); } } #endif