Files
envi-code/SourceCode/Code2026/tg_shs/inc/subgeo/TGRegion2D.h
T
2026-09-28 15:28:50 +08:00

144 lines
3.7 KiB
C++

//-----------------------------------------------------------------------------+
// 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