126 lines
2.3 KiB
C++
126 lines
2.3 KiB
C++
//-------------------------------------------------------------------------------------------------------+
|
|
// Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd.
|
|
// = FileName : TGMesh 类
|
|
// = Version : ver2.0
|
|
// = Author : wlw
|
|
// = CreateDate : 2002-09-09
|
|
// = Description: TGMesh 定义
|
|
// = Maintainers:
|
|
//
|
|
//-------------------------------------------------------------------------------------------------------+
|
|
#include "StdAfx.h"
|
|
#include "TGMesh.h"
|
|
#include "TGMCurve2D.h"
|
|
|
|
TGMesh::~TGMesh()
|
|
{
|
|
|
|
}
|
|
|
|
bool TGMesh::operator>(const TGMesh&)const
|
|
{
|
|
return false;
|
|
}
|
|
|
|
bool TGMesh::operator<(const TGMesh&)const
|
|
{
|
|
return false;
|
|
}
|
|
|
|
void TGMesh::ExplodeSelfCross(TPDList<TGMesh> &lstMesh)
|
|
{
|
|
TDualPtrList<const TGMeshNode*> lstNode;
|
|
|
|
const TGMeshNode* pStartNode;
|
|
const TGMeshEdge* pEdge0 = GetAt(0);
|
|
if(pEdge0->m_pMesh1 == this)
|
|
{
|
|
pStartNode = pEdge0->GetNode(1);
|
|
}
|
|
else
|
|
{
|
|
pStartNode = pEdge0->GetNode(2);
|
|
}
|
|
|
|
for(MoveToFirst();!IsOut();MoveToNext())
|
|
{
|
|
long index = lstNode.Find(pStartNode);
|
|
if(index == NOT_FOUND)
|
|
{
|
|
lstNode<<pStartNode;
|
|
}
|
|
else
|
|
{
|
|
TGMesh tail;
|
|
SplitAtCur(tail);
|
|
|
|
TGMesh *pMesh = new TGMesh;
|
|
SplitAt(index,*pMesh);
|
|
for(pMesh->MoveToFirst();!pMesh->IsOut();pMesh->MoveToNext())
|
|
{
|
|
TGMeshEdge *pEdge = pMesh->GetCurData();
|
|
if(pEdge->m_pMesh1 == this)
|
|
{
|
|
pEdge->m_pMesh1 = pMesh;
|
|
}
|
|
else
|
|
{
|
|
pEdge->m_pMesh2 = pMesh;
|
|
}
|
|
}
|
|
|
|
lstMesh<<pMesh;
|
|
|
|
Conbine(tail);
|
|
|
|
lstNode.Clear();
|
|
ExplodeSelfCross(lstMesh);
|
|
break;
|
|
}
|
|
|
|
if(GetCurData()->GetNode(1)!=pStartNode)
|
|
{
|
|
pStartNode = GetCurData()->GetNode(1);
|
|
}
|
|
else
|
|
{
|
|
pStartNode = GetCurData()->GetNode(2);
|
|
}
|
|
}
|
|
}
|
|
|
|
TPGeCurve2D* TGMesh::CreateCurve()
|
|
{
|
|
if(GetLength() == 1)
|
|
{
|
|
return new TGMCurve2D(*GetAt(0)->GetCurve());
|
|
}
|
|
|
|
TGMCurve2D* pCurve = new TGMCurve2D;
|
|
const TGMeshNode*pStartNode;
|
|
const TGMeshEdge*pEdge0 = GetAt(0);
|
|
if(pEdge0->m_pMesh1 == this)
|
|
{
|
|
pStartNode = pEdge0->GetNode(1);
|
|
}
|
|
else
|
|
{
|
|
pStartNode = pEdge0->GetNode(2);
|
|
}
|
|
for(MoveToFirst();!IsOut();MoveToNext())
|
|
{
|
|
TPGeCurve2D* pSeg = (TPGeCurve2D*)(GetCurData()->GetCurve()->Clone());
|
|
if(GetCurData()->GetNode(1)!=pStartNode)
|
|
{
|
|
pSeg->Reverse();
|
|
pStartNode = GetCurData()->GetNode(1);
|
|
}
|
|
else
|
|
{
|
|
pStartNode = GetCurData()->GetNode(2);
|
|
}
|
|
|
|
pCurve->AddTail(pSeg);
|
|
}
|
|
return pCurve;
|
|
} |