private void tabla_de_reglas(Vehiculo vehiculo ,Percepcion p) { if (vehiculo.Encendido == false) { } //Ejecutando ruta bezier else if (this.Bezier != null && p.Calle != null && vehiculo.caminoCasiRecto (ultimaDireccion) && vehiculo.carrilCorrecto (p.Calle.X, p.Calle.Y)) { ultimaDireccion = -1; this.Bezier.calcularPosicion (vehiculo.X, vehiculo.Y, vehiculo.Largo); Fisica.avanzar (vehiculo, Fisica.rumboA (vehiculo, this.Bezier.X (), this.Bezier.Y ()), 20); this.Bezier = null; vehiculo.Intermitente = Vehiculo.INTERMITENTE_APAGADO; ; } else if (this.Bezier != null && vehiculo.caminoCasiRecto (ultimaDireccion) && p.Calle == null && p.Interseccion == null) { ultimaDireccion = -1; this.Bezier = null; vehiculo.Intermitente = Vehiculo.INTERMITENTE_APAGADO; } else if (this.Bezier != null && p.VehiculoFrente != null && Fisica.distanciaA (vehiculo, p.VehiculoFrente) < 30) { this.Bezier.calcularPosicion (vehiculo.X, vehiculo.Y, vehiculo.Largo); Fisica.frenar (vehiculo, p.VehiculoFrente, Fisica.rumboA (vehiculo, this.Bezier.X (), this.Bezier.Y ()), p.VehiculoFrente.VelocidadActualKmH); } else if (this.Bezier != null) { this.Bezier.calcularPosicion (vehiculo.X, vehiculo.Y, vehiculo.Largo); Fisica.avanzar (vehiculo, Fisica.rumboA (vehiculo, this.Bezier.X (), this.Bezier.Y ()), 20); } //Entra en una interseccion else if (p.Interseccion != null) { //Doblar hacia el SUR if (vehiculo.Orientacion != Elemento.NORTE && p.Interseccion.existeSentido (Elemento.SUR, Elemento.DE1A2)) { ultimaDireccion = Elemento.SUR; if (vehiculo.Orientacion == Elemento.OESTE) { //Vehiculo originalmente en el carril 1 if (vehiculo.Carril == Elemento.CARRIL1 && p.Interseccion.Sur.SentidoCarril2 == Elemento.DE1A2) { //Calle de un sentido o dos vehiculo.Carril = Elemento.CARRIL2; this.Bezier = new Bezier (p.Interseccion.X + p.Interseccion.Ancho, p.Interseccion.Y + 9, p.Interseccion.X + 9, p.Interseccion.Y + 9, p.Interseccion.X + 9, p.Interseccion.Y + 100); } else if (vehiculo.Carril == Elemento.CARRIL1) { //Calle de dos centido if (vehiculo.Tipo == Vehiculo.AUTOPERSONAL) this.Bezier = new Bezier (p.Interseccion.X + p.Interseccion.Ancho, p.Interseccion.Y + 9, p.Interseccion.X + 14, p.Interseccion.Y + 9, p.Interseccion.X + 27, p.Interseccion.Y + 100); else this.Bezier = new Bezier (p.Interseccion.X + p.Interseccion.Ancho, p.Interseccion.Y + 9, p.Interseccion.X + 0, p.Interseccion.Y + 9, p.Interseccion.X + 27, p.Interseccion.Y + 100); } //Vehiculo originalmente en el carril 2 else if (vehiculo.Carril == Elemento.CARRIL2 && p.Interseccion.Sur.SentidoCarril1 == Elemento.DE1A2) { //Calle de un sentido o dos vehiculo.Carril = Elemento.CARRIL1; if (vehiculo.Tipo == Vehiculo.AUTOPERSONAL) this.Bezier = new Bezier (p.Interseccion.X + p.Interseccion.Ancho, p.Interseccion.Y + 27, p.Interseccion.X + 14, p.Interseccion.Y + 27, p.Interseccion.X + 27, p.Interseccion.Y + 100); else this.Bezier = new Bezier (p.Interseccion.X + p.Interseccion.Ancho, p.Interseccion.Y + 27, p.Interseccion.X + 0, p.Interseccion.Y + 27, p.Interseccion.X + 27, p.Interseccion.Y + 100); } else if (vehiculo.Carril == Elemento.CARRIL2) { //Calle de dos centido this.Bezier = new Bezier (p.Interseccion.X + p.Interseccion.Ancho, p.Interseccion.Y + 27, p.Interseccion.X + 9, p.Interseccion.Y + 27, p.Interseccion.X + 9, p.Interseccion.Y + 100); } vehiculo.Intermitente = Vehiculo.INTERMITENTE_IZQUIERDA; } else if (vehiculo.Orientacion == Elemento.ESTE) { //Vehiculo originalmente en el carril 1 if (vehiculo.Carril == Elemento.CARRIL1 && p.Interseccion.Sur.SentidoCarril1 == Elemento.DE1A2) { //Calle de un sentido o dos this.Bezier = new Bezier (p.Interseccion.X, p.Interseccion.Y + 9, p.Interseccion.X + 27, p.Interseccion.Y + 9, p.Interseccion.X + 27, p.Interseccion.Y + 100); } else if (vehiculo.Carril == Elemento.CARRIL1) { //Calle de dos centido vehiculo.Carril = Elemento.CARRIL2; if (vehiculo.Tipo == Vehiculo.AUTOPERSONAL) this.Bezier = new Bezier (p.Interseccion.X, p.Interseccion.Y + 9, p.Interseccion.X + 22, p.Interseccion.Y + 9, p.Interseccion.X + 9, p.Interseccion.Y + 100); else this.Bezier = new Bezier (p.Interseccion.X, p.Interseccion.Y + 9, p.Interseccion.X + 36, p.Interseccion.Y + 9, p.Interseccion.X + 9, p.Interseccion.Y + 70); } //Vehiculo originalmente en el carril 2 else if (vehiculo.Carril == Elemento.CARRIL2 && p.Interseccion.Sur.SentidoCarril2 == Elemento.DE1A2) { //Calle de un sentido o dos if (vehiculo.Tipo == Vehiculo.AUTOPERSONAL) this.Bezier = new Bezier (p.Interseccion.X, p.Interseccion.Y + 27, p.Interseccion.X + 22, p.Interseccion.Y + 27, p.Interseccion.X + 9, p.Interseccion.Y + 100); else this.Bezier = new Bezier (p.Interseccion.X, p.Interseccion.Y + 27, p.Interseccion.X + 36, p.Interseccion.Y + 27, p.Interseccion.X + 9, p.Interseccion.Y + 100); } else if (vehiculo.Carril == Elemento.CARRIL2) { //Calle de dos centido vehiculo.Carril = Elemento.CARRIL1; this.Bezier = new Bezier (p.Interseccion.X, p.Interseccion.Y + 27, p.Interseccion.X + 27, p.Interseccion.Y + 27, p.Interseccion.X + 27, p.Interseccion.Y + 100); } vehiculo.Intermitente = Vehiculo.INTERMITENTE_DERECHA; } else if (vehiculo.Orientacion == Elemento.SUR) { //Vehiculo originalmente en el carril 1 if (vehiculo.Carril == Elemento.CARRIL1 && p.Interseccion.Sur.SentidoCarril1 == Elemento.DE1A2) { //Calle de un sentido o dos this.Bezier = new Bezier (p.Interseccion.X + 27, p.Interseccion.Y, p.Interseccion.X + 27, p.Interseccion.Y, p.Interseccion.X + 27, p.Interseccion.Y + 100); } else if (vehiculo.Carril == Elemento.CARRIL1) { //Calle de dos centido vehiculo.Carril = Elemento.CARRIL2; this.Bezier = new Bezier (p.Interseccion.X + 27, p.Interseccion.Y, p.Interseccion.X + 27, p.Interseccion.Y + 27, p.Interseccion.X + 9, p.Interseccion.Y + 9, p.Interseccion.X + 9, p.Interseccion.Y + 100); vehiculo.Intermitente = Vehiculo.INTERMITENTE_DERECHA; } //Vehiculo originalmente en el carril 2 else if (vehiculo.Carril == Elemento.CARRIL2 && p.Interseccion.Sur.SentidoCarril2 == Elemento.DE1A2) { //Calle de un sentido o dos this.Bezier = new Bezier (p.Interseccion.X + 9, p.Interseccion.Y, p.Interseccion.X + 9, p.Interseccion.Y, p.Interseccion.X + 9, p.Interseccion.Y + 100); } else if (vehiculo.Carril == Elemento.CARRIL2) { //Calle de dos centido vehiculo.Carril = Elemento.CARRIL1; this.Bezier = new Bezier (p.Interseccion.X + 9, p.Interseccion.Y, p.Interseccion.X + 9, p.Interseccion.Y + 27, p.Interseccion.X + 27, p.Interseccion.Y + 9, p.Interseccion.X + 27, p.Interseccion.Y + 100); vehiculo.Intermitente = Vehiculo.INTERMITENTE_IZQUIERDA; } } } //Doblar hacia el NORTE else if (vehiculo.Orientacion != Elemento.SUR && p.Interseccion.existeSentido (Elemento.NORTE, Elemento.DE2A1)) { ultimaDireccion = Elemento.NORTE; if (vehiculo.Orientacion == Elemento.ESTE) { //Vehiculo originalmente en el carril 1 if (vehiculo.Carril == Elemento.CARRIL1 && p.Interseccion.Norte.SentidoCarril2 == Elemento.DE2A1) { //Calle de un sentido o dos vehiculo.Carril = Elemento.CARRIL2; if (vehiculo.Tipo == Vehiculo.AUTOPERSONAL) this.Bezier = new Bezier (p.Interseccion.X, p.Interseccion.Y + 9, p.Interseccion.X + 22, p.Interseccion.Y + 9, p.Interseccion.X + 9, p.Interseccion.Y - 70); else this.Bezier = new Bezier (p.Interseccion.X, p.Interseccion.Y + 9, p.Interseccion.X + 36, p.Interseccion.Y + 9, p.Interseccion.X + 9, p.Interseccion.Y - 70); } else if (vehiculo.Carril == Elemento.CARRIL1) { //Calle de dos centido this.Bezier = new Bezier (p.Interseccion.X, p.Interseccion.Y + 9, p.Interseccion.X + 27, p.Interseccion.Y + 9, p.Interseccion.X + 27, p.Interseccion.Y - 70); } //Vehiculo originalmente en el carril 2 else if (vehiculo.Carril == Elemento.CARRIL2 && p.Interseccion.Norte.SentidoCarril1 == Elemento.DE2A1) { //Calle de un sentido o dos vehiculo.Carril = Elemento.CARRIL1; this.Bezier = new Bezier (p.Interseccion.X, p.Interseccion.Y + 27, p.Interseccion.X + 27, p.Interseccion.Y + 27, p.Interseccion.X + 27, p.Interseccion.Y - 70); } else if (vehiculo.Carril == Elemento.CARRIL2) { //Calle de dos centido if (vehiculo.Tipo == Vehiculo.AUTOPERSONAL) this.Bezier = new Bezier (p.Interseccion.X, p.Interseccion.Y + 27, p.Interseccion.X + 22, p.Interseccion.Y + 27, p.Interseccion.X + 9, p.Interseccion.Y - 70); else this.Bezier = new Bezier (p.Interseccion.X, p.Interseccion.Y + 27, p.Interseccion.X + 36, p.Interseccion.Y + 27, p.Interseccion.X + 9, p.Interseccion.Y - 70); } vehiculo.Intermitente = Vehiculo.INTERMITENTE_IZQUIERDA; } else if (vehiculo.Orientacion == Elemento.OESTE) { //Vehiculo originalmente en el carril 1 if (vehiculo.Carril == Elemento.CARRIL1 && p.Interseccion.Norte.SentidoCarril1 == Elemento.DE2A1) { //Calle de un sentido o dos if (vehiculo.Tipo == Vehiculo.AUTOPERSONAL) this.Bezier = new Bezier (p.Interseccion.X + p.Interseccion.Ancho, p.Interseccion.Y + 9, p.Interseccion.X + 14, p.Interseccion.Y + 9, p.Interseccion.X + 27, p.Interseccion.Y - 70); else this.Bezier = new Bezier (p.Interseccion.X + p.Interseccion.Ancho, p.Interseccion.Y + 9, p.Interseccion.X + 0, p.Interseccion.Y + 9, p.Interseccion.X + 27, p.Interseccion.Y - 70); } else if (vehiculo.Carril == Elemento.CARRIL1) { //Calle de dos centido vehiculo.Carril = Elemento.CARRIL2; this.Bezier = new Bezier (p.Interseccion.X + p.Interseccion.Ancho, p.Interseccion.Y + 9, p.Interseccion.X + 9, p.Interseccion.Y + 9, p.Interseccion.X + 9, p.Interseccion.Y - 70); } //Vehiculo originalmente en el carril 2 else if (vehiculo.Carril == Elemento.CARRIL2 && p.Interseccion.Norte.SentidoCarril2 == Elemento.DE2A1) { //Calle de un sentido o dos this.Bezier = new Bezier (p.Interseccion.X + p.Interseccion.Ancho, p.Interseccion.Y + 27, p.Interseccion.X + 9, p.Interseccion.Y + 27, p.Interseccion.X + 9, p.Interseccion.Y - 70); } else if (vehiculo.Carril == Elemento.CARRIL2) { //Calle de dos centido vehiculo.Carril = Elemento.CARRIL1; if (vehiculo.Tipo == Vehiculo.AUTOPERSONAL) this.Bezier = new Bezier (p.Interseccion.X + p.Interseccion.Ancho, p.Interseccion.Y + 27, p.Interseccion.X + 14, p.Interseccion.Y + 27, p.Interseccion.X + 27, p.Interseccion.Y - 70); else this.Bezier = new Bezier (p.Interseccion.X + p.Interseccion.Ancho, p.Interseccion.Y + 27, p.Interseccion.X + 0, p.Interseccion.Y + 27, p.Interseccion.X + 27, p.Interseccion.Y - 70); } vehiculo.Intermitente = Vehiculo.INTERMITENTE_DERECHA; } else if (vehiculo.Orientacion == Elemento.NORTE) { //Vehiculo originalmente en el carril 1 if (vehiculo.Carril == Elemento.CARRIL1 && p.Interseccion.Norte.SentidoCarril1 == Elemento.DE2A1) { //Calle de un sentido o dos this.Bezier = new Bezier (p.Interseccion.X + 27, p.Interseccion.Y + p.Interseccion.Ancho, p.Interseccion.X + 27, p.Interseccion.Y, p.Interseccion.X + 27, p.Interseccion.Y - 70); } else if (vehiculo.Carril == Elemento.CARRIL1) { //Calle de dos centido vehiculo.Carril = Elemento.CARRIL2; this.Bezier = new Bezier (p.Interseccion.X + 27, p.Interseccion.Y + p.Interseccion.Ancho, p.Interseccion.X + 27, p.Interseccion.Y + 27, p.Interseccion.X + 9, p.Interseccion.Y + 9, p.Interseccion.X + 9, p.Interseccion.Y - 70); vehiculo.Intermitente = Vehiculo.INTERMITENTE_IZQUIERDA; } //Vehiculo originalmente en el carril 2 else if (vehiculo.Carril == Elemento.CARRIL2 && p.Interseccion.Norte.SentidoCarril2 == Elemento.DE2A1) { //Calle de un sentido o dos this.Bezier = new Bezier (p.Interseccion.X + 9, p.Interseccion.Y + p.Interseccion.Ancho, p.Interseccion.X + 9, p.Interseccion.Y, p.Interseccion.X + 9, p.Interseccion.Y - 70); } else if (vehiculo.Carril == Elemento.CARRIL2) { //Calle de dos centido vehiculo.Carril = Elemento.CARRIL1; this.Bezier = new Bezier (p.Interseccion.X + 9, p.Interseccion.Y + p.Interseccion.Ancho, p.Interseccion.X + 9, p.Interseccion.Y + 27, p.Interseccion.X + 27, p.Interseccion.Y + 9, p.Interseccion.X + 27, p.Interseccion.Y - 70); vehiculo.Intermitente = Vehiculo.INTERMITENTE_DERECHA; } } } //Doblar hacia el ESTE else if (vehiculo.Orientacion != Elemento.OESTE && p.Interseccion.existeSentido (Elemento.ESTE, Elemento.DE1A2)) { ultimaDireccion = Elemento.ESTE; if (vehiculo.Orientacion == Elemento.NORTE) { //Vehiculo originalmente en el carril 1 if (vehiculo.Carril == Elemento.CARRIL1 && p.Interseccion.Este.SentidoCarril2 == Elemento.DE1A2) { //Calle de un sentido o dos vehiculo.Carril = Elemento.CARRIL2; if (vehiculo.Tipo == Vehiculo.AUTOPERSONAL) this.Bezier = new Bezier (p.Interseccion.X + 27, p.Interseccion.Y + p.Interseccion.Ancho, p.Interseccion.X + 27, p.Interseccion.Y + 14, p.Interseccion.X + 100, p.Interseccion.Y + 27); else this.Bezier = new Bezier (p.Interseccion.X + 27, p.Interseccion.Y + p.Interseccion.Ancho, p.Interseccion.X + 27, p.Interseccion.Y + 0, p.Interseccion.X + 100, p.Interseccion.Y + 27); } else if (vehiculo.Carril == Elemento.CARRIL1) { //Calle de dos centido this.Bezier = new Bezier (p.Interseccion.X + 27, p.Interseccion.Y + p.Interseccion.Ancho, p.Interseccion.X + 27, p.Interseccion.Y + 9, p.Interseccion.X + 100, p.Interseccion.Y + 9); } //Vehiculo originalmente en el carril 2 else if (vehiculo.Carril == Elemento.CARRIL2 && p.Interseccion.Este.SentidoCarril1 == Elemento.DE1A2) { //Calle de un sentido o dos vehiculo.Carril = Elemento.CARRIL1; this.Bezier = new Bezier (p.Interseccion.X + 9, p.Interseccion.Y + p.Interseccion.Ancho, p.Interseccion.X + 9, p.Interseccion.Y + 9, p.Interseccion.X + 100, p.Interseccion.Y + 9); } else if (vehiculo.Carril == Elemento.CARRIL2) { //Calle de dos centido if (vehiculo.Tipo == Vehiculo.AUTOPERSONAL) this.Bezier = new Bezier (p.Interseccion.X + 9, p.Interseccion.Y + p.Interseccion.Ancho, p.Interseccion.X + 9, p.Interseccion.Y + 14, p.Interseccion.X + 100, p.Interseccion.Y + 27); else this.Bezier = new Bezier (p.Interseccion.X + 9, p.Interseccion.Y + p.Interseccion.Ancho, p.Interseccion.X + 9, p.Interseccion.Y + 0, p.Interseccion.X + 100, p.Interseccion.Y + 27); } vehiculo.Intermitente = Vehiculo.INTERMITENTE_DERECHA; } else if (vehiculo.Orientacion == Elemento.SUR) { //Vehiculo originalmente en el carril 1 if (vehiculo.Carril == Elemento.CARRIL1 && p.Interseccion.Este.SentidoCarril1 == Elemento.DE1A2) { //Calle de un sentido o dos if (vehiculo.Tipo == Vehiculo.AUTOPERSONAL) this.Bezier = new Bezier (p.Interseccion.X + 27, p.Interseccion.Y, p.Interseccion.X + 27, p.Interseccion.Y + 22, p.Interseccion.X + 100, p.Interseccion.Y + 9); else this.Bezier = new Bezier (p.Interseccion.X + 27, p.Interseccion.Y, p.Interseccion.X + 27, p.Interseccion.Y + 36, p.Interseccion.X + 100, p.Interseccion.Y + 9); } else if (vehiculo.Carril == Elemento.CARRIL1) { //Calle de dos centido vehiculo.Carril = Elemento.CARRIL2; this.Bezier = new Bezier (p.Interseccion.X + 27, p.Interseccion.Y, p.Interseccion.X + 27, p.Interseccion.Y + 27, p.Interseccion.X + 100, p.Interseccion.Y + 27); } //Vehiculo originalmente en el carril 2 else if (vehiculo.Carril == Elemento.CARRIL2 && p.Interseccion.Este.SentidoCarril2 == Elemento.DE1A2) { //Calle de un sentido o dos this.Bezier = new Bezier (p.Interseccion.X + 9, p.Interseccion.Y, p.Interseccion.X + 9, p.Interseccion.Y + 27, p.Interseccion.X + 100, p.Interseccion.Y + 27); } else if (vehiculo.Carril == Elemento.CARRIL2) { //Calle de dos centido vehiculo.Carril = Elemento.CARRIL1; if (vehiculo.Tipo == Vehiculo.AUTOPERSONAL) this.Bezier = new Bezier (p.Interseccion.X + 9, p.Interseccion.Y, p.Interseccion.X + 9, p.Interseccion.Y + 22, p.Interseccion.X + 100, p.Interseccion.Y + 9); else this.Bezier = new Bezier (p.Interseccion.X + 9, p.Interseccion.Y, p.Interseccion.X + 9, p.Interseccion.Y + 36, p.Interseccion.X + 100, p.Interseccion.Y + 9); } vehiculo.Intermitente = Vehiculo.INTERMITENTE_IZQUIERDA; } else if (vehiculo.Orientacion == Elemento.ESTE) { //Vehiculo originalmente en el carril 1 if (vehiculo.Carril == Elemento.CARRIL1 && p.Interseccion.Este.SentidoCarril1 == Elemento.DE1A2) { //Calle de un sentido o dos this.Bezier = new Bezier (p.Interseccion.X, p.Interseccion.Y + 9, p.Interseccion.X, p.Interseccion.Y + 9, p.Interseccion.X + 100, p.Interseccion.Y + 9); } else if (vehiculo.Carril == Elemento.CARRIL1) { //Calle de dos centido vehiculo.Carril = Elemento.CARRIL2; this.Bezier = new Bezier (p.Interseccion.X, p.Interseccion.Y + 9, p.Interseccion.X + 9, p.Interseccion.Y + 9, p.Interseccion.X + 27, p.Interseccion.Y + 27, p.Interseccion.X + 100, p.Interseccion.Y + 27); vehiculo.Intermitente = Vehiculo.INTERMITENTE_IZQUIERDA; } //Vehiculo originalmente en el carril 2 else if (vehiculo.Carril == Elemento.CARRIL2 && p.Interseccion.Este.SentidoCarril2 == Elemento.DE1A2) { //Calle de un sentido o dos this.Bezier = new Bezier (p.Interseccion.X, p.Interseccion.Y + 27, p.Interseccion.X, p.Interseccion.Y + 27, p.Interseccion.X + 100, p.Interseccion.Y + 27); } else if (vehiculo.Carril == Elemento.CARRIL2) { //Calle de dos centido vehiculo.Carril = Elemento.CARRIL1; this.Bezier = new Bezier (p.Interseccion.X, p.Interseccion.Y + 27, p.Interseccion.X + 9, p.Interseccion.Y + 27, p.Interseccion.X + 27, p.Interseccion.Y + 9, p.Interseccion.X + 100, p.Interseccion.Y + 9); vehiculo.Intermitente = Vehiculo.INTERMITENTE_DERECHA; } } } //Doblar hacia el OESTE else if (vehiculo.Orientacion != Elemento.ESTE && p.Interseccion.existeSentido (Elemento.OESTE, Elemento.DE2A1)) { ultimaDireccion = Elemento.OESTE; if (vehiculo.Orientacion == Elemento.SUR) { //Vehiculo originalmente en el carril 1 if (vehiculo.Carril == Elemento.CARRIL1 && p.Interseccion.Oeste.SentidoCarril2 == Elemento.DE2A1) { //Calle de un sentido o dos vehiculo.Carril = Elemento.CARRIL2; this.Bezier = new Bezier (p.Interseccion.X + 27, p.Interseccion.Y, p.Interseccion.X + 27, p.Interseccion.Y + 27, p.Interseccion.X - 70, p.Interseccion.Y + 27); } else if (vehiculo.Carril == Elemento.CARRIL1) { //Calle de dos centido if (vehiculo.Tipo == Vehiculo.AUTOPERSONAL) this.Bezier = new Bezier (p.Interseccion.X + 27, p.Interseccion.Y, p.Interseccion.X + 27, p.Interseccion.Y + 22, p.Interseccion.X - 70, p.Interseccion.Y + 9); else this.Bezier = new Bezier (p.Interseccion.X + 27, p.Interseccion.Y, p.Interseccion.X + 27, p.Interseccion.Y + 36, p.Interseccion.X - 70, p.Interseccion.Y + 9); } //Vehiculo originalmente en el carril 2 else if (vehiculo.Carril == Elemento.CARRIL2 && p.Interseccion.Oeste.SentidoCarril1 == Elemento.DE2A1) { //Calle de un sentido o dos vehiculo.Carril = Elemento.CARRIL1; if (vehiculo.Tipo == Vehiculo.AUTOPERSONAL) this.Bezier = new Bezier (p.Interseccion.X + 9, p.Interseccion.Y, p.Interseccion.X + 9, p.Interseccion.Y + 22, p.Interseccion.X - 70, p.Interseccion.Y + 9); else this.Bezier = new Bezier (p.Interseccion.X + 9, p.Interseccion.Y, p.Interseccion.X + 9, p.Interseccion.Y + 36, p.Interseccion.X - 70, p.Interseccion.Y + 9); } else if (vehiculo.Carril == Elemento.CARRIL2) { //Calle de dos centido this.Bezier = new Bezier (p.Interseccion.X + 9, p.Interseccion.Y, p.Interseccion.X + 9, p.Interseccion.Y + 27, p.Interseccion.X - 70, p.Interseccion.Y + 27); } vehiculo.Intermitente = Vehiculo.INTERMITENTE_DERECHA; } else if (vehiculo.Orientacion == Elemento.NORTE) { //Vehiculo originalmente en el carril 1 if (vehiculo.Carril == Elemento.CARRIL1 && p.Interseccion.Oeste.SentidoCarril1 == Elemento.DE2A1) { //Calle de un sentido o dos this.Bezier = new Bezier (p.Interseccion.X + 27, p.Interseccion.Y + p.Interseccion.Ancho, p.Interseccion.X + 27, p.Interseccion.Y + 9, p.Interseccion.X - 70, p.Interseccion.Y + 9); } else if (vehiculo.Carril == Elemento.CARRIL1) { //Calle de dos centido vehiculo.Carril = Elemento.CARRIL2; if (vehiculo.Tipo == Vehiculo.AUTOPERSONAL) this.Bezier = new Bezier (p.Interseccion.X + 27, p.Interseccion.Y + p.Interseccion.Ancho, p.Interseccion.X + 27, p.Interseccion.Y + 14, p.Interseccion.X - 70, p.Interseccion.Y + 27); else this.Bezier = new Bezier (p.Interseccion.X + 27, p.Interseccion.Y + p.Interseccion.Ancho, p.Interseccion.X + 27, p.Interseccion.Y + 0, p.Interseccion.X - 70, p.Interseccion.Y + 27); } //Vehiculo originalmente en el carril 2 else if (vehiculo.Carril == Elemento.CARRIL2 && p.Interseccion.Oeste.SentidoCarril2 == Elemento.DE2A1) { //Calle de un sentido o dos if (vehiculo.Tipo == Vehiculo.AUTOPERSONAL) this.Bezier = new Bezier (p.Interseccion.X + 9, p.Interseccion.Y + p.Interseccion.Ancho, p.Interseccion.X + 9, p.Interseccion.Y + 14, p.Interseccion.X - 70, p.Interseccion.Y + 27); else this.Bezier = new Bezier (p.Interseccion.X + 9, p.Interseccion.Y + p.Interseccion.Ancho, p.Interseccion.X + 9, p.Interseccion.Y + 0, p.Interseccion.X - 70, p.Interseccion.Y + 27); } else if (vehiculo.Carril == Elemento.CARRIL2) { //Calle de dos centido vehiculo.Carril = Elemento.CARRIL1; this.Bezier = new Bezier (p.Interseccion.X + 9, p.Interseccion.Y + p.Interseccion.Ancho, p.Interseccion.X + 9, p.Interseccion.Y + 9, p.Interseccion.X - 70, p.Interseccion.Y + 9); } vehiculo.Intermitente = Vehiculo.INTERMITENTE_IZQUIERDA; } else if (vehiculo.Orientacion == Elemento.OESTE) { //Vehiculo originalmente en el carril 1 if (vehiculo.Carril == Elemento.CARRIL1 && p.Interseccion.Oeste.SentidoCarril1 == Elemento.DE2A1) { //Calle de un sentido o dos this.Bezier = new Bezier (p.Interseccion.X + p.Interseccion.Ancho, p.Interseccion.Y + 9, p.Interseccion.X, p.Interseccion.Y + 9, p.Interseccion.X - 70, p.Interseccion.Y + 9); } else if (vehiculo.Carril == Elemento.CARRIL1) { //Calle de dos centido vehiculo.Carril = Elemento.CARRIL2; this.Bezier = new Bezier (p.Interseccion.X + p.Interseccion.Ancho, p.Interseccion.Y + 9, p.Interseccion.X + 27, p.Interseccion.Y + 9, p.Interseccion.X + 9, p.Interseccion.Y + 27, p.Interseccion.X - 70, p.Interseccion.Y + 27); vehiculo.Intermitente = Vehiculo.INTERMITENTE_IZQUIERDA; } //Vehiculo originalmente en el carril 2 else if (vehiculo.Carril == Elemento.CARRIL2 && p.Interseccion.Oeste.SentidoCarril2 == Elemento.DE2A1) { //Calle de un sentido o dos this.Bezier = new Bezier (p.Interseccion.X + p.Interseccion.Ancho, p.Interseccion.Y + 27, p.Interseccion.X, p.Interseccion.Y + 27, p.Interseccion.X - 70, p.Interseccion.Y + 27); } else if (vehiculo.Carril == Elemento.CARRIL2) { //Calle de dos centido vehiculo.Carril = Elemento.CARRIL1; this.Bezier = new Bezier (p.Interseccion.X + p.Interseccion.Ancho, p.Interseccion.Y + 27, p.Interseccion.X + 27, p.Interseccion.Y + 27, p.Interseccion.X + 9, p.Interseccion.Y + 9, p.Interseccion.X - 70, p.Interseccion.Y + 9); vehiculo.Intermitente = Vehiculo.INTERMITENTE_DERECHA; } } } if (this.Bezier != null && p.VehiculoFrente == null) { this.Bezier.calcularPosicion (vehiculo.X, vehiculo.Y, vehiculo.Largo); Fisica.avanzar (vehiculo, Fisica.rumboA (vehiculo, this.Bezier.X (), this.Bezier.Y ()), 20);//A 20 km/h en la interseccion } } //Terminar de corregir la posicion en las calles SUR else if (p.Calle != null && p.VehiculoFrente == null && p.Calle.SentidoCarril1 == Elemento.DE1A2 && p.Calle.obtenerOrientacionSimple () == Elemento.VERTICAL && vehiculo.Angulo < 270 && vehiculo.Angulo > 90 && vehiculo.Carril == Elemento.CARRIL1 && !vehiculo.caminoRecto ()) { Fisica.avanzar (vehiculo, Fisica.rumboA (vehiculo, p.Calle.X + 27, vehiculo.Y + vehiculo.Largo), Configuracion.velocidadMaximaUrbano); } else if (p.Calle != null && p.VehiculoFrente == null && p.Calle.SentidoCarril2 == Elemento.DE1A2 && p.Calle.obtenerOrientacionSimple () == Elemento.VERTICAL && vehiculo.Angulo < 270 && vehiculo.Angulo > 90 && vehiculo.Carril == Elemento.CARRIL2 && !vehiculo.caminoRecto ()) { Fisica.avanzar (vehiculo, Fisica.rumboA (vehiculo, p.Calle.X + 9, vehiculo.Y + vehiculo.Largo), Configuracion.velocidadMaximaUrbano); } //Terminar de corregir la posicion en las calles NORTE else if (p.Calle != null && p.VehiculoFrente == null && p.Calle.SentidoCarril1 == Elemento.DE2A1 && p.Calle.obtenerOrientacionSimple () == Elemento.VERTICAL && ((vehiculo.Angulo <= 360 && vehiculo.Angulo >= 270) || (vehiculo.Angulo <= 90 && vehiculo.Angulo >= 0)) && vehiculo.Carril == Elemento.CARRIL1 && !vehiculo.caminoRecto ()) { Fisica.avanzar (vehiculo, Fisica.rumboA (vehiculo, p.Calle.X + 27, vehiculo.Y - vehiculo.Largo), Configuracion.velocidadMaximaUrbano); } else if (p.Calle != null && p.VehiculoFrente == null && p.Calle.SentidoCarril2 == Elemento.DE2A1 && p.Calle.obtenerOrientacionSimple () == Elemento.VERTICAL && ((vehiculo.Angulo <= 360 && vehiculo.Angulo >= 270) || (vehiculo.Angulo <= 90 && vehiculo.Angulo >= 0)) && vehiculo.Carril == Elemento.CARRIL2 && !vehiculo.caminoRecto ()) { Fisica.avanzar (vehiculo, Fisica.rumboA (vehiculo, p.Calle.X + 9, vehiculo.Y - vehiculo.Largo), Configuracion.velocidadMaximaUrbano); } //Terminar de corregir la posicion en las calles ESTE else if (p.Calle != null && p.VehiculoFrente == null && p.Calle.SentidoCarril1 == Elemento.DE1A2 && p.Calle.obtenerOrientacionSimple () == Elemento.HORIZONTAL && vehiculo.Angulo < 180 && vehiculo.Angulo > 0 && vehiculo.Carril == Elemento.CARRIL1 && !vehiculo.caminoRecto ()) { Fisica.avanzar (vehiculo, Fisica.rumboA (vehiculo, vehiculo.X + vehiculo.Largo, p.Calle.Y + 9), Configuracion.velocidadMaximaUrbano); } else if (p.Calle != null && p.VehiculoFrente == null && p.Calle.SentidoCarril2 == Elemento.DE1A2 && p.Calle.obtenerOrientacionSimple () == Elemento.HORIZONTAL && vehiculo.Angulo < 180 && vehiculo.Angulo > 0 && vehiculo.Carril == Elemento.CARRIL2 && !vehiculo.caminoRecto ()) { Fisica.avanzar (vehiculo, Fisica.rumboA (vehiculo, vehiculo.X + vehiculo.Largo, p.Calle.Y + 27), Configuracion.velocidadMaximaUrbano); } //Terminar de corregir la posicion en las calles OESTE else if (p.Calle != null && p.VehiculoFrente == null && p.Calle.SentidoCarril1 == Elemento.DE2A1 && p.Calle.obtenerOrientacionSimple () == Elemento.HORIZONTAL && vehiculo.Angulo < 360 && vehiculo.Angulo > 180 && vehiculo.Carril == Elemento.CARRIL1 && !vehiculo.caminoRecto ()) { Fisica.avanzar (vehiculo, Fisica.rumboA (vehiculo, vehiculo.X - vehiculo.Largo, p.Calle.Y + 9), Configuracion.velocidadMaximaUrbano); } else if (p.Calle != null && p.VehiculoFrente == null && p.Calle.SentidoCarril2 == Elemento.DE2A1 && p.Calle.obtenerOrientacionSimple () == Elemento.HORIZONTAL && vehiculo.Angulo < 360 && vehiculo.Angulo > 180 && vehiculo.Carril == Elemento.CARRIL2 && !vehiculo.caminoRecto ()) { Fisica.avanzar (vehiculo, Fisica.rumboA (vehiculo, vehiculo.X - vehiculo.Largo, p.Calle.Y + 27), Configuracion.velocidadMaximaUrbano); } //Terminar de corregir la posicion en las calles SUR con auto al frente else if (p.Calle != null && p.VehiculoFrente != null && p.Calle.SentidoCarril1 == Elemento.DE1A2 && p.Calle.obtenerOrientacionSimple () == Elemento.VERTICAL && vehiculo.Angulo < 270 && vehiculo.Angulo > 90 && vehiculo.Carril == Elemento.CARRIL1 && !vehiculo.caminoRecto ()) { Fisica.frenar (vehiculo, p.VehiculoFrente, Fisica.rumboA (vehiculo, p.Calle.X + 27, vehiculo.Y + vehiculo.Largo), 10); } else if (p.Calle != null && p.VehiculoFrente != null && p.Calle.SentidoCarril2 == Elemento.DE1A2 && p.Calle.obtenerOrientacionSimple () == Elemento.VERTICAL && vehiculo.Angulo < 270 && vehiculo.Angulo > 90 && vehiculo.Carril == Elemento.CARRIL2 && !vehiculo.caminoRecto ()) { Fisica.frenar (vehiculo, p.VehiculoFrente, Fisica.rumboA (vehiculo, p.Calle.X + 9, vehiculo.Y + vehiculo.Largo), 10); } //Terminar de corregir la posicion en las calles NORTE con auto al frente else if (p.Calle != null && p.VehiculoFrente != null && p.Calle.SentidoCarril1 == Elemento.DE2A1 && p.Calle.obtenerOrientacionSimple () == Elemento.VERTICAL && ((vehiculo.Angulo <= 360 && vehiculo.Angulo >= 270) || (vehiculo.Angulo <= 90 && vehiculo.Angulo >= 0)) && vehiculo.Carril == Elemento.CARRIL1 && !vehiculo.caminoRecto ()) { Fisica.frenar (vehiculo, p.VehiculoFrente, Fisica.rumboA (vehiculo, p.Calle.X + 27, vehiculo.Y - vehiculo.Largo), 10); } else if (p.Calle != null && p.VehiculoFrente != null && p.Calle.SentidoCarril2 == Elemento.DE2A1 && p.Calle.obtenerOrientacionSimple () == Elemento.VERTICAL && ((vehiculo.Angulo <= 360 && vehiculo.Angulo >= 270) || (vehiculo.Angulo <= 90 && vehiculo.Angulo >= 0)) && vehiculo.Carril == Elemento.CARRIL2 && !vehiculo.caminoRecto ()) { Fisica.frenar (vehiculo, p.VehiculoFrente, Fisica.rumboA (vehiculo, p.Calle.X + 9, vehiculo.Y - vehiculo.Largo), 10); } //Terminar de corregir la posicion en las calles ESTE con auto al frente else if (p.Calle != null && p.VehiculoFrente != null && p.Calle.SentidoCarril1 == Elemento.DE1A2 && p.Calle.obtenerOrientacionSimple () == Elemento.HORIZONTAL && vehiculo.Angulo < 180 && vehiculo.Angulo > 0 && vehiculo.Carril == Elemento.CARRIL1 && !vehiculo.caminoRecto ()) { Fisica.frenar (vehiculo, p.VehiculoFrente, Fisica.rumboA (vehiculo, vehiculo.X + vehiculo.Largo, p.Calle.Y + 9), 10); } else if (p.Calle != null && p.VehiculoFrente != null && p.Calle.SentidoCarril2 == Elemento.DE1A2 && p.Calle.obtenerOrientacionSimple () == Elemento.HORIZONTAL && vehiculo.Angulo < 180 && vehiculo.Angulo > 0 && vehiculo.Carril == Elemento.CARRIL2 && !vehiculo.caminoRecto ()) { Fisica.frenar (vehiculo, p.VehiculoFrente, Fisica.rumboA (vehiculo, vehiculo.X + vehiculo.Largo, p.Calle.Y + 27), 10); } //Terminar de corregir la posicion en las calles OESTE con auto al frente else if (p.Calle != null && p.VehiculoFrente != null && p.Calle.SentidoCarril1 == Elemento.DE2A1 && p.Calle.obtenerOrientacionSimple () == Elemento.HORIZONTAL && vehiculo.Angulo < 360 && vehiculo.Angulo > 180 && vehiculo.Carril == Elemento.CARRIL1 && !vehiculo.caminoRecto ()) { Fisica.frenar (vehiculo, p.VehiculoFrente, Fisica.rumboA (vehiculo, vehiculo.X - vehiculo.Largo, p.Calle.Y + 9), 10); } else if (p.Calle != null && p.VehiculoFrente != null && p.Calle.SentidoCarril2 == Elemento.DE2A1 && p.Calle.obtenerOrientacionSimple () == Elemento.HORIZONTAL && vehiculo.Angulo < 360 && vehiculo.Angulo > 180 && vehiculo.Carril == Elemento.CARRIL2 && !vehiculo.caminoRecto ()) { Fisica.frenar (vehiculo, p.VehiculoFrente, Fisica.rumboA (vehiculo, vehiculo.X - vehiculo.Largo, p.Calle.Y + 27), 10); } else if (p.Calle == null && p.Interseccion == null && vehiculo.VelocidadActual > 0) {//en modo contingencia los vehiculos frenan cuando se salen de las calles Fisica.frenar (vehiculo, vehiculo); } else if (p.Calle == null && p.Interseccion == null && vehiculo.VelocidadActual == 0) { //Cuando el vehiculo sale de la calle y frena completamente es apagado vehiculo.Encendido = false; }else if (p.VehiculoFrente != null && (p.VehiculoFrente.LuzFreno == true || p.VehiculoFrente.VelocidadActual == 0) && Fisica.distanciaAEnMetros (vehiculo, p.VehiculoFrente) < 3 && (p.Calle == null || (p.Calle != null && ((p.PasoCebra == null && Fisica.distanciaAEnMetros (vehiculo, p.Calle) > 0.5) || (p.PasoCebra != null && Fisica.distanciaAEnMetros (vehiculo, p.PasoCebra) > 0.5))))) {//si hay un vehiculo al frente entonces frena Fisica.frenar (vehiculo, p.VehiculoFrente); } else if (p.LomoToro != null && vehiculo.VelocidadActualKmH > p.LomoToro.VelocidadRecomendada) { Fisica.frenar (vehiculo, p.LomoToro); } else if (p.Pare != null && vehiculo.VelocidadActualKmH != 0 && p.PasoCebra == null && Fisica.distanciaAEnMetros (vehiculo, p.Calle) > 0.5) {//frenar con signo pare Fisica.frenar (vehiculo, p.Calle); } else if (p.Pare != null && vehiculo.VelocidadActualKmH != 0 && p.PasoCebra != null && Fisica.distanciaAEnMetros (vehiculo, p.PasoCebra) > 0.5) {//frenar con paso cebra y pare Fisica.frenar (vehiculo, p.PasoCebra); } else if (p.CedaElPaso != null && p.PasoCebra == null && p.VehiculoCalleFrente != null) {//frenar con signo ceda el paso Fisica.frenar (vehiculo, p.Calle); } else if (p.CedaElPaso != null && p.PasoCebra != null && p.VehiculoCalleFrente != null) {//frenar con paso cebra y ceda el paso Fisica.frenar (vehiculo, p.PasoCebra); } else if (p.Semaforo != null && p.Semaforo.EstadoLuzRoja && p.PasoCebra == null) {//frenar luz roja del semaforo Fisica.frenar (vehiculo, p.Calle); } else if (p.Semaforo != null && p.Semaforo.EstadoLuzRoja && p.PasoCebra != null) {//frenar con luz roja del semaforo y paso cebra Fisica.frenar (vehiculo, p.PasoCebra); } else if (p.Semaforo != null && p.Semaforo.EstadoLuzAmarilla && p.PasoCebra == null && Fisica.alcanzoFrenar (vehiculo, p.Calle)) {//frenar luz roja del semaforo Fisica.frenar (vehiculo, p.Calle); } else if (p.Semaforo != null && p.Semaforo.EstadoLuzAmarilla && p.PasoCebra != null && Fisica.alcanzoFrenar (vehiculo, p.PasoCebra)) {//frenar con luz roja del semaforo y paso cebra Fisica.frenar (vehiculo, p.PasoCebra); } else if (p.Bache != null && Fisica.distanciaAEnMetros (vehiculo, p.Bache) > 1) {//reducir la velocidad si hay bache Fisica.frenar (vehiculo, p.Bache); } else if (p.VehiculoFrente != null && (Fisica.distanciaAEnMetros (vehiculo, p.VehiculoFrente) < 3 || !Fisica.alcanzoFrenar(vehiculo,3))) { Fisica.frenar (vehiculo, p.VehiculoFrente, p.VehiculoFrente.VelocidadActualKmH-5); } else if (p.Limite != null && vehiculo.VelocidadActualKmH - 2 > p.Limite.Velocidad) { Fisica.frenar (vehiculo, p.Calle); } else if (p.Limite != null && vehiculo.VelocidadActualKmH + 2 < p.Limite.Velocidad) { Fisica.acelerar (vehiculo); } else if (p.Limite != null && (vehiculo.VelocidadActualKmH + 2 >= p.Limite.Velocidad && vehiculo.VelocidadActualKmH - 2 <= p.Limite.Velocidad)) { Fisica.avanzar (vehiculo); } else if (vehiculo.VelocidadActualKmH + 2 < Configuracion.velocidadMaximaUrbano) { Fisica.acelerar (vehiculo); } else if (vehiculo.VelocidadActualKmH + 2 >= Configuracion.velocidadMaximaUrbano && vehiculo.VelocidadActualKmH - 2 <= Configuracion.velocidadMaximaUrbano) { Fisica.avanzar (vehiculo); } else if (vehiculo.VelocidadActualKmH - 2 > Configuracion.velocidadMaximaUrbano) { Fisica.frenar (vehiculo, p.Calle); } }
public Percepcion percepcionVehiculo(Vehiculo auto, List<Elemento> calles, List<Elemento> señaleticas, Hashtable sectores) { p = new Percepcion (); sectoresPosibles = new Sector[6]; double distancia = 0; //Persibir la calle donde se encuentra parado int i=0; bool encontrado = false; while(i<calles.Count && !encontrado) { //Solo se puede encontrar una calle o interseccion int x = (int)calles[i].X; int y = (int)calles[i].Y; if (calles[i] is Calle) { if (calles[i].Orientacion == Elemento.HORIZONTAL) { if (x <= auto.X-auto.Largo+1 && x + ((Calle)calles[i]).Largo >= auto.X-auto.Largo && y <= auto.Y && y + ((Calle)calles[i]).Ancho >= auto.Y && auto.Orientacion == Elemento.OESTE) { p.Calle = (Calle)calles[i]; encontrado = true; } else if (x <= auto.X+auto.Largo && x + ((Calle)calles[i]).Largo >= auto.X+auto.Largo-1 && y <= auto.Y && y + ((Calle)calles[i]).Ancho >= auto.Y && auto.Orientacion == Elemento.ESTE) { p.Calle = (Calle)calles[i]; encontrado = true; } } else if (calles[i].Orientacion == Elemento.VERTICAL) { if (x <= auto.X && (x + ((Calle)calles[i]).Ancho) >= auto.X && auto.Orientacion == Elemento.NORTE && y <= auto.Y-auto.Largo+1 && (y + ((Calle)calles[i]).Largo) >= auto.Y-auto.Largo) { p.Calle = (Calle)calles[i]; encontrado = true; } else if (x <= auto.X && (x + ((Calle)calles[i]).Ancho) >= auto.X && auto.Orientacion == Elemento.SUR && y <= auto.Y+auto.Largo && (y + ((Calle)calles[i]).Largo) >= auto.Y+auto.Largo-1) { p.Calle = (Calle)calles[i]; encontrado = true; } } } if (calles[i] is Interseccion) { if (x <= auto.X+auto.Largo && (x + ((Interseccion)calles[i]).Ancho) >= auto.X-auto.Largo && y <= auto.Y+auto.Largo && (y + ((Interseccion)calles[i]).Ancho) >= auto.Y-auto.Largo) { p.Interseccion = (Interseccion)calles[i]; encontrado = true; } } i++; } //Percepcion de señaleticas foreach (Elemento elemento in señaleticas) { if (Fisica.orientacionOpuestas(auto.Orientacion,elemento.Orientacion)) { //Tomar en cuenta el punto de posicion del elemento if ((auto.Orientacion == Elemento.NORTE && auto.Y-auto.Largo/2 >= elemento.Y) || (auto.Orientacion == Elemento.OESTE && auto.X-auto.Largo/2 >= elemento.X) || (auto.Orientacion == Elemento.SUR && auto.Y+auto.Largo/2 <= elemento.Y) || (auto.Orientacion == Elemento.ESTE && auto.X+auto.Largo/2 <= elemento.X)) { distancia = Fisica.distanciaA (auto, elemento); if (distancia <= Configuracion.radioPercepcionSeñaletica) { if (elemento is PasoDeCebra) p.PasoCebra = (PasoDeCebra)elemento; else if (elemento is LomoDeToro) p.LomoToro = (LomoDeToro)elemento; else if (elemento is Semaforo) p.Semaforo = (Semaforo)elemento; else if (elemento is Pare) p.Pare = (Pare)elemento; else if (elemento is CedaElPaso) p.CedaElPaso = (CedaElPaso)elemento; else if (elemento is VelocidadMaxima) p.Limite = (VelocidadMaxima)elemento; } } } //if (elemento is Bache) // p.BacheFrente = (Bache)elemento; } //Percecion de vehiculos double grados = 0; double vision = 10;//10º de vision normal if (!auto.caminoCasiRecto()) vision = 30; if (auto.Orientacion == Vehiculo.SUR) { //El sector 0 nunca puede ser nulo porque es de donde esta el auto sectoresPosibles [0] = (Sector)sectores [Sector.claveHash (auto.X, auto.Y)]; sectoresPosibles [1] = (Sector)sectores [(sectoresPosibles [0].X-1) + "," + sectoresPosibles [0].Y]; sectoresPosibles [2] = (Sector)sectores [(sectoresPosibles [0].X+1) + "," + sectoresPosibles [0].Y]; sectoresPosibles [3] = (Sector)sectores [sectoresPosibles [0].X + "," + (sectoresPosibles [0].Y+1)]; sectoresPosibles [4] = (Sector)sectores [(sectoresPosibles [0].X-1) + "," + (sectoresPosibles [0].Y+1)]; sectoresPosibles [5] = (Sector)sectores [(sectoresPosibles [0].X+1) + "," + (sectoresPosibles [0].Y+1)]; } else if (auto.Orientacion == Vehiculo.NORTE) { //El sector 0 nunca puede ser nulo porque es de donde esta el auto sectoresPosibles [0] = (Sector)sectores [Sector.claveHash (auto.X, auto.Y)]; sectoresPosibles [1] = (Sector)sectores [(sectoresPosibles [0].X-1) + "," + sectoresPosibles [0].Y]; sectoresPosibles [2] = (Sector)sectores [(sectoresPosibles [0].X+1) + "," + sectoresPosibles [0].Y]; sectoresPosibles [3] = (Sector)sectores [sectoresPosibles [0].X + "," + (sectoresPosibles [0].Y-1)]; sectoresPosibles [4] = (Sector)sectores [(sectoresPosibles [0].X-1) + "," + (sectoresPosibles [0].Y-1)]; sectoresPosibles [5] = (Sector)sectores [(sectoresPosibles [0].X+1) + "," + (sectoresPosibles [0].Y-1)]; } else if (auto.Orientacion == Vehiculo.ESTE) { //El sector 0 nunca puede ser nulo porque es de donde esta el auto sectoresPosibles [0] = (Sector)sectores [Sector.claveHash (auto.X, auto.Y)]; sectoresPosibles [1] = (Sector)sectores [sectoresPosibles [0].X + "," + (sectoresPosibles [0].Y+1)]; sectoresPosibles [2] = (Sector)sectores [sectoresPosibles [0].X + "," + (sectoresPosibles [0].Y-1)]; sectoresPosibles [3] = (Sector)sectores [(sectoresPosibles [0].X+1) + "," + sectoresPosibles [0].Y]; sectoresPosibles [4] = (Sector)sectores [(sectoresPosibles [0].X+1) + "," + (sectoresPosibles [0].Y+1)]; sectoresPosibles [5] = (Sector)sectores [(sectoresPosibles [0].X+1) + "," + (sectoresPosibles [0].Y-1)]; } else if (auto.Orientacion == Vehiculo.OESTE) { //El sector 0 nunca puede ser nulo porque es de donde esta el auto sectoresPosibles [0] = (Sector)sectores [Sector.claveHash (auto.X, auto.Y)]; sectoresPosibles [1] = (Sector)sectores [sectoresPosibles [0].X + "," + (sectoresPosibles [0].Y+1)]; sectoresPosibles [2] = (Sector)sectores [sectoresPosibles [0].X + "," + (sectoresPosibles [0].Y-1)]; sectoresPosibles [3] = (Sector)sectores [(sectoresPosibles [0].X-1) + "," + sectoresPosibles [0].Y]; sectoresPosibles [4] = (Sector)sectores [(sectoresPosibles [0].X-1) + "," + (sectoresPosibles [0].Y+1)]; sectoresPosibles [5] = (Sector)sectores [(sectoresPosibles [0].X-1) + "," + (sectoresPosibles [0].Y-1)]; } for (int s = 0; s < 6; s++) { if (sectoresPosibles [s] != null) { List<Vehiculo> vehiculos = sectoresPosibles[s].Vehiculos; for (int x = 0; x < vehiculos.Count; x++) { if (vehiculos [x] != auto) { distancia = Fisica.distanciaA (auto, vehiculos [x]); if (distancia <= Configuracion.radioPercepcionVehiculo) { grados = Fisica.rumboA (auto, vehiculos [x].X, vehiculos [x].Y); grados = grados - auto.Angulo; if (grados < 0) grados = 360 + grados; if (grados >= 360 - vision || grados <= 0 + vision) { if (p.VehiculoFrente == null || (p.VehiculoFrente != null && Fisica.distanciaA (auto, p.VehiculoFrente) > distancia)) { p.VehiculoFrente = vehiculos [x]; } } if (p.VehiculoFrente == null || (p.VehiculoFrente != null && p.VehiculoFrente != vehiculos [x])) { if ((grados >= 295 || grados <= 65) && Math.Abs (auto.Angulo - vehiculos [x].Angulo) > 30 && Math.Abs (auto.Angulo - vehiculos [x].Angulo) <= 90) { if (p.VehiculoCalleFrente == null || (p.VehiculoCalleFrente != null && Fisica.distanciaA (auto, p.VehiculoCalleFrente) > distancia)) { p.VehiculoCalleFrente = vehiculos [x]; } } } } } } } } return p; }