//-----------------------------------------------------------------------------+ // 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; } }