//-----------------------------------------------------------------------------+ // Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd. // = FileName : TGRegion2D.h // = Version : ver2.0 // = Author : xlc // = CreateDate : 2002-09-09 // = Description: 类的声明 平面任意连通域,边界可以是无限曲线,可以无外界,外边界不封闭时,洞边界也可以是无限曲线 // 对于封闭边界线,外边界是逆时针方向,内边界是顺时针方向 // = Maintainers: // //-----------------------------------------------------------------------------+ #ifndef _TGREGION2D_H_ #define _TGREGION2D_H_ #ifndef _TGOBJECT2D_H_ #include "TGObject2D.h" #endif #ifndef _TGOBJECTLIST_H_ #include "TGObjectList.h" #endif #ifndef _TGOBJECT_H_ #include "TGObject.h" #endif #ifndef _TGPOINT_H_ #include "TGPoint.h" #endif #ifndef _TGMATRIX_H_ #include "TGMatrix.h" #endif #ifndef _TPGEEXTEND2D_H_ #include "TPGeExtend2D.h" #endif class TGPolygon2D; class TPGeCurve2D; class GEOAPI TGRegion2D : public TGObject2D { DECLARE_RUN_TIME_CLASS(TGRegion2D) public: virtual ~TGRegion2D(); //外部不负责析构 virtual TPGeCurve2D* GetBoundary(long i) const; //返回边界数,无边界时也返回1 //第一个为外边界,GetBoundary(0)=NULL代表无外界。如果数量大于1,其余为内边界 virtual long GetBoundaryNum() const; virtual bool Inter(const TGRegion2D&face,TGObjectList&res) const; //如果不能合并为连通域,返回NULL virtual TGRegion2D* Union(const TGRegion2D&face) const; virtual void SubtractBy(const TGRegion2D&face,TGObjectList&res) const; //不能是自交曲线!! virtual void CutBy(const TPGeCurve2D&curve,TGObjectList&left,TGObjectList&right) const; //override TGObject2D virtual void SetElev(double elev); virtual double GetElev() const; //override TGObject virtual bool IsValid() const; virtual bool Intersect(const TGObject&obj,TGObjectList&oList) const; //GR_IN/GR_OUT/GR_EDGE/GR_HOLE virtual GRelation HitTest(const TGPoint&pt) const; //边界处为GR_IN;GR_HOLE|GR_EDGE表示洞边,GR_HOLE|GR_OUT表示洞内 virtual bool IsInclude(const TGObject&obj) const; virtual void TransformBy(const TGMatrix&matrix); virtual bool GetExtend2D(TPGeExtend2D&ext) const; virtual bool Explode(TGObjectList&res) const; //attribute //是否有外边界 bool IsOutlineExist() const; //取外边界(有外边界时) TPGeCurve2D& Outline() const; //取洞数 long GetHoleNum() const; //是否有洞 bool IsHoleExist() const; //洞可以是无限曲线 TPGeCurve2D& Hole(long i) const; //是否封闭域 bool IsClosed() const; //边界线之间是否有交集 bool IsBoundaryInter() const; //边界线之间是否允许有交 bool IsAllowBoundaryInter() const; //边界线是否可能有临界交集,用于内部布尔运算,注意:有洞的开放域总返回true! bool IsMayBoundaryInter() const; //是否整个平面,无洞也没外边界 bool IsEntirePlane() const; //对于有界域 double Area() const; //operate //调整封闭边界线,外边界是逆时针方向,内边界是顺时针方向 void Normalize(); //禁止TGObject3D void Clip(const TGObject&obj,TGObjectList&inList,TGObjectList&outList,TGObjectList&midList) const; void SubtractBy(const TGObjectList&oList,TGObjectList&res) const; //边界线性化,有洞时返回TGPolygonEx2D,无限域返回NULL TGPolygon2D* MLinearize(double paDist=0) const; //边界线Offset,偏移方法同TPGeCurve2D::Offset,如果有边界线无法Offset返回false //可能产生无效域! bool Offset(double offset); private: //由曲线集求平面域,最后曲线集将置空 //如果可能有顺时针的环路,则应选择检查洞 //曲线集中的每条曲线只能作为一个面域的边界,因此可能有多个环路时,关键曲线要排在前面,使关键曲线先被遍历! //曲线集中的曲线应两两之间无重合,无交叉(非端点交点)! //不支持开放域! void CreateRegion2D(TGObjectList&curves,TGObjectList&res,bool bCheckHole)const; //支持开放域,其余同上 void CreateRegion2DEx(TGObjectList&curves,TGObjectList&res,bool bCheckHole)const; }; #endif