bool HeadingAirRouteSegInSim::CalculateFlightClearance(AirsideFlightInSim* pFlight,AirsideResource* pPreSegment,FlightRouteInSim* pCurrentRoute, ClearanceItem& newItem,ElapsedTime tEnterTime)
{

	ElapsedTime tEarliestArrTime = tEnterTime + pCurrentRoute->GetFlightMinTimeInSeg(pFlight,(AirRouteSegInSim*)pPreSegment);
	ElapsedTime tLatestArrTime = tEnterTime + pCurrentRoute->GetFlightMaxTimeInSeg(pFlight,(AirRouteSegInSim*)pPreSegment);

	ElapsedTime tArrTime = tEnterTime + pCurrentRoute->GetFlightTimeInSeg(pFlight,(AirRouteSegInSim*)pPreSegment);

	ElapsedTime tStartEnter = -1L;
	ElapsedTime tEndEnter = -1L;
	m_pFirstIntersection->GetAvailableTimeAtIntersection(pFlight,this,pCurrentRoute,tEarliestArrTime,tStartEnter,tEndEnter);

	if (tStartEnter > tLatestArrTime)	// available time is later than  the latest enter segment time
		return false;

	if (tStartEnter < tArrTime )
		tStartEnter = tArrTime;

	if (tEndEnter > 0L && tStartEnter > tEndEnter )
		return false;

	double dSpeed1 = pCurrentRoute->GetRoutePointProperty(m_pFirstIntersection->getInputPoint()).GetSpeed();
	double dSpeed = pCurrentRoute->GetRoutePointProperty(m_pSecondIntersection->getInputPoint()).GetSpeed();

	m_pFirstIntersection->getInputPoint()->SetEnterTime(pFlight,tStartEnter,OnTerminal,dSpeed1);
	m_pFirstIntersection->getInputPoint()->SetExitTime(pFlight,tStartEnter);

	int nIdx = pCurrentRoute->GetSegmentIndex(this);

	ElapsedTime eMaxTime = GetMaxTimeInSegment(pFlight, dSpeed1, dSpeed, pCurrentRoute->GetItem(nIdx+1));
	ElapsedTime eMinTime = GetMinTimeInSegment(pFlight,dSpeed1,dSpeed, pCurrentRoute->GetItem(nIdx+1));
	if(eMaxTime < eMinTime)
	{
		swap(eMaxTime, eMinTime);
	}
	ElapsedTime tEarliestExit = tStartEnter + eMinTime;
	ElapsedTime tLatestExit = tStartEnter + eMaxTime;


	ElapsedTime tStartExit = -1L;
	ElapsedTime tEndExit = -1L;
	m_pSecondIntersection->GetAvailableTimeAtIntersection(pFlight,this,pCurrentRoute,tEarliestExit,tStartExit,tEndExit);
	
	if (tStartExit > tLatestExit)	// available time is later than  the latest enter segment time
		return false;

	if (tStartExit < tEarliestExit)
		tStartExit = tEarliestExit;

	ClearanceItem newItem2(this,newItem.GetMode(),0);
	newItem2.SetPosition(m_pSecondIntersection->getInputPoint()->GetPosition());
	newItem2.SetTime(tStartExit);
	newItem2.SetSpeed(dSpeed);
	newItem = newItem2;

	m_pSecondIntersection->getInputPoint()->SetEnterTime(pFlight,tStartExit,OnTerminal,dSpeed);
	m_pSecondIntersection->getInputPoint()->SetExitTime(pFlight,tStartExit);

	return true;
}
Beispiel #2
0
Model::Model(QObject *parent) :
    QObject(parent)
{
    // create
    customerMap = QMap<quint32, Customer>();
    itemMap = QMap<quint32, Item>();
    resMap = QMap<quint32, Reservation>();

    // debug
    Item newItem1("Streetbike 1");
    Item newItem2("Streetbike 2");
    Item newItem3("Streetbike 3");
    Item newItem4("Chopper 1");
    Item newItem5("Chopper 2");
    Item newItem6("Chopper 3");
    Item newItem7("Golf Cart 1");
    Item newItem8("Golf Cart 2");
    Item newItem9("BMW 1");
    Item newItem10("BMW 2");
    itemMap.insert(newItem1.getID(), newItem1);
    itemMap.insert(newItem2.getID(), newItem2);
    itemMap.insert(newItem3.getID(), newItem3);
    itemMap.insert(newItem4.getID(), newItem4);
    itemMap.insert(newItem5.getID(), newItem5);
    itemMap.insert(newItem6.getID(), newItem6);
    itemMap.insert(newItem7.getID(), newItem7);
    itemMap.insert(newItem8.getID(), newItem8);
    itemMap.insert(newItem9.getID(), newItem9);
    itemMap.insert(newItem10.getID(), newItem10);
}
bool HeadingAirRouteSegInSim::ConverseCalculateFlightClearance(AirsideFlightInSim* pFlight,AirsideResource* pLastSegment,FlightRouteInSim* pCurrentRoute, 
															   ClearanceItem& nextItem,ClearanceItem& newItem,AirsideResourceList& ResourceList,ElapsedTime tEnterTime)
{

	ElapsedTime tEarliestArrTime = tEnterTime;
	ElapsedTime tArrTime = tEarliestArrTime;
	for (int i = 0; i < (int)ResourceList.size(); i++)
	{
		AirsideResource* pRes = ResourceList.at(i);
		if (pRes == this)
			break;
		tEarliestArrTime += pCurrentRoute->GetFlightMinTimeInSeg(pFlight,(AirRouteSegInSim*)pRes);
		tArrTime += pCurrentRoute->GetFlightTimeInSeg(pFlight,(AirRouteSegInSim*)pRes);
	}

	ClearanceItem newItem2(this,newItem.GetMode(),0);
	newItem2.SetSpeed(newItem.GetSpeed());
	newItem2.SetTime(tArrTime);
	newItem = newItem2;
	
	ElapsedTime eMaxTime = GetMaxTimeInSegment(pFlight,pCurrentRoute->GetRoutePointProperty(m_pFirstIntersection->getInputPoint()).GetSpeed(),nextItem.GetSpeed(), pLastSegment);

	ElapsedTime eMinTime = GetMinTimeInSegment(pFlight,pCurrentRoute->GetRoutePointProperty(m_pFirstIntersection->getInputPoint()).GetSpeed(),nextItem.GetSpeed(), pLastSegment);

	if(eMaxTime < eMinTime)
	{
		swap(eMinTime,eMaxTime);
	}
	ElapsedTime tEarliestEnter = nextItem.GetTime() - eMaxTime;
	ElapsedTime tLatestEnter = nextItem.GetTime() - eMinTime;

	if (tEarliestArrTime > tLatestEnter)
		return false;

	ElapsedTime tStartTime = -1L;
	ElapsedTime tEndTime = -1L;
	m_pFirstIntersection->GetAvailableTimeAtIntersection(pFlight,this,pCurrentRoute,tEarliestEnter,tStartTime,tEndTime);



	if (tStartTime > tLatestEnter)	// available time is later than  the latest enter segment time
	{
		newItem.SetTime(tLatestEnter);
		return false;
	}

	if (tStartTime < tArrTime)
		tStartTime = tArrTime;

	newItem.SetTime(tStartTime);

	m_pFirstIntersection->getInputPoint()->SetEnterTime(pFlight,tStartTime,OnTerminal,nextItem.GetSpeed());
	m_pFirstIntersection->getInputPoint()->SetExitTime(pFlight,tStartTime);

	return true;
}
void HeadingAirRouteSegInSim::GenerateClearanceItems( AirsideFlightInSim* pFlight,FlightRouteInSim* pRoute, AirsideResource* pNextRes , ClearanceItem& lastItem, Clearance& newClearance )
{
	OccupancyInstance ocyInst = GetOccupyInstance(pFlight);
	ASSERT(ocyInst.GetFlight());


	OccupancyInstance ocyInstExitWaypoint = m_pSecondIntersection->getInputPoint()->GetOccupyInstance(pFlight);

	ElapsedTime tEnter = ocyInst.GetEnterTime();
	ElapsedTime tExit = ocyInstExitWaypoint.GetEnterTime();

	double dSped1 = ocyInst.GetSpeed();
	double dSped2 = ocyInstExitWaypoint.GetSpeed();

	double dAlt1 = lastItem.GetAltitude();
	double dAlt2 = pRoute->GetRoutePointProperty(m_pSecondIntersection->getInputPoint()).GetAlt();

	ASSERT(dSped1 == lastItem.GetSpeed());	//the speed should be same as last item
	ASSERT(tEnter == lastItem.GetTime());	//the time should be same as last item

	//SetEnterTime(pFlight, tEnter,OnTerminal, dSped1);
	//SetExitTime(pFlight,tExit);

	DistanceUnit distNeedTo = (dSped1+dSped2)*.5* double(tExit-tEnter);
	CPoint2008 endPoint = m_pSecondIntersection->getInputPoint()->GetPosition();
	DistanceUnit distDirectTo = lastItem.GetPosition().distance3D(endPoint);
	if(distNeedTo > distDirectTo) //add middle points
	{
		
		DistanceUnit diffDist = distNeedTo - distDirectTo;
		double dHalfDist = 0.5*diffDist;
		ARCVector3 dir = (m_WPExtentPoint - lastItem.GetPosition());
		CPoint2008 nextPos = lastItem.GetPosition() + dir.GetLengtDir(dHalfDist);

		DynamicMovement dynMove(dSped1,dSped2,distNeedTo);
		ElapsedTime startTime = lastItem.GetTime();
		


		ClearanceItem newItem(this,lastItem.GetMode(),0);
		newItem.SetPosition(nextPos);
		newItem.SetTime(startTime + dynMove.GetDistTime(dHalfDist) );
		newItem.SetSpeed(dynMove.GetDistSpeed(dHalfDist));	
		double dNextAlt = dAlt1 + (dAlt2 - dAlt1)* dynMove.getTrate(dHalfDist);
		newItem.SetAltitude(dNextAlt);
		lastItem = newItem;
		newClearance.AddItem(newItem);

		if(m_HeadingType!=Direct && pNextRes->GetType() == AirsideResource::ResType_AirRouteSegment){
			double dAlignLen = 0.5*(distNeedTo - nextPos.distance3D(endPoint) - dHalfDist);
				

			CLine2008 lineseg =  GetAlignProjectLine((AirRouteSegInSim*)pNextRes,pFlight);
			ARCVector3 dirAlign = (lineseg.GetPoint1()-lineseg.GetPoint2());
			dirAlign.SetLength(dAlignLen);


			CPoint2008 item2pos = dirAlign + endPoint;
			newItem.SetPosition(item2pos);
			newItem.SetTime( dynMove.GetDistTime(distNeedTo - dAlignLen)+startTime );
			newItem.SetSpeed(dynMove.GetDistSpeed(distNeedTo - dAlignLen));				
			newItem.SetAltitude(dNextAlt);
			lastItem = newItem;
			newClearance.AddItem(lastItem);
		}
	}

	
	AirRoutePointInSim* pPoint = m_pSecondIntersection->getInputPoint();
	ClearanceItem newItem2(this,lastItem.GetMode(),0);
	newItem2.SetPosition(pPoint->GetPosition());
	newItem2.SetSpeed(dSped2);
	newItem2.SetTime(tExit);
	newItem2.SetAltitude(dAlt2);
	lastItem = newItem2;
	newClearance.AddItem(newItem2);
}
void HeadingAirRouteSegInSim::CalculateClearanceItems(AirsideFlightInSim* pFlight,FlightRouteInSim* pRoute, ClearanceItem& lastItem, AirsideResource* pNextRes, Clearance& newClearance)
{
	ElapsedTime tEnter = m_pFirstIntersection->getInputPoint()->GetOccupyInstance(pFlight).GetEnterTime();
	ElapsedTime tExit = m_pSecondIntersection->getInputPoint()->GetOccupyInstance(pFlight).GetEnterTime();
	double dSped1 = m_pFirstIntersection->getInputPoint()->GetOccupyInstance(pFlight).GetSpeed();
	double dSped2 = m_pSecondIntersection->getInputPoint()->GetOccupyInstance(pFlight).GetSpeed();
	double dAlt1 = lastItem.GetAltitude();
	double dAlt2 = pRoute->GetRoutePointProperty(m_pSecondIntersection->getInputPoint()).GetAlt();

	ASSERT(dSped1 == lastItem.GetSpeed());	//the speed should be same as last item
	ASSERT(tEnter == lastItem.GetTime());	//the time should be same as last item

	SetEnterTime(pFlight, tEnter,OnTerminal, dSped1);
	SetExitTime(pFlight,tExit);

	AirRoutePointInSim* pPoint = m_pFirstIntersection->getInputPoint();

	CPoint2008 nextPos = GetVectorAvailablePosition(tEnter, tExit, dSped1, dSped2, pNextRes, pFlight);

	CPoint2008 curPos = lastItem.GetPosition();
	if (nextPos != m_pSecondIntersection->getInputPoint()->GetPosition())
	{
		double dDistToNext = curPos.distance(nextPos);
		if (m_HeadingType == Direct )
		{
			double dDistToSecond = nextPos.distance(m_pSecondIntersection->getInputPoint()->GetPosition());
			double dRate = dDistToNext/(dDistToNext + nextPos.distance(m_pSecondIntersection->getInputPoint()->GetPosition()));

			ClearanceItem newItem(this,lastItem.GetMode(),0);
			newItem.SetPosition(nextPos);
			double dNextSpd = dSped1 + (dSped2 - dSped1)*dRate;
			newItem.SetSpeed(dNextSpd);
			ElapsedTime dT =  ElapsedTime(2.0* dDistToNext/(lastItem.GetSpeed() + dNextSpd)) + lastItem.GetTime();
			newItem.SetTime(dT);
			double dNextAlt = dAlt1 + (dAlt2 - dAlt1)* dRate;
			newItem.SetAltitude(dNextAlt);
			lastItem = newItem;
			newClearance.AddItem(newItem);
		}
		else
		{
			CPoint2008 projectPoint = GetProjectionPosition(nextPos,pNextRes,pFlight);
			double dTotalDist = dDistToNext + nextPos.distance(projectPoint) + projectPoint.distance(m_pSecondIntersection->getInputPoint()->GetPosition());
			
			double dRate = dDistToNext/dTotalDist;
			ClearanceItem newItem(this,lastItem.GetMode(),0);
			newItem.SetPosition(nextPos);
			double dNextSpd = dSped1 + (dSped2 - dSped1)*dRate;
			newItem.SetSpeed(dNextSpd);
			ElapsedTime dT = ElapsedTime(double(tExit - tEnter)*dRate) + lastItem.GetTime();
			newItem.SetTime(dT);

			double dNextAlt = dAlt1/* + (dAlt2 - dAlt1)* dRate*/;
			newItem.SetAltitude(dNextAlt);
			lastItem = newItem;
			newClearance.AddItem(newItem);


			double dRate2 = (dDistToNext + nextPos.distance(projectPoint))/dTotalDist;
			ClearanceItem nextItem = lastItem;
			nextItem.SetPosition(projectPoint);
			dNextSpd = dSped1 + (dSped2 - dSped1)*dRate2;
			nextItem.SetSpeed(dNextSpd);
			dT = ElapsedTime(double(tExit - tEnter)*(dRate2 - dRate)) + lastItem.GetTime();
			nextItem.SetTime(dT);
			ASSERT(dT < tExit);
			dNextAlt = dAlt1 + (dAlt2 - dAlt1)* (dRate2 - dRate)/(1 - dRate);
			nextItem.SetAltitude(dNextAlt);
			lastItem = nextItem;
			newClearance.AddItem(nextItem);
		}


	}

	pPoint = m_pSecondIntersection->getInputPoint();
	ClearanceItem newItem2(this,lastItem.GetMode(),0);
	newItem2.SetPosition(pPoint->GetPosition());
	newItem2.SetSpeed(dSped2);
	newItem2.SetTime(tExit);
	newItem2.SetAltitude(dAlt2);
	lastItem = newItem2;
	newClearance.AddItem(newItem2);


}