154 lines
2.5 KiB
C++
154 lines
2.5 KiB
C++
//-----------------------------------------------------------------------------+
|
|
// Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd.
|
|
// = FileName : TGraphArc.cpp
|
|
// = Version : ver2.0
|
|
// = Author : xlc
|
|
// = CreateDate : 2002-09-09
|
|
// = Description: ŔŕľÄś¨Ňĺ
|
|
// = Maintainers:
|
|
//
|
|
//-----------------------------------------------------------------------------+
|
|
#include "StdAfx.h"
|
|
#include "TGraphArc.h"
|
|
#include "TGraphNode.h"
|
|
#include "TGraphPath.h"
|
|
|
|
TGraphArc::TGraphArc(TGraphNode* pNode0,TGraphNode*pNode1)
|
|
: m_pNode0(pNode0),m_pNode1(pNode1)
|
|
{
|
|
|
|
}
|
|
|
|
TGraphArc::~TGraphArc()
|
|
{
|
|
UnConnect();
|
|
}
|
|
|
|
TGraphNode* TGraphArc::GetNode(long i)
|
|
{
|
|
return i == 0?m_pNode0:m_pNode1;
|
|
}
|
|
|
|
void TGraphArc::SetNode(long i,TGraphNode*pNode)
|
|
{
|
|
if (i == 0)
|
|
{
|
|
m_pNode0=pNode;
|
|
}
|
|
else
|
|
{
|
|
m_pNode1=pNode;
|
|
}
|
|
}
|
|
|
|
bool TGraphArc::IsValid() const
|
|
{
|
|
return m_pNode0 != NULL && m_pNode1 != NULL;
|
|
}
|
|
|
|
bool TGraphArc::IsClosed() const
|
|
{
|
|
return m_pNode0 == m_pNode1;
|
|
}
|
|
|
|
int TGraphArc::CmpArc(const TGraphArc&a) const
|
|
{
|
|
return (int)(this-(&a));
|
|
}
|
|
|
|
bool TGraphArc::operator == (const TGraphArc&a) const
|
|
{
|
|
return CmpArc(a) == 0;
|
|
}
|
|
|
|
bool TGraphArc::operator != (const TGraphArc&a) const
|
|
{
|
|
return CmpArc(a) != 0;
|
|
}
|
|
|
|
bool TGraphArc::operator> (const TGraphArc&a) const
|
|
{
|
|
return CmpArc(a)>0;
|
|
}
|
|
|
|
bool TGraphArc::operator< (const TGraphArc&a) const
|
|
{
|
|
return CmpArc(a)<0;
|
|
}
|
|
|
|
void TGraphArc::Connect()
|
|
{
|
|
if (m_pNode0 != NULL)
|
|
{
|
|
m_pNode0->AppendArc(this);
|
|
}
|
|
|
|
if (m_pNode1 != NULL)
|
|
{
|
|
m_pNode1->AppendArc(this);
|
|
}
|
|
}
|
|
|
|
void TGraphArc::UnConnect()
|
|
{
|
|
if (m_pNode0 != NULL)
|
|
{
|
|
m_pNode0->RemoveArc(this);
|
|
}
|
|
if (m_pNode1 != NULL)
|
|
{
|
|
m_pNode1->RemoveArc(this);
|
|
}
|
|
m_pNode0=NULL;
|
|
m_pNode1=NULL;
|
|
}
|
|
|
|
TGraphPath* TGraphArc::FindMesh(int type)
|
|
{
|
|
TGraphPath *pMesh=new TGraphPath;
|
|
|
|
TGraphNode* pNodeStart;
|
|
pNodeStart=type == 0?m_pNode0:m_pNode1;
|
|
pMesh->SetStartNode(pNodeStart);
|
|
TGraphArc*pEdge=this;
|
|
do
|
|
{
|
|
pMesh->AddTail(pEdge);
|
|
pNodeStart=pEdge->GetOtherNode(pNodeStart);
|
|
pEdge=pNodeStart->FindNextArc(pEdge);
|
|
}while(pEdge != this && pEdge != NULL);
|
|
|
|
if (pEdge == NULL)
|
|
{
|
|
pNodeStart=type == 0?m_pNode0:m_pNode1;
|
|
TGraphArc* pEdge=this;
|
|
while(true)
|
|
{
|
|
pEdge=pNodeStart->FindPreArc(pEdge);
|
|
if (pEdge == NULL)
|
|
{
|
|
pMesh->SetStartNode(pNodeStart);
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
pMesh->InsertHead(pEdge);
|
|
pNodeStart=pEdge->GetOtherNode(pNodeStart);
|
|
}
|
|
}
|
|
}
|
|
|
|
return pMesh;
|
|
}
|
|
|
|
TGraphNode* TGraphArc::GetOtherNode(TGraphNode* pNode) const
|
|
{
|
|
if (pNode == m_pNode0)
|
|
{
|
|
return m_pNode1;
|
|
}
|
|
else
|
|
{
|
|
return m_pNode0;
|
|
}
|
|
} |