144 lines
3.7 KiB
C++
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 |