Files
envi-code/SourceCode/Code2026/tg_shs/shs_subgeLib/TPtList.cpp
T
2026-09-28 15:28:50 +08:00

215 lines
3.5 KiB
C++

//-----------------------------------------------------------------------------+
// Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd.
// = FileName : TPtList.cpp
// = Version : ver2.0
// = Author : xlc
// = CreateDate : 2002-09-09
// = Description: ÀàµÄ¶¨Òå
// = Maintainers:
//
//-----------------------------------------------------------------------------+
#include "StdAfx.h"
#include "TPtList.h"
#include "TGPolygon2D.h"
#include "TGPolygonEx2D.h"
TPtList::TPtList()
{
}
TPtList::TPtList(const TGPoint&pt)
{
Data() = pt;
}
TPtList::TPtList(const TGMLine2D& mline)
{
TPtList*p = this;
p->Data() = mline.GetVertex(0);
for (long i = 1;i<mline.GetVertexNum();i++)
{
p->CNNext(new TPtList(mline.GetVertex(i)));
p = p->Next();
}
if (mline.IsClosed())
{
p->CNNext(this);
}
}
TPtList::~TPtList()
{
}
bool TPtList::MakeMLine2D(TGMLine2D& mLine,bool bReverse) const
{
long len = Length();
if (len < 2)
{
return false;
}
mLine.SetVertexNum(len);
mLine.SetClosed(IsClosed());
const TPtList *p = this;
if (bReverse)
{
for (long i = len-1;i >= 0;i--,p = p->Next())
{
mLine[i] = p->GetData();
}
}
else
{
for (long i = 0;i < len;i++,p = p->Next())
{
mLine[i] = p->GetData();
}
}
return true;
}
TGMLine2D *TPtList::NewMLine2D() const
{
long len = Length();
if (len < 2)
{
return NULL;
}
TGMLine2D* pMLine = new TGMLine2D(len,IsClosed());
const TPtList *p = this;
for (long i = 0;i < len;i++,p = p->Next())
{
(*pMLine)[i] = p->GetData();
}
return pMLine;
}
TGPolygon2D* TPtList::NewPolygon2D() const
{
long len = Length();
if (len < 3)
{
return NULL;
}
TGPolygon2D* pFace = new TGPolygon2D(len);
const TPtList *p = this;
TGMLine2D& mLine = pFace->Outline();
for (long i = 0;i < len;i++,p = p->Next())
{
mLine[i] = p->GetData();
}
return pFace;
}
TGPolygonEx2D* TPtList::NewLFace2D() const
{
long len = Length();
if (len < 3)
{
return NULL;
}
TGPolygonEx2D* pFace = new TGPolygonEx2D(len);
const TPtList *p = this;
TGMLine2D& mLine = pFace->Outline();
for (long i = 0;i < len;i++,p = p->Next())
{
mLine[i] = p->GetData();
}
return pFace;
}
long TPtList::RemoveDupPoint()
{
long count = 1;
for (TPtList*p0 = this,*p = Next();p != this && p != NULL;p = p0->Next())
{
if (p0->Data() == p->Data())
{
p0->CNNext(p->Next());
p->DCNNext();
delete p;
}
else
{
p0 = p;
count++;
}
}
if (p == this)
{
if (p0 != this && Data() == p0->Data())
{
p0->GetTail()->CNNext(this);
p0->DCNNext();
delete p0;
count--;
}
}
return count;
}
long TPtList::RemoveDupPoint(TList<TPtList*> &delList)
{
long count = 1;
for (TPtList*p0 = this,*p = Next();p != this && p != NULL;p = p0->Next())
{
if (p0->Data() == p->Data())
{
p0->CNNext(p->Next());
p->DCNNext();
delList << p;
}
else
{
p0 = p;
count++;
}
}
if (p == this)
{
if (p0 != this && Data() == p0->Data())
{
p0->GetTail()->CNNext(this);
p0->DCNNext();
delList << p0;
count--;
}
}
return count;
}
TPtList* TPtList::Next() const
{
return (TPtList*)(TPGeGList<TGPoint>::Next());
}
TPtList* TPtList::GetTail() const
{
return (TPtList*)(TPGeGList<TGPoint>::GetTail());
}
bool TPtList::operator == (const TPtList&pt) const
{
return GetData() == pt.GetData();
}
bool TPtList::operator != (const TPtList&pt) const
{
return !(*this == pt);
}
bool TPtList::operator >(const TPtList&) const
{
return false;
}
bool TPtList::operator <(const TPtList&) const
{
return false;
}