Files
envi-code/SourceCode/Code2026/tg_shs/shs_subgeLib/TGRegionEx2D.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

175 lines
3.0 KiB
C++

//-------------------------------------------------------------------------------------------------------+
// Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd.
// = FileName : TGRegionEx2D 类
// = Version : ver2.0
// = Author : wlw
// = CreateDate : 2002-09-09
// = Description: TGRegionEx2D 定义
// = Maintainers:
//
//-------------------------------------------------------------------------------------------------------+
#include "StdAfx.h"
#include "TGRegionEx2D.h"
IMPLEMENT_RUN_TIME_CLASS1(TGRegionEx2D,"TGRegionEx2D",TGRegion2D)
TGRegionEx2D::TGRegionEx2D()
{
curves.AddTail(NULL);
}
TGRegionEx2D::TGRegionEx2D(TPGeCurve2D*pCurve,bool bCheck)
{
curves.AddTail(pCurve);
if (bCheck)
{
Normalize();
}
}
TGRegionEx2D::TGRegionEx2D(const TPGeCurve2D&curve,bool bCheck)
{
curves.AddTail((TPGeCurve2D*)curve.Clone());
if (bCheck)
{
Normalize();
}
}
TGRegionEx2D::TGRegionEx2D(TGObjectList&oList,bool bCheck)
{
for (oList.MoveToFirst();!oList.IsOut();oList.MoveToNext())
{
curves.AddTail((TPGeCurve2D*)oList.FetchCur());
}
if (bCheck)
{
Normalize();
}
}
TGRegionEx2D::TGRegionEx2D(const TGRegionEx2D&face)
{
for (long i = 0;i<face.GetBoundaryNum();i++)
{
TPGeCurve2D*pCurve = face.GetBoundary(i);
if (pCurve != NULL)
{
curves.AddTail((TPGeCurve2D*)(pCurve->Clone()));
}
else
{
curves.AddTail(NULL);
}
}
}
TGRegionEx2D::TGRegionEx2D(const TGRegion2D&face)
{
for (long i = 0;i<face.GetBoundaryNum();i++)
{
TPGeCurve2D*pCurve = face.GetBoundary(i);
if (pCurve != NULL)
{
curves.AddTail((TPGeCurve2D*)(pCurve->Clone()));
}
else
{
curves.AddTail(NULL);
}
}
}
TGRegionEx2D::~TGRegionEx2D()
{
}
void TGRegionEx2D::ClearHole()
{
while(curves.GetLength()>1)
{
curves.DelTail();
}
}
void TGRegionEx2D::SetOutline(TPGeCurve2D*pCurve,bool bCheck)
{
if (pCurve != NULL && bCheck && pCurve->IsClosed() && pCurve->IsClockwise())
{
pCurve->Reverse();
}
if (curves[0] != NULL)
{
delete curves[0];
}
curves[0] = pCurve;
}
bool TGRegionEx2D::AppendHole(TPGeCurve2D*pCurve,bool bCheck)
{
if (bCheck)
{
if (!IsAllowBoundaryInter())
{
TGObjectList oList;
for (long i = 0;i<GetBoundaryNum();i++)
{
TPGeCurve2D*pBoundary = GetBoundary(i);
if (pBoundary != NULL && pBoundary->Intersect(*pCurve,oList))
{
delete pCurve;
return false;
}
}
}
if (pCurve->IsClosed() && pCurve->IsClockwise())
{
pCurve->Reverse();
}
if (!IsInclude(TGRegionEx2D(*pCurve,false)))
{
delete pCurve;
return false;
}
pCurve->Reverse();
}
else if (!pCurve->IsClosed())
{
pCurve->Reverse();
}
curves.AddTail(pCurve);
return true;
}
TPGeCurve2D* TGRegionEx2D::GetBoundary(long i) const
{
return curves.GetAt(i);
}
long TGRegionEx2D::GetBoundaryNum() const
{
return curves.GetLength();
}
TGObject* TGRegionEx2D::Clone() const
{
return new TGRegionEx2D(*this);
}
void TGRegionEx2D::DelHole(long i)
{
curves.Del(i+1);
}
TPGeCurve2D* TGRegionEx2D::FetchHole(long i)
{
return curves.Fetch(i+1);
}
void TGRegionEx2D::Reset()
{
curves.Clear();
}