129 lines
2.4 KiB
C++
129 lines
2.4 KiB
C++
//-------------------------------------------------------------------------------------------------------+
|
|
// Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd.
|
|
// = FileName : TGMesh3D Ŕŕ
|
|
// = Version : ver2.0
|
|
// = Author : wlw
|
|
// = CreateDate : 2002-09-09
|
|
// = Description: TGMesh3D ś¨Ňĺ
|
|
// = Maintainers:
|
|
//
|
|
//-------------------------------------------------------------------------------------------------------+
|
|
#include "StdAfx.h"
|
|
#include "TGMesh3D.h"
|
|
#include "TGMCurve3D.h"
|
|
#include "TPGeCurve3D.h"
|
|
|
|
|
|
TGMesh3D::~TGMesh3D()
|
|
{
|
|
|
|
}
|
|
|
|
bool TGMesh3D::operator>(const TGMesh3D&)const
|
|
{
|
|
return false;
|
|
}
|
|
|
|
bool TGMesh3D::operator<(const TGMesh3D&)const
|
|
{
|
|
return false;
|
|
}
|
|
|
|
TPGeCurve3D* TGMesh3D::CreateCurve()
|
|
{
|
|
if(GetLength() == 1)
|
|
{
|
|
return new TGMCurve3D(*GetAt(0)->GetCurve());
|
|
}
|
|
|
|
TGMCurve3D* pCurve = new TGMCurve3D;
|
|
const TGMeshNode3D*pStartNode;
|
|
const TGMeshEdge3D*pEdge0 = GetAt(0);
|
|
if(pEdge0->m_pMesh1 == this)
|
|
{
|
|
pStartNode = pEdge0->GetNode(1);
|
|
}
|
|
else
|
|
{
|
|
pStartNode = pEdge0->GetNode(2);
|
|
}
|
|
for(MoveToFirst();!IsOut();MoveToNext())
|
|
{
|
|
TPGeCurve3D* pSeg = (TPGeCurve3D*)(GetCurData()->GetCurve()->Clone());
|
|
if(GetCurData()->GetNode(1) != pStartNode)
|
|
{
|
|
pSeg->Reverse();
|
|
pStartNode = GetCurData()->GetNode(1);
|
|
}
|
|
else
|
|
{
|
|
pStartNode = GetCurData()->GetNode(2);
|
|
}
|
|
|
|
pCurve->AddTail(pSeg);
|
|
}
|
|
return pCurve;
|
|
}
|
|
|
|
void TGMesh3D::ExplodeSelfCross(TPDList<TGMesh3D> &lstMesh)
|
|
{
|
|
TDualPtrList<const TGMeshNode3D*> lstNode;
|
|
|
|
const TGMeshNode3D*pStartNode;
|
|
const TGMeshEdge3D*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
|
|
{
|
|
TGMesh3D tail;
|
|
SplitAtCur(tail);
|
|
|
|
TGMesh3D *pMesh = new TGMesh3D;
|
|
SplitAt(index,*pMesh);
|
|
for(pMesh->MoveToFirst();!pMesh->IsOut();pMesh->MoveToNext())
|
|
{
|
|
TGMeshEdge3D *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);
|
|
}
|
|
|
|
}
|
|
} |