本文整理汇总了C++中Pipe::StartJun方法的典型用法代码示例。如果您正苦于以下问题:C++ Pipe::StartJun方法的具体用法?C++ Pipe::StartJun怎么用?C++ Pipe::StartJun使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Pipe
的用法示例。
在下文中一共展示了Pipe::StartJun方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: FindBaseCircle
BOOL CPFAOptimize::FindBaseCircle( ComponentManager& ComManager, Pipe& BasePipe, BaseCircleDirection Direction, ComMap& JunKeyMap, ComMap& PipeKeyMap, int iMostCircle[] )
{
//参数有效性判断
ASSERT( NULL != &ComManager );
ASSERT( NULL != &BasePipe );
ComAndCloseComs JunAndCloseJuns;
JunAndCenter CloseJuns; // 记录节点和节点位置的Vector,形式如(节点编号,节点位置)
Jun* pJun = NULL;
Component* pJunComponent = NULL;
Pipe* pPipe = NULL;
Component* pPipeComponent = NULL;
Jun* pPreJun = NULL;
Jun* pNextJun = NULL;
Jun* pStartJun = NULL;
Jun* pStartNextJun = NULL;
// 图形的上、左、右、下四个顶点的位置,为确定最大环做准备
int iTop = 2147483647; // 2的32次方减一
int iLeft = 2147483647;
int iRight = 0;
int iBotton = 0;
IteratorPtr<Component> JunItPtr( ComManager.CreatJunIterator() );
// 把节点和与节点相连的节点信息都放入JunAndCloseJuns
// 如节点1和节点3,4,5相连,则( 1, ( (3,节点3位置), (4,节点4位置), (5,节点5位置) ) )
// 然后把管道和与管道相连的管道编号放入PipeAndClosePipes
// 如管道1和管道3,4,5相连,则(1,(3,4,5))
for( JunItPtr->Fist(); !JunItPtr->IsDone(); JunItPtr->Next() )
{
CloseJuns.clear();
pJunComponent = &JunItPtr->CurrentItem();
pJun = dynamic_cast<Jun*>( pJunComponent );
IteratorPtr<Component> PipeItPtr( ComManager.CreatPipeIterator() );
for( PipeItPtr->Fist(); !PipeItPtr->IsDone(); PipeItPtr->Next() )
{
pPipeComponent = &PipeItPtr->CurrentItem();
pPipe = dynamic_cast<Pipe*>( pPipeComponent );
if( pPipe->StartJun() == pJun->GetKey() )
{
pair< int , CPoint > Temp( pPipe->EndJun(), pPipe->EndPt() );
CloseJuns.push_back( Temp );
}
if( pPipe->EndJun() == pJun->GetKey() )
{
pair< int , CPoint > Temp( pPipe->StartJun(), pPipe->StartPt() );
CloseJuns.push_back( Temp );
}
if( pPipe->GetKey() == BasePipe.GetKey() )
{
if ( DEASIL_DIRECTION == Direction )
{
pPreJun = ComManager.LookUpJun( pPipe->StartJun() );
pNextJun = ComManager.LookUpJun( pPipe->EndJun() );
}
else
{
pPreJun = ComManager.LookUpJun( pPipe->EndJun() );
pNextJun = ComManager.LookUpJun( pPipe->StartJun() );
}
}
}
JunAndCloseJuns.insert( ComAndCloseComs::value_type( pJun->GetKey(), CloseJuns ) );
// 确定四个顶点
if( iTop > pJun->CenterPt().y )
{
iTop = pJun->CenterPt().y;
iMostCircle[0] = pJun->GetKey();
}
if( iBotton < pJun->CenterPt().y )
{
iBotton = pJun->CenterPt().y;
iMostCircle[1] = pJun->GetKey();
}
if( iLeft > pJun->CenterPt().x )
{
iLeft = pJun->CenterPt().x;
iMostCircle[2] = pJun->GetKey();
}
if( iRight < pJun->CenterPt().x )
{
iRight = pJun->CenterPt().x;
iMostCircle[3] = pJun->GetKey();
}
}
JunItPtr->Fist();
pJunComponent = &JunItPtr->CurrentItem();
pJun = dynamic_cast<Jun*>( pJunComponent );
CloseJuns.clear();
ComAndCloseComs::iterator JunIt = JunAndCloseJuns.find( pJun->GetKey() );
CopyVector( CloseJuns, JunIt->second );
// 寻找环—节点矩阵
pStartJun = pPreJun;
pStartNextJun = pNextJun;
int iKeyOfChoiceJun = 0; // 用来标记哪个节点编号作为基环的下一节点编号
//.........这里部分代码省略.........
示例2: FindShortCut
// 最短路径,Dijkstra算法,网上抄的, 可能有点乱
bool CPFAOptimize::FindShortCut( ComponentManager& ComManager, const int& iKeyOfStartJun, const int& iKeyOfEndJun, vector< int >& JunToJunPipePath )
{
map< int, vector< int > > AbutMatrix; //图的邻接矩
vector< int > MarkVector; //标记数组
vector< int > DistanceVector; //距离数组
vector< int > TempVector; //前缀节点
vector< int > PipePathVector; //临时路径存放数组
int iCountOfJun = ComManager.GetJunNum();
int iCountOfPipe = ComManager.GetPipeNum();
int iTemp = 0;
int i = 0;
int j = 0;
int k = 0;
int iMinDistance = 0;
//读入数据
Component *pComponent = NULL;
Pipe *pPipe = NULL;
int iStartJun = 0;
int iEndJun = 0;
IteratorPtr<Component> PipeItPtr( ComManager.CreatPipeIterator() );
for( PipeItPtr->Fist(); !PipeItPtr->IsDone(); PipeItPtr->Next() )
{
pComponent = &PipeItPtr->CurrentItem();
pPipe = dynamic_cast<Pipe*>(pComponent);
iStartJun = pPipe->StartJun();
iEndJun = pPipe->EndJun();
SetProperties( AbutMatrix, iStartJun, iEndJun, 1 );
SetProperties( AbutMatrix, iEndJun, iStartJun, 1);
}
//赋初值
SetProperties( MarkVector, iKeyOfStartJun, 1 );
SetProperties( TempVector, iKeyOfStartJun, 0 );
for( i = 1; i <= iCountOfJun; i++ )
{
iTemp = GetProperties( AbutMatrix, 1, i );
SetProperties( DistanceVector, i, iTemp );
if( 0 < iTemp )
{
SetProperties( TempVector, i, 1 );
}
}
//Dijkstra
for( i = 0; i <= iCountOfJun; i++ )
{
//找到没有标号的最小dist下标
iMinDistance = 32000;
k = 0;
for( j = 1; j <= iCountOfJun; j++ )
{
if( ( 0 == GetProperties( MarkVector, j ) ) && ( 0 < GetProperties( DistanceVector, j ) )
&& ( iMinDistance > GetProperties( DistanceVector, j ) ) )
{
k = j;
iMinDistance = GetProperties( DistanceVector, j );
}
}
if( 0 == k ) //如果找不到就直接退出
{
break;
}
SetProperties( MarkVector, k, 1 ); //标记
//修改最短值和路径
for( j = 1; j <= iCountOfJun; j++ )
{
if( ( 0 == GetProperties( MarkVector, j ) ) && ( 0 < GetProperties( AbutMatrix, k, j ) )
&& ( ( 0 == GetProperties( DistanceVector, j ) )
|| ( GetProperties( DistanceVector, k ) + GetProperties( AbutMatrix, k, j ) < GetProperties( DistanceVector, j ) ) ) )
{
iTemp = GetProperties( DistanceVector, k ) + GetProperties( AbutMatrix, k, j );
SetProperties( DistanceVector, j, iTemp );
SetProperties( TempVector, j, k );
}
}
}
//输出值和路径
k = iKeyOfEndJun;
i = 0;
while( 0 < GetProperties( TempVector, k ) )
{
SetProperties( PipePathVector, i++, k );
k = GetProperties( PipePathVector, k );
}
SetProperties( PipePathVector, i, 1 );
// 根据节点把管道编号写进里,负号表示管道方向与前进方向相反
JunToJunPipePath.clear();
vector< int >::iterator IntVecIt = PipePathVector.begin();
iStartJun = *IntVecIt;
IntVecIt++;
for( ; PipePathVector.end() != IntVecIt; IntVecIt++ )
{
iEndJun = *IntVecIt;
for( PipeItPtr->Fist(); !PipeItPtr->IsDone(); PipeItPtr->Next() )
{
//.........这里部分代码省略.........