215 lines
3.5 KiB
C++
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;
|
|
} |