Files
envi-code/SourceCode/Code2026/tg_shs/shs_subgeLib/TGMeshEdge.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

198 lines
3.5 KiB
C++

//-------------------------------------------------------------------------------------------------------+
// Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd.
// = FileName : TGMeshEdge 类
// = Version : ver2.0
// = Author : wlw
// = CreateDate : 2002-09-09
// = Description: TGMeshEdge 定义
// = Maintainers:
//
//-------------------------------------------------------------------------------------------------------+
#include "StdAfx.h"
#include "TGMeshEdge.h"
#include "TGMesh.h"
#include "TGMeshNode.h"
TGMeshEdge::TGMeshEdge(const TPGeCurve2D* pCurve,TGMeshNode* pNode1,TGMeshNode*pNode2)
:m_pCurve(pCurve),m_pNode1(pNode1),m_pNode2(pNode2),m_pMesh1(NULL),m_pMesh2(NULL)
{
if (m_pNode1 != NULL)
{
m_pNode1->AppendEdge(this);
}
if (m_pNode2 != NULL)
{
m_pNode2->AppendEdge(this);
}
}
TGMeshEdge::~TGMeshEdge()
{
}
const TPGeCurve2D* TGMeshEdge::GetCurve() const
{
return m_pCurve;
}
const TGMeshNode* TGMeshEdge::GetNode(int i) const
{
return i == 1 ? m_pNode1 : m_pNode2;
}
bool TGMeshEdge::IsLine() const
{
return IS_CLASS(m_pCurve,TPGeGLine2D);
}
TGMeshNode* TGMeshEdge::GetNextNode(TGMeshNode *pNode) const
{
return pNode == m_pNode1 ? m_pNode2 : m_pNode1;
}
bool TGMeshEdge::operator > (const TGMeshEdge &edge) const
{
return UP_ZEROA(m_fAngle-edge.m_fAngle);
}
bool TGMeshEdge::operator < (const TGMeshEdge&edge) const
{
return edge > *this;
}
TGMeshEdge* TGMeshEdge::FindNextEdge(TGMeshNode* &pNodeStart, TGMesh *pMesh)
{
if (pNodeStart == m_pNode1)
{
AddFlag(VISITED12);
m_pMesh1 = pMesh;
pNodeStart = m_pNode2;
}
else
{
AddFlag(VISITED21);
m_pMesh2 = pMesh;
pNodeStart = m_pNode1;
}
if (pNodeStart == NULL)
{
return NULL;
}
return pNodeStart->FindNextEdge(this);
}
TGMeshEdge* TGMeshEdge::FindPreEdge(TGMeshNode* &pNodeStart,TGMesh *pMesh)
{
if (pNodeStart == m_pNode1)
{
AddFlag(VISITED21);
m_pMesh2 = pMesh;
pNodeStart = m_pNode2;
}
else
{
m_pMesh1 = pMesh;
AddFlag(VISITED12);
pNodeStart = m_pNode1;
}
if (pNodeStart == NULL)
{
return NULL;
}
return pNodeStart->FindPreEdge(this);
}
TGMeshEdge* TGMeshEdge::FindNextSDEdge(TGMesh *pMesh)
{
AddFlag(VISITED12);
m_pMesh1 = pMesh;
if (m_pNode2 == NULL)
{
return NULL;
}
return m_pNode2->FindNextSDEdge(this);
}
TGMeshEdge* TGMeshEdge::FindPreSDEdge(TGMesh *pMesh)
{
AddFlag(VISITED12);
m_pMesh1 = pMesh;
if (m_pNode1 == NULL)
{
return NULL;
}
return m_pNode1->FindPreSDEdge(this);
}
TGMesh* TGMeshEdge::FindMesh(int i)
{
TGMesh *pMesh = new TGMesh;
TGMeshNode* pNodeStart;
if (i == 1)
{
pNodeStart = m_pNode1;
m_pMesh1 = pMesh;
}
else
{
pNodeStart = m_pNode2;
m_pMesh2 = pMesh;
}
TGMeshEdge*pEdge = this;
do
{
pMesh->AddTail(pEdge);
pEdge = pEdge->FindNextEdge(pNodeStart,pMesh);
}while(pEdge != this && pEdge != NULL);
if (pEdge == NULL)
{
pNodeStart = i == 1 ? m_pNode2 : m_pNode1;
TGMeshEdge*pEdge = this;
while(true)
{
pEdge = pEdge->FindPreEdge(pNodeStart,pMesh);
if (pEdge == NULL)
{
break;
}
pMesh->InsertHead(pEdge);
}
}
return pMesh;
}
TGMesh* TGMeshEdge::FindSDMesh()
{
TGMesh *pMesh = new TGMesh;
m_pMesh1 = pMesh;
TGMeshEdge*pEdge = this;
do
{
pMesh->AddTail(pEdge);
pEdge = pEdge->FindNextSDEdge(pMesh);
}while(pEdge != this && pEdge != NULL);
if (pEdge == NULL)
{
TGMeshEdge*pEdge = this;
while(true)
{
pEdge = pEdge->FindPreSDEdge(pMesh);
if (pEdge == NULL)
{
break;
}
pMesh->InsertHead(pEdge);
}
}
return pMesh;
}