void LandsideIntersectionInSim::InitGraphLink( LandsideRouteGraph* pGraph ) const
{
	for( int i=0;i< GetLinkageCount();i++)
	{
		const LandsideIntersectLaneLinkInSim* linkage = GetLinkage(i);
		pGraph->AddEdge(linkage->getFromNode(),linkage->getToNode(),linkage->getDistance() );		
	}
}
//LandsideVehicleInSim* LandsideIntersectionInSim::GetAheadVehicle(LandsideVehicleInSim* mpVehicle, const CPath2008& pathInode, const CPoint2008& curPos, 
//																 double& dDistToAhead )const
//{
//	LandsideVehicleInSim* pAheadVehicle = NULL;
//	double mMidDist = 0;
//	double conflictDist = mpVehicle->GetLength()*2; 
//	int nVehicleIndex = GetVehicleIndex(mpVehicle);
//
//	for(int i=0;i<GetInResVehicleCount();i++)
//	{
//		LandsideVehicleInSim* pVehicle = GetInResVehicle(i);		
//		if(pVehicle==mpVehicle)
//			break;		
//
//		//get vehicle state
//		//double dCurDistInPath = pathInode.GetPointDist(curPos);		
//		
//		MobileState& dstate = pVehicle->getState();		
//		{				
//			//DistancePointPath3D distPoint(midState.pos,pathInode);
//			//if( distPoint.GetSquared()  < conflictDist*conflictDist ) //in conflict area
//			{				
//				//int otherIndex = GetVehicleIndex(pVehicle);
//				double distToOther = curPos.distance3D(dstate.pos);
//
//				//bool bIsHead = otherIndex < nVehicleIndex;
//				//if(bIsHead){
//					if(!pAheadVehicle) //init ahead
//					{
//						mMidDist = distToOther;
//						pAheadVehicle = pVehicle;
//						
//					}
//					else if(distToOther < mMidDist) //find the nearest vehicle
//					{
//						mMidDist = distToOther;
//						pAheadVehicle = pVehicle;
//						
//					}
//				//}		
//
//			}			
//		}
//	}
//
//	//clear not lane vehicles	
//	dDistToAhead = mMidDist;
//	return pAheadVehicle;
//}
//
LandsideIntersectLaneLinkInSim* LandsideIntersectionInSim::GetLinkage( LandsideLaneExit* pExit,LandsideLaneEntry* pEntry ) const
{
	for(int i=0;i<GetLinkageCount();i++)
	{
		LandsideIntersectLaneLinkInSim* pLink = GetLinkage(i);
		if(pLink->getToNode() == pEntry && pLink->getFromNode() == pExit)
		{//
			return pLink;
		}
	}
	return NULL;
}
void LandsideIntersectionInSim::GenerateCtrlEvents(CIntersectionTrafficControlIntersection *pTrafficCtrlNode,LandsideResourceManager* pResManager,OutputLandside* pOutput,ElapsedTime startTime,ElapsedTime endTime/*=0*/)
{
	//Generate traffic control events for every linkage group.
	//Maybe not all the group id in the default page of setting
	//dlg exist in intersection.
	LandsideIntersectionNode* mpNode = (LandsideIntersectionNode*)getInput();
	if(mpNode->getNodeType()==LandsideIntersectionNode::_Unsignalized)
		return;
	GroupMap m_mapGroup;

	for (int i=0;i<GetLinkageCount();i++)
	{
		LandsideIntersectLaneLinkInSim *pLinkInSim=GetLinkage(i);			
		int nGroupID=pLinkInSim->GetGroupID();
		m_mapGroup[nGroupID].push_back(pLinkInSim);
	}

	//calculate the ctrl time of link in same group
	int nCycleTime=0;//the time of one ctrl cycle
	GroupMap::iterator iter;
	for (iter=m_mapGroup.begin();iter!=m_mapGroup.end();iter++)
	{
		CString groupName = mpNode->GetGroupName(iter->first);
		TrafficCtrlTime ctrlTime=pTrafficCtrlNode->GetGroupCtrlTime(groupName);
		nCycleTime+=ctrlTime.activeTime;
		nCycleTime+=ctrlTime.bufferTime;
	}

	int nFirstCloseTime=0;
	for (int i=0;i<(int)m_vLinkGroups.size();i++)
	{
		delete m_vLinkGroups.at(i);
	}
	m_vLinkGroups.clear();

	for (int i=0;i<pTrafficCtrlNode->GetItemCount();i++)
	{
		CString nGroupNum=pTrafficCtrlNode->GetItem(i)->GetLinkGroupName();
		int groupID = mpNode->GetGroupID(nGroupNum);

		iter=m_mapGroup.find(groupID);
		if (iter!=m_mapGroup.end())
		{
			TrafficCtrlTime ctrlTime=pTrafficCtrlNode->GetGroupCtrlTime(nGroupNum);			
			ctrlTime.closeTime=nCycleTime-ctrlTime.activeTime-ctrlTime.bufferTime;
			LandsideIntersectLinkGroupInSim *pLinkGroupInSim=new LandsideIntersectLinkGroupInSim(this,iter->first);
			LandsideIntersectionNode *pIntersection=(LandsideIntersectionNode*)m_pInput;
			if (pResManager && pIntersection)
			{
				//add cross walk in sim
				for (int k=0;k<pResManager->m_vTrafficObjectList.getCount();k++)
				{
					if( CCrossWalkInSim* pCross =pResManager->m_vTrafficObjectList.getItem(k)->toCrossWalk())
					{
						if (pCross->GetLinkIntersectionID()==pIntersection->getID() && pCross->GetLinkGroup()==groupID /*nGroupNum*/)
						{
							pLinkGroupInSim->AddLinkCrossWalk(pCross);
							//pCross->InitLogEntry(pOutput);
						}
					}
				}				
			}
			pLinkGroupInSim->InitLogEntry(pOutput);
			pLinkGroupInSim->SetState(LS_ACTIVE);
			pLinkGroupInSim->SetCtrlTime(ctrlTime);
			pLinkGroupInSim->SetFirstCloseTime(nFirstCloseTime);
			pLinkGroupInSim->SetEndTime(endTime);
			pLinkGroupInSim->Activate(startTime+(long)pTrafficCtrlNode->GetOffsetSimTime());
			pLinkGroupInSim->WriteLog(startTime);
			m_vLinkGroups.push_back(pLinkGroupInSim);
			nFirstCloseTime+=ctrlTime.activeTime+ctrlTime.bufferTime;
		}
	}
}
示例#4
0
PLOTLIB_INLINE ClusterMapPlot &ClusterMapPlot::SetMethod( Linkage linkage )
{
    mStream << ", method=" << GetLinkage( linkage );
    return *this;
}