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; }
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); }
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); }
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; }
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; }
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; }
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; }
public static void frenar(Vehiculo vehiculo, Elemento elemento) { frenar (vehiculo, elemento, 10); }
public static void frenar(Vehiculo vehiculo, Elemento elemento, double angulo, double velocidadMinima) { vehiculo.Angulo = angulo; frenar (vehiculo, elemento, velocidadMinima); }
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; }
public void agregar(Vehiculo vehiculo) { vehiculos.Add (vehiculo); }
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; }
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; }
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); }
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); }
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++; } } } } }
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); }
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++; } }
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); }
public void eliminar(Vehiculo vehiculo) { vehiculos.Remove (vehiculo); }
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); }
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; }
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); } }
//Sensor de la vista de los conductores (agentes) public abstract void funcionAgente(Vehiculo miVehiculo, List<Elemento> calles, List<Elemento> señaleticas, Hashtable sectores);