//-----------------------------------------------------------------------------+ // 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;iCNNext(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 &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::Next()); } TPtList* TPtList::GetTail() const { return (TPtList*)(TPGeGList::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; }