175 lines
3.0 KiB
C++
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();
|
|
}
|