/**
  * Slúži na výpočet priľahlej strany pravouhlého trojuholníka, pomocou ktérho sa počíta pohyb
  * lietadla na radarovej obrazovke.
  *
  * @param aircraft Lietadlo, pre ktorého pozíciu sa dĺžka počíta.
  * @param waypoint Bod, na ktorý lietadlo práve smeruje.
  * @param waypointDirection Smer bodu voči lietadlu.
  * @return Dĺžka priľahlej strany, ktorá slúži na výpočet novej pozície lietadla.
  */
 private double calculateAdjacentLength(
     Aircraft aircraft, Waypoint waypoint, NextWaypointDirectionEnum waypointDirection) {
   switch (waypointDirection) {
     case NE:
     case SE:
       return waypoint.getPixelCoordX() - aircraft.getLatitude();
     case NW:
     case SW:
       return aircraft.getLatitude() - waypoint.getPixelCoordX();
     default:
       return 0;
   }
 }
 /**
  * Získa novú pozíciu Y na radarovej obrazovke podľa aktuálnej pozície lietadla, bodu a smeru, na
  * ktorom sa nasledujúci bod nachádza.
  *
  * @param waypoint Bod, ku ktorému lietadlo smeruje.
  * @param newOppositeLength Dĺžka novej protiľahlej strany trojuholníka, pomocou ktorého sa dáta
  *     počítajú.
  * @param waypointDirection Smer, na ktorom sa nachádza bod voči lietadlu.
  * @return Pozícia na obrazovke, kde sa má lietadlo pohnúť vo vertikálnom smere.
  */
 private double getNewYPosition(
     Waypoint waypoint, double newOppositeLength, NextWaypointDirectionEnum waypointDirection) {
   switch (waypointDirection) {
     case NE:
     case NW:
       return waypoint.getPixelCoordY() + newOppositeLength;
     case SE:
     case SW:
       return waypoint.getPixelCoordY() - newOppositeLength;
     default:
       return 0;
   }
 }
 /**
  * Predá lietadlo po odchode z riadenej oblasti jedného letiska do riadenej oblasti druhého
  * letiska, kde má určené pristátie.
  *
  * @param aircraft Lietadlo, ktoré sa má predať príletovému radaru.
  */
 private synchronized void handOffAircraft(Aircraft aircraft)
     throws EmptyRouteException, WaypointNotLoadedException {
   if (!aircraft.getArrAirport().equals(requestedArptIcao.toUpperCase())) {
     System.out.println("Mažem lietadlo...");
     globalGeneratedAircraft.get(threadNumber).remove(aircraft);
   }
   for (int i = 0; i < connectedAirports.size(); i++) {
     Airport airport = connectedAirports.get(i);
     if (airport.getIcaoCode().equals(aircraft.getArrAirport())) {
       Waypoint firstSTARWpt = getNextRouteWaypoint(aircraft, AirportRouteTypesEnum.STAR);
       aircraft.setActualRoute(aircraft.getStarRoute());
       if (!aircraft.getArrAirport().equals(requestedArptIcao.toUpperCase())) {
         aircraft.setLatitude(firstSTARWpt.getPixelCoordX() + (new Random()).nextInt(5));
         aircraft.setLongitude(firstSTARWpt.getPixelCoordY() + (new Random()).nextInt(5));
         aircraft.getActualRoute().getRoutePoints().remove(firstSTARWpt.getName());
         globalGeneratedAircraft.get(i).add(aircraft);
       }
     }
   }
 }
 /**
  * Kontrola, či už bol zadaný bod na trase lietadla preletený alebo nie.
  *
  * @param aircraft Lietadlo, ktorého sa kontrola týka
  * @param waypoint Bod, ktorého prelet sa sleduje
  * @param speed Rýchlosť letu, ktorá slúži pre výpočet okolia bodu pre prelet
  * @param waypointDirection Smer, v ktorom sa bod voči lietadlu nachádza
  * @return True ak už lietadlo bod preletelo, false inak.
  */
 private boolean checkWaypointPassed(
     Aircraft aircraft,
     Waypoint waypoint,
     double speed,
     NextWaypointDirectionEnum waypointDirection) {
   switch (waypointDirection) {
     case NE:
       return aircraft.getLatitude() >= waypoint.getPixelCoordX() - (speed * 2)
           && aircraft.getLongitude() <= waypoint.getPixelCoordY() + (speed * 2);
     case SE:
       return aircraft.getLatitude() >= waypoint.getPixelCoordX() - (speed * 2)
           && aircraft.getLongitude() >= waypoint.getPixelCoordY() - (speed * 2);
     case SW:
       return aircraft.getLatitude() <= waypoint.getPixelCoordX() + (speed * 2)
           && aircraft.getLongitude() >= waypoint.getPixelCoordY() - (speed * 2);
     case NW:
       return aircraft.getLatitude() <= waypoint.getPixelCoordX() + (speed * 2)
           && aircraft.getLongitude() <= waypoint.getPixelCoordY() + (speed * 2);
     default:
       return false;
   }
 }
 /**
  * Zistenie, na ktorej svetovej strane voči aktuálnej pozícií lietadla sa nachádza nasledujúci bod
  * na jeho trase.
  *
  * @param acft Lietadlo, pre ktoré sa má údaj zistiť.
  * @param waypoint Bod, na ktorý lietadlo bude smerovať.
  * @return Svetová strana, na ktorej sa ďalší bod na trase nachádza.
  * @see NextWaypointDirectionEnum
  */
 private NextWaypointDirectionEnum getNextWaypointDirection(Aircraft acft, Waypoint waypoint) {
   if (acft.getLatitude() < waypoint.getPixelCoordX()
       && acft.getLongitude() > waypoint.getPixelCoordY()) {
     return NextWaypointDirectionEnum.NE;
   } else if (acft.getLatitude() < waypoint.getPixelCoordX()
       && acft.getLongitude() == waypoint.getPixelCoordY()) {
     return NextWaypointDirectionEnum.E;
   } else if (acft.getLatitude() < waypoint.getPixelCoordX()
       && acft.getLongitude() < waypoint.getPixelCoordY()) {
     return NextWaypointDirectionEnum.SE;
   } else if (acft.getLatitude() == waypoint.getPixelCoordX()
       && acft.getLongitude() < waypoint.getPixelCoordY()) {
     return NextWaypointDirectionEnum.S;
   } else if (acft.getLatitude() > waypoint.getPixelCoordX()
       && acft.getLongitude() < waypoint.getPixelCoordY()) {
     return NextWaypointDirectionEnum.SW;
   } else if (acft.getLatitude() > waypoint.getPixelCoordX()
       && acft.getLongitude() == waypoint.getPixelCoordY()) {
     return NextWaypointDirectionEnum.W;
   } else {
     return NextWaypointDirectionEnum.NW;
   }
 }