コード例 #1
0
		public static void frenar(Vehiculo vehiculo, Elemento elemento, double velocidadMinima)
		{
			//Movimiento rectilineo uniforme acelerado
			double velocidad = vehiculo.VelocidadActualKmH;
			double distancia = distanciaAEnMetros (vehiculo, elemento);
			double aceleracionLimite = vehiculo.FuerzaFrenado;
			double newton;
			double velocidadAnterior = vehiculo.VelocidadActualKmH;
			if(distancia > 0)
				newton = 0.019 * vehiculo.Masa * Math.Pow (velocidad, 2) / distancia;
			else
				newton = aceleracionLimite;
			if (newton < 0)
				newton = 0;
			if (newton > aceleracionLimite)
				newton = aceleracionLimite;
			velocidad = velocidad - (0.5 * (newton / vehiculo.Masa));

			if (distancia > 2 && velocidad < velocidadMinima && velocidad <= vehiculo.VelocidadActualKmH)
				vehiculo.VelocidadActualKmH = velocidadMinima;
			else if (velocidad < vehiculo.VelocidadActualKmH)
				vehiculo.VelocidadActualKmH = velocidad;
			avanzar (vehiculo);
			if(velocidadAnterior > vehiculo.VelocidadActualKmH || vehiculo.VelocidadActual == 0)
				vehiculo.LuzFreno = true;
		}
コード例 #2
0
		public static void avanzar(Vehiculo vehiculo, double angulo, double velocidadMaxima)
		{
			vehiculo.Angulo = angulo;

			if (vehiculo.VelocidadActualKmH + 2 < velocidadMaxima)
				Fisica.acelerar (vehiculo);
			else
				Fisica.avanzar (vehiculo);
		}
コード例 #3
0
		public static void acelerar(Vehiculo vehiculo)
		{
			//Movimiento rectilineo uniforme acelerado
			double velocidad = vehiculo.VelocidadActualKmH;
			double fuerza = vehiculo.FuerzaAceleracion;
			double aceleracion = fuerza / vehiculo.Masa;

			velocidad = velocidad + (0.5 * aceleracion);
			vehiculo.VelocidadActualKmH = velocidad;

			//se modifica la velocidad luego se avanza
			avanzar(vehiculo);
		}
コード例 #4
0
		public static void avanzar(Vehiculo vehiculo)
		{
			//Movimiento rectilineo uniforme
			double x = vehiculo.X;
			double y = vehiculo.Y;
			double velocidad = vehiculo.VelocidadActual;
			double angulo = vehiculo.Angulo;

			x = x + velocidad * Math.Sin (pasarARadianes(angulo));
			y = y - velocidad * Math.Cos (pasarARadianes(angulo));
			vehiculo.X = x;
			vehiculo.Y = y;
			vehiculo.LuzFreno = false;
		}
コード例 #5
0
		public static bool alcanzoFrenar(Vehiculo vehiculo, Elemento elemento)
		{
			double velocidad = vehiculo.VelocidadActualKmH;
			if (velocidad > 0) {
				double distancia = distanciaAEnMetros (vehiculo, elemento);
				double aceleracionLimite = vehiculo.FuerzaFrenado;
				double newton;
				if(distancia > 0)
					newton = 0.019 * vehiculo.Masa * Math.Pow (velocidad, 2) / distancia;
				else
					newton = aceleracionLimite;
				if (newton > aceleracionLimite / 2)
					return false;
			}
			return true;
		}
コード例 #6
0
		public static double distanciaAEnMetros(Vehiculo vehiculo, Elemento destino)
		{
			double xVehiculo = 0;
			double yVehiculo = 0;
			double xObjeto = 0;
			double yObjeto = 0;
			if (destino is Calle) {
				if (vehiculo.Orientacion == Elemento.NORTE) {
					yVehiculo = vehiculo.Y - vehiculo.Largo;
					yObjeto = destino.Y;
					double distanciaPixeles = yVehiculo - yObjeto;
					return distanciaPixeles / Configuracion.METRO;
				} else if (vehiculo.Orientacion == Elemento.OESTE) {
					xVehiculo = vehiculo.X - vehiculo.Largo;
					xObjeto = destino.X;
					double distanciaPixeles = xVehiculo - xObjeto;
					return distanciaPixeles / Configuracion.METRO;
				} else if (vehiculo.Orientacion == Elemento.SUR) {
					yVehiculo = vehiculo.Y + vehiculo.Largo;
					yObjeto = destino.Y + ((Calle)destino).Largo;
					double distanciaPixeles = yObjeto - yVehiculo;
					return distanciaPixeles / Configuracion.METRO;
				} else if (vehiculo.Orientacion == Elemento.ESTE) {
					xVehiculo = vehiculo.X + vehiculo.Largo;
					xObjeto = destino.X + ((Calle)destino).Largo;
					double distanciaPixeles = xObjeto - xVehiculo;
					return distanciaPixeles / Configuracion.METRO;
				}
			} else if (destino is PasoDeCebra) {
				if (vehiculo.Orientacion == Elemento.NORTE) {
					yVehiculo = vehiculo.Y - vehiculo.Largo;
					yObjeto = destino.Y + 18;
					double distanciaPixeles = yVehiculo - yObjeto;
					return distanciaPixeles / Configuracion.METRO;
				} else if (vehiculo.Orientacion == Elemento.OESTE) {
					xVehiculo = vehiculo.X - vehiculo.Largo;
					xObjeto = destino.X + 18;
					double distanciaPixeles = xVehiculo - xObjeto;
					return distanciaPixeles / Configuracion.METRO;
				} else if (vehiculo.Orientacion == Elemento.SUR) {
					yVehiculo = vehiculo.Y + vehiculo.Largo;
					yObjeto = destino.Y - 18;
					double distanciaPixeles = yObjeto - yVehiculo;
					return distanciaPixeles / Configuracion.METRO;
				} else if (vehiculo.Orientacion == Elemento.ESTE) {
					xVehiculo = vehiculo.X + vehiculo.Largo;
					xObjeto = destino.X - 18;
					double distanciaPixeles = xObjeto - xVehiculo;
					return distanciaPixeles / Configuracion.METRO;
				}
			} else if (destino is Bache) {
				return 0;
			} else if (destino is LomoDeToro) {
				LomoDeToro aux = (LomoDeToro)destino;
				if (vehiculo.Orientacion == Elemento.NORTE) {
					yVehiculo = vehiculo.Y - vehiculo.Largo;
					yObjeto = aux.Y;
					double distanciaPixeles = yVehiculo - yObjeto;
					return distanciaPixeles / Configuracion.METRO;
				} else if (vehiculo.Orientacion == Elemento.OESTE) {
					xVehiculo = vehiculo.X - vehiculo.Largo;
					xObjeto = aux.X;
					double distanciaPixeles = xVehiculo - xObjeto;
					return distanciaPixeles / Configuracion.METRO;
				} else if (vehiculo.Orientacion == Elemento.SUR) {
					yVehiculo = vehiculo.Y + vehiculo.Largo;
					yObjeto = aux.Y + aux.Ancho;
					double distanciaPixeles = yObjeto - yVehiculo;
					return distanciaPixeles / Configuracion.METRO;
				} else if (vehiculo.Orientacion == Elemento.ESTE) {
					xVehiculo = vehiculo.X + vehiculo.Largo;
					xObjeto = aux.X + aux.Ancho;
					double distanciaPixeles = xObjeto - xVehiculo;
					return distanciaPixeles / Configuracion.METRO;
				}
			} else if (destino is Vehiculo) {
				if (vehiculo.Orientacion == Elemento.NORTE) {
					yVehiculo = vehiculo.Y - vehiculo.Largo;
					yObjeto = destino.Y + 5;
					double distanciaPixeles = yVehiculo - yObjeto;
					return distanciaPixeles / Configuracion.METRO;
				} else if (vehiculo.Orientacion == Elemento.OESTE) {
					xVehiculo = vehiculo.X - vehiculo.Largo;
					xObjeto = destino.X + 5;
					double distanciaPixeles = xVehiculo - xObjeto;
					return distanciaPixeles / Configuracion.METRO;
				} else if (vehiculo.Orientacion == Elemento.SUR) {
					yVehiculo = vehiculo.Y + vehiculo.Largo;
					yObjeto = destino.Y - 5;
					double distanciaPixeles = yObjeto - yVehiculo;
					return distanciaPixeles / Configuracion.METRO;
				} else if (vehiculo.Orientacion == Elemento.ESTE) {
					xVehiculo = vehiculo.X + vehiculo.Largo;
					xObjeto = destino.X - 5;
					double distanciaPixeles = xObjeto - xVehiculo;
					return distanciaPixeles / Configuracion.METRO;
				}
			} else if (destino is Pare) {
				if (vehiculo.Orientacion == Elemento.NORTE) {
					yVehiculo = vehiculo.Y - vehiculo.Largo;
					yObjeto = destino.Y;
					double distanciaPixeles = yVehiculo - yObjeto;
					return distanciaPixeles / Configuracion.METRO;
				} else if (vehiculo.Orientacion == Elemento.OESTE) {
					xVehiculo = vehiculo.X - vehiculo.Largo;
					xObjeto = destino.X;
					double distanciaPixeles = xVehiculo - xObjeto;
					return distanciaPixeles / Configuracion.METRO;
				} else if (vehiculo.Orientacion == Elemento.SUR) {
					yVehiculo = vehiculo.Y + vehiculo.Largo;
					yObjeto = destino.Y;
					double distanciaPixeles = yObjeto - yVehiculo;
					return distanciaPixeles / Configuracion.METRO;
				} else if (vehiculo.Orientacion == Elemento.ESTE) {
					xVehiculo = vehiculo.X + vehiculo.Largo;
					xObjeto = destino.X;
					double distanciaPixeles = xObjeto - xVehiculo;
					return distanciaPixeles / Configuracion.METRO;
				}
			} else if (destino is Semaforo) {
				if (vehiculo.Orientacion == Elemento.NORTE) {
					yVehiculo = vehiculo.Y - vehiculo.Largo;
					yObjeto = destino.Y;
					double distanciaPixeles = yVehiculo - yObjeto;
					return distanciaPixeles / Configuracion.METRO;
				} else if (vehiculo.Orientacion == Elemento.OESTE) {
					xVehiculo = vehiculo.X - vehiculo.Largo;
					xObjeto = destino.X;
					double distanciaPixeles = xVehiculo - xObjeto;
					return distanciaPixeles / Configuracion.METRO;
				} else if (vehiculo.Orientacion == Elemento.SUR) {
					yVehiculo = vehiculo.Y + vehiculo.Largo;
					yObjeto = destino.Y+20;
					double distanciaPixeles = yObjeto - yVehiculo;
					return distanciaPixeles / Configuracion.METRO;
				} else if (vehiculo.Orientacion == Elemento.ESTE) {
					xVehiculo = vehiculo.X + vehiculo.Largo;
					xObjeto = destino.X+20;
					double distanciaPixeles = xObjeto - xVehiculo;
					return distanciaPixeles / Configuracion.METRO;
				}
			}
			return 0;
		}
コード例 #7
0
		public static bool estaSobre(Vehiculo elemento)
		{
			//El punto es el centro del vehiculo
			int xCentro = (int)elemento.X;
			int yCentro = (int)elemento.Y;
			int largo = elemento.Largo;
			int ancho = 12;

			//Coordenada de inicio del dibujo
			int x = xCentro-(ancho/2);
			int y = yCentro;

			int xR = Modificar.posX;
			int yR = Modificar.posY;

			if (elemento.Orientacion == Elemento.SUR && xR >= x && xR <= x + ancho && yR >= y && yR <= y+largo) {
				idElementoEliminar = elemento.Id;
				return true;
			}
			else if (elemento.Orientacion == Elemento.NORTE && xR >= x && xR <= x + ancho && yR >= y-largo && yR <= y) {
				idElementoEliminar = elemento.Id;
				return true;
			}
			x = xCentro;
			y = yCentro-(ancho/2);
			if (elemento.Orientacion == Elemento.ESTE && xR >= x && xR <= x + largo && yR >= y && yR <= y + ancho) {
				idElementoEliminar = elemento.Id;
				return true;
			}
			else if (elemento.Orientacion == Elemento.OESTE && xR >= x - largo && xR <= x && yR >= y && yR <= y + ancho) {
				idElementoEliminar = elemento.Id;
				return true;
			}
			if (idElementoEliminar == elemento.Id)
				idElementoEliminar = -1;
			return false;
		}
コード例 #8
0
		public static void frenar(Vehiculo vehiculo, Elemento elemento)
		{
			frenar (vehiculo, elemento, 10);
		}
コード例 #9
0
		public static void frenar(Vehiculo vehiculo, Elemento elemento, double angulo, double velocidadMinima)
		{
			vehiculo.Angulo = angulo;
			frenar (vehiculo, elemento, velocidadMinima);
		}
コード例 #10
0
        public static bool colision(Vehiculo auto1, Vehiculo auto2)
        {
            double angulo1 = auto1.Angulo, ancho1 = 12, largo1 = auto1.Largo;
            double angulo2 = auto2.Angulo, ancho2 = 12, largo2 = auto2.Largo;

            double x1, y1 , x2 , y2 ;

            x1 = auto1.X;
            y1 = auto1.Y;
            x2 = auto2.X;
            y2 = auto2.Y;

            double distancia1X=0, distancia1Y=0;
            double distancia2X=0, distancia2Y=0;
            bool y_colision = false, x_colision = false;
            bool rect_auto1 = false, rect_auto2 = false;


            if (angulo1 == 270 || angulo1 == 90)
            {
                rect_auto1 = true;
                distancia1X = largo1;
                distancia1Y = ancho1;
                x1 -= distancia1X/2;
                y1 -= distancia1Y/2;
            }
            if (angulo1 == 0 || angulo1 == 180)
            {
                rect_auto1 = true;
                distancia1X = ancho1;
                distancia1Y = largo1;
                x1 -= distancia1X/2;
                y1 -= distancia1Y/2;
            }


            if (angulo2 == 270 || angulo2 == 90)
            {
                rect_auto2 = true;
                distancia2X = largo2;
                distancia2Y = ancho2;
                x2 -= distancia2X/2;
                y2 -= distancia2Y/2;
            }
            if (angulo2 == 0 || angulo2 == 180)
            {
                rect_auto2 = true;
                distancia2X = ancho2;
                distancia2Y = largo2;
                x2 -= distancia2X/2;
                y2 -= distancia2Y/2;
            }

            if(!rect_auto1)
            {
                if (angulo1 >= 90 && angulo1 < 180)
                {
                    angulo1 = angulo1 - 90;
                }
                else if (angulo1 >= 180 && angulo1 < 270)
                {
                    angulo1 = angulo1 - 180;
                }
                else if (angulo1 >= 270 && angulo1 < 360)
                {
                    angulo1 = angulo1 - 270;
                }
                distancia1X = segmentoXY(ancho1, largo1, angulo1);
                distancia1Y = segmentoXY(largo1, ancho1, angulo1);
                x1 -= distancia1X;
                y1 -= distancia1Y;

                distancia1X *= 2;
                distancia1Y *= 2;
            }

            

            //------------------------------------------------------------------------------------------------------
            if(!rect_auto2)
            {
                if (angulo2 >= 90 && angulo2 < 180)
                {
                    angulo2 = angulo2 - 90;
                }
                else if (angulo2 >= 180 && angulo2 < 270)
                {
                    angulo2 = angulo2 - 180;
                }
                else if (angulo2 >= 270 && angulo2 < 360)
                {
                    angulo2 = angulo2 - 270;
                }
                distancia2X = segmentoXY(ancho2, largo2, angulo2);
                distancia2Y = segmentoXY(largo2, ancho2, angulo2);


                x2 -= distancia2X;
                y2 -= distancia2Y;


                distancia2Y *= 2;
                distancia2X *= 2;

            }



            if ((x1 > x2 && x1 < x2 + distancia2X) || (x1 + distancia1X > x2 && x1 + distancia1X< x2 + distancia2X))
                x_colision = true;

            if ((y1 > y2 && y1 < y2 + distancia2Y) || (y1 + distancia1Y > y2 && y1 + distancia1Y < y2 + distancia2Y))
                y_colision = true;
            //System.Console.WriteLine();
            //System.Console.WriteLine("angulo1: "+ angulo1);
            //System.Console.WriteLine("angulo2: " + angulo2);
            //System.Console.WriteLine("x1: " + x1);
            //System.Console.WriteLine("distanciax1: " + distancia1X);
            //System.Console.WriteLine("x2: " + x2);
            //System.Console.WriteLine("distanciax2: " + distancia2X);
            //System.Console.WriteLine("y1: " + y1);
            //System.Console.WriteLine("distanciay1: " + distancia1Y);
            //System.Console.WriteLine("y2: " + y2);
            //System.Console.WriteLine("distanciay2: " + distancia2Y);

            if (y_colision == true && x_colision == true)
                return true;
            return false;
        }
コード例 #11
0
		public void agregar(Vehiculo vehiculo)
		{
			vehiculos.Add (vehiculo);
		}
コード例 #12
0
        public static int posElemento(Vehiculo vehiculo, Elemento elemento)
        {
            double angulo = angulo2puntos(vehiculo, elemento);

            if (angulo < 0)
                angulo = 360 + angulo;
            angulo = 360 - angulo;

            if (45 <= angulo && angulo < 135)//frente
            {
				return Elemento.NORTE;
            }
            if ((315 < angulo && angulo <=360) || (angulo <45 && angulo > 0) )//derecha
            {
				return Elemento.ESTE;
            }
            if ( 225 < angulo && angulo < 315)//abajo
            {
				return Elemento.SUR;
            }
            if (135 <= angulo && angulo < 225)//izquierda
            {
				return Elemento.OESTE;
            }
            return 0;
        }
コード例 #13
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;
		}
コード例 #14
0
		public override void funcionAgente(Vehiculo miVehiculo, List<Elemento> calles, List<Elemento> señaleticas, Hashtable sectores)
        {
			//Actualiza la percepcion del agente
			this.percepcionVehiculo(miVehiculo, calles, señaleticas, sectores);
			this.tabla_de_reglas(miVehiculo, this.Percepcion);
        }
コード例 #15
0
		public static double distanciaA(Vehiculo p1, Elemento p2)
        {
			return Math.Pow(Math.Pow(p2.Y - p1.Y, 2) + Math.Pow(p2.X - p1.X, 2), 0.5); 
        }
コード例 #16
0
		public void generarVehiculos()
		{
			Hashtable vehiculosCarril1 = new Hashtable();
			Hashtable vehiculosCarril2 = new Hashtable();
			int orientacion = 0;
			int carrilX1 = 0;
			int carrilX2 = 0;
			int carrilY1 = 0;
			int carrilY2 = 0;

			//Busca todos los vehiculos sobre algun generador
			for(int x=0; x<vehiculos.Count; x++){
				if (vehiculos [x].Conductor.Percepcion != null && vehiculos [x].Conductor.Percepcion.Calle != null) {
					if (vehiculos [x].Conductor.Percepcion.Calle is Generador) {
						if(vehiculos[x].Carril == Elemento.CARRIL1 && !vehiculosCarril1.ContainsKey(vehiculos [x].Conductor.Percepcion.Calle.Id))
							vehiculosCarril1.Add (vehiculos [x].Conductor.Percepcion.Calle.Id, vehiculos [x]);
						else if(vehiculos[x].Carril == Elemento.CARRIL2 && !vehiculosCarril2.ContainsKey(vehiculos [x].Conductor.Percepcion.Calle.Id))
							vehiculosCarril2.Add (vehiculos [x].Conductor.Percepcion.Calle.Id, vehiculos [x]);
					}
				}
			}
			//Se generan los vehiculos si es posible
			if (vehiculos.Count < Configuracion.maximoVehiculoMapa) {
				foreach (Generador generador in generadores) {
					Random aleatorio = new Random ();
					int tipoVehiculo = -1, valor = 0, destino = -1;

					//Se elige un tipo de vehiculo de forma aleatoria
					//Los Vehiculos Personales tienen un 70 % de probabilidad
					//Los Transportes publicos tienen un 25 % de probabilidad
					//Los Camiones tienen un 5 % de probabilidad
					valor = aleatorio.Next (0, 100);
					if (valor < 70)
						tipoVehiculo = Vehiculo.AUTOPERSONAL;
					else if (valor >= 70 && valor < 95)
						tipoVehiculo = Vehiculo.TRASPORTEPUBLICO;
					else if (valor >= 95)
						tipoVehiculo = Vehiculo.CAMION;

					//Elige el objetivo determinado por el generador con un X% escogido de probabilidad
					if (generador.Objetivo != -1 && aleatorio.Next (0, 100) <= generador.Probabilidad)
						destino = generador.Objetivo;
					if (generador.Frecuencia > 0 && ((generador.Salida1 != null && (generador.SentidoCarril1 == Elemento.DE2A1 || generador.SentidoCarril2 == Elemento.DE2A1)) ||
						(generador.Salida2 != null && (generador.SentidoCarril1 == Elemento.DE1A2 || generador.SentidoCarril2 == Elemento.DE1A2)))) {
						if (((Configuracion.tiempoReal * 60) / generador.Frecuencia) < generador.Ciclo) {

							if (generador.obtenerOrientacionSimple () == Elemento.HORIZONTAL && generador.Salida1 != null) {
								orientacion = Elemento.OESTE;
								carrilX1 = 80;
								carrilX2 = 80;
								carrilY1 = 9;
								carrilY2 = 27;
							} else if (generador.obtenerOrientacionSimple () == Elemento.HORIZONTAL && generador.Salida2 != null) {
								orientacion = Elemento.ESTE;
								carrilX1 = 0;
								carrilX2 = 0;
								carrilY1 = 9;
								carrilY2 = 27;
							} else if (generador.obtenerOrientacionSimple () == Elemento.VERTICAL && generador.Salida1 != null) {
								orientacion = Elemento.NORTE;
								carrilX1 = 27;
								carrilX2 = 9;
								carrilY1 = 80;
								carrilY2 = 80;
							} else if (generador.obtenerOrientacionSimple () == Elemento.VERTICAL && generador.Salida2 != null) {
								orientacion = Elemento.SUR;
								carrilX1 = 27;
								carrilX2 = 9;
								carrilY1 = 0;
								carrilY2 = 0;
							}

							if (generador.Salida1 != null) {
								if (generador.SentidoCarril1 == Elemento.DE2A1 && generador.SentidoCarril2 == Elemento.DE2A1) {
									if (!vehiculosCarril1.ContainsKey (generador.Id)) {
										Vehiculo auto = new Vehiculo (new AgenteBasadoObjetivo(soloCalle, destino), tipoVehiculo,100, Elemento.CARRIL1,orientacion, generador.X+carrilX1, generador.Y+carrilY1);
										this.agregarVehiculos (auto);
										generador.Ciclo = 1;
									} else if (!vehiculosCarril2.ContainsKey (generador.Id)) {
										Vehiculo auto = new Vehiculo (new AgenteBasadoObjetivo(soloCalle, destino), tipoVehiculo,100, Elemento.CARRIL2,orientacion, generador.X+carrilX2, generador.Y+carrilY2);
										this.agregarVehiculos (auto);
										generador.Ciclo = 1;
									}
								} else if (generador.SentidoCarril1 == Elemento.DE2A1) {
									if (!vehiculosCarril1.ContainsKey (generador.Id)) {
										Vehiculo auto = new Vehiculo (new AgenteBasadoObjetivo(soloCalle, destino), tipoVehiculo,100, Elemento.CARRIL1,orientacion, generador.X+carrilX1, generador.Y+carrilY1);
										this.agregarVehiculos (auto);
										generador.Ciclo = 1;
									}
								} else if (generador.SentidoCarril2 == Elemento.DE2A1) {
									if (!vehiculosCarril2.ContainsKey (generador.Id)) {
										Vehiculo auto = new Vehiculo (new AgenteBasadoObjetivo(soloCalle, destino), tipoVehiculo,100, Elemento.CARRIL2,orientacion, generador.X+carrilX2, generador.Y+carrilY2);
										this.agregarVehiculos (auto);
										generador.Ciclo = 1;
									}
								}
							} else if (generador.Salida2 != null) {
								if (generador.SentidoCarril1 == Elemento.DE1A2 && generador.SentidoCarril2 == Elemento.DE1A2) {
									if (!vehiculosCarril1.ContainsKey (generador.Id)) {
										Vehiculo auto = new Vehiculo (new AgenteBasadoObjetivo(soloCalle, destino), tipoVehiculo,100, Elemento.CARRIL1,orientacion, generador.X+carrilX1, generador.Y+carrilY1);
										this.agregarVehiculos (auto);
										generador.Ciclo = 1;
									} else if (!vehiculosCarril2.ContainsKey (generador.Id)) {
										Vehiculo auto = new Vehiculo (new AgenteBasadoObjetivo(soloCalle, destino), tipoVehiculo,100, Elemento.CARRIL2,orientacion, generador.X+carrilX2, generador.Y+carrilY2);
										this.agregarVehiculos (auto);
										generador.Ciclo = 1;
									}
								} else if (generador.SentidoCarril1 == Elemento.DE1A2) {
									if (!vehiculosCarril1.ContainsKey (generador.Id)) {
										Vehiculo auto = new Vehiculo (new AgenteBasadoObjetivo(soloCalle, destino), tipoVehiculo,100, Elemento.CARRIL1,orientacion, generador.X+carrilX1, generador.Y+carrilY1);
										this.agregarVehiculos (auto);
										generador.Ciclo = 1;
									}
								} else if (generador.SentidoCarril2 == Elemento.DE1A2) {
									if (!vehiculosCarril2.ContainsKey (generador.Id)) {
										Vehiculo auto = new Vehiculo (new AgenteBasadoObjetivo(soloCalle, destino), tipoVehiculo,100, Elemento.CARRIL2,orientacion, generador.X+carrilX2, generador.Y+carrilY2);
										this.agregarVehiculos (auto);
										generador.Ciclo = 1;
									}
								}
							}
						} else {
							generador.Ciclo++;
						}
					}
				}
			}
		}
コード例 #17
0
		public void eliminarVehiculo(int x, Vehiculo vehiculo)
		{
			Sector sector = (Sector)sectores [Sector.claveHash (vehiculo.X, vehiculo.Y)];
			if (sector != null) {
				sector.eliminar (vehiculo);
			}
			else
				Console.WriteLine ("Error, el vehiculo no existe en eliminar vehiculo");
			vehiculos.RemoveAt (x);
		}
コード例 #18
0
		public void agregarVehiculos(Vehiculo elemento)
		{
			if (vehiculos.Count < Configuracion.maximoVehiculoMapa) {
				elemento.Id = generarID ();
				elemento.calcularCaracteristicas ();
				vehiculos.Add ((Vehiculo)elemento);

				string claveHash = Sector.claveHash (elemento.X, elemento.Y);
				Sector sector = (Sector)sectores[claveHash];
				if (sector == null) {
					sector = new Sector (claveHash);
					sectores.Add (claveHash, sector);
				}
				sector.agregar ((Vehiculo)elemento);
				totalVehiculos++;
			}
		}
コード例 #19
0
		public override void funcionAgente(Vehiculo miVehiculo, List<Elemento> calles, List<Elemento> señaleticas, Hashtable sectores)
        {
            this.percepcionVehiculo(miVehiculo, calles, señaleticas, sectores);
			if (Modificar.cambio) {
				//Vuelve a crear el grafo cuando cambian las calles
				Modificar.cambio = false;
				mapa = new Grafo (calle);
			}
			if (ruta == null) {
				crearObjetivo ();
			}

            trabajandoObjetivo();
			this.tabla_de_reglas(miVehiculo, this.Percepcion);
        }
コード例 #20
0
		public void eliminar(Vehiculo vehiculo)
		{
			vehiculos.Remove (vehiculo);
		}
コード例 #21
0
		private void dibujarVehiculo(Graphics grafico, Vehiculo vehiculo)
		{
			//El punto es el centro del vehiculo
			int xInicio = (int)vehiculo.X;
			int yInicio = (int)vehiculo.Y;
			int largo = vehiculo.Largo;
			int ancho = 12;

			//Coordenada del inicio del dibujo
			int x = xInicio-(ancho/2);
			int y = yInicio-largo;
			Random a = new Random (vehiculo.Id);
			Color colorVehiculo = Color.White;
			if (vehiculo.Tipo == Vehiculo.AUTOPERSONAL) {
				colorVehiculo = Color.FromArgb(a.Next(20, 105),a.Next(30, 160),125);
			} else if (vehiculo.Tipo == Vehiculo.CAMION) {
				colorVehiculo = Color.FromArgb(a.Next(0, 120),a.Next(0, 50),0);
			} else if (vehiculo.Tipo == Vehiculo.TRASPORTEPUBLICO) {
				colorVehiculo = Color.FromArgb(a.Next(230, 255),a.Next(50, 200),0);
			}
				
			if(Modificar.eliminarVehiculos && Modificar.estaSobre(vehiculo)) {
				colorVehiculo = Configuracion.COLORRESALTAR;
			}

			Color interDerecho = Color.Gray;
			Color interIzquierdo = Color.Gray;
			Color freno = Color.Gray;

			if (vehiculo.Intermitente == Vehiculo.INTERMITENTE_DERECHA)
				interDerecho = Color.Yellow;
			else if (vehiculo.Intermitente == Vehiculo.INTERMITENTE_IZQUIERDA)
				interIzquierdo = Color.Yellow;
			if (vehiculo.LuzFreno)
				freno = Color.Red;

			if (Configuracion.mostrarBezier) {
				Bezier b = vehiculo.Conductor.Bezier;
				if (b != null)
					grafico.DrawBezier (new Pen (colorVehiculo), b.X1, b.Y1, b.X2, b.Y2, b.X3, b.Y3, b.X4, b.Y4);
			}
			//Rota el vehiculo con el angulo de giro
			Matrix m = new Matrix ();
			m.Translate (Configuracion.origenX,Configuracion.origenY);
			m.Scale (Configuracion.tamañoMapa,Configuracion.tamañoMapa);
			m.RotateAt ((int)vehiculo.Angulo, new PointF (xInicio, yInicio));
			grafico.Transform = m;
			grafico.FillRectangle (new SolidBrush (colorVehiculo), x, y, ancho, largo);
			grafico.FillRectangle (new SolidBrush (interIzquierdo), x, y+largo-2, 2, 2);
			grafico.FillRectangle (new SolidBrush (freno), x+4, y+largo-2, 4, 2);
			grafico.FillRectangle (new SolidBrush (interDerecho), x+10, y+largo-2, 2, 2);
			//grafico.FillRectangle (new SolidBrush (Color.Green), x+ancho/2, y+largo, 4, 4);
			//grafico.FillRectangle (new SolidBrush (Color.YellowGreen), x+ancho/2-4, y+largo, 4, 4);
			if (Configuracion.mostrarRadioPercepcion) {
				grafico.DrawEllipse (new Pen (colorVehiculo), xInicio - Configuracion.radioPercepcionVehiculo, yInicio-(largo/2) - Configuracion.radioPercepcionVehiculo, Configuracion.radioPercepcionVehiculo * 2, Configuracion.radioPercepcionVehiculo * 2);
				grafico.DrawEllipse (new Pen (colorVehiculo), xInicio - Configuracion.radioPercepcionSeñaletica, yInicio-(largo/2) - Configuracion.radioPercepcionSeñaletica, Configuracion.radioPercepcionSeñaletica * 2, Configuracion.radioPercepcionSeñaletica * 2);
			}
			this.dibujarID (grafico, vehiculo.Id, Elemento.VERTICAL, x+3, y);
			grafico.ResetTransform ();

			//Se reestablecen los ajustes del mapa
			grafico.TranslateTransform (Configuracion.origenX,Configuracion.origenY);
			grafico.ScaleTransform (Configuracion.tamañoMapa,Configuracion.tamañoMapa);
		}
コード例 #22
0
		public static double rumboA(Vehiculo v1, double x2, double y2)
		{
			double angulo = pasarAGrados(Math.Atan2(x2 - v1.X, v1.Y - y2));
			if (angulo > 360)	angulo = angulo - 360;
			else if (angulo < 0)	angulo = angulo + 360;
			return angulo;
		}
コード例 #23
0
		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);
			}
		}
コード例 #24
0
        //Sensor de la vista de los conductores (agentes)
		public abstract void funcionAgente(Vehiculo miVehiculo, List<Elemento> calles, List<Elemento> señaleticas, Hashtable sectores);