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);
			}
		}
Ejemplo n.º 2
0
		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;
		}