public function determinaDireccion($estacionInicio, $estacionFin) { if ($estacionInicio->getPosicionLinea() == 1) { return RedMetro::buscaEstacion($this->idEstaciones[count($this->idEstaciones) - 1])->getNombre(); } if ($estacionInicio->getPosicionLinea() == count($this->idEstaciones)) { return RedMetro::buscaEstacion($this->idEstaciones[0])->getNombre(); } if ($this->idEstaciones[$estacionInicio->getPosicionLinea()] == $estacionFin->getId()) { return RedMetro::buscaEstacion($this->idEstaciones[count($this->idEstaciones) - 1])->getNombre(); } return RedMetro::buscaEstacion($this->idEstaciones[0])->getNombre(); }
public static function calculaRuta($idEstacionOrigen, $idEstacionDestino) { $tramos = RedMetro::construyeGrafo(); $dijkstra = new Dijkstra($idEstacionOrigen, $tramos); $puntosCamino = $dijkstra->getCompletePathToNode($idEstacionDestino); $camino = array(); // construye tramos y transbordos for ($i = 0; $i < count($puntosCamino) - 1; $i++) { $estacionOrigen = RedMetro::buscaEstacion($puntosCamino[$i]); $estacionDestino = RedMetro::buscaEstacion($puntosCamino[$i + 1]); if ($estacionOrigen->getNombre() == $estacionDestino->getNombre()) { $puntosRuta[] = new Transbordo($estacionOrigen, $estacionDestino); } else { $direccion = $estacionOrigen->getLinea()->determinaDireccion($estacionOrigen, $estacionDestino); $puntosRuta[] = new Tramo($estacionOrigen, $estacionDestino, $direccion); } } // crea ruta y agrega tramos integrados y transbordos $ruta = new Ruta(RedMetro::obtenDistancia($puntosRuta), $dijkstra->getDistanceToNode($idEstacionDestino)); return self::construyeRuta($ruta, $puntosRuta); }