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; }
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); }