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 void agregarCalle(Elemento elemento) { elemento.Id = generarID(); calles.Add(elemento); if (elemento is Generador) { generadores.Add ((Generador)elemento); soloCalle.Add ((Calle)elemento); } else if (elemento is Calle) soloCalle.Add ((Calle)elemento); }
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 void agregarSeñaletica(Elemento elemento) { //Evita poner una señaletica sobre otra bool espacioDisponible = true; for(int x=0; x<señaleticas.Count && espacioDisponible; x++) { if (((señaleticas [x] is Pare || señaleticas [x] is CedaElPaso || señaleticas [x] is Semaforo || señaleticas [x] is VelocidadMaxima) && (elemento is Pare || elemento is CedaElPaso || elemento is Semaforo || elemento is VelocidadMaxima)) || ((señaleticas [x] is LomoDeToro || señaleticas [x] is PasoDeCebra) && (elemento is LomoDeToro || elemento is PasoDeCebra)) || (señaleticas [x] is Bache && elemento is Bache)) { //Elementos que no pueden estar en la misma posicion dividida en grupos: //Pare //Ceda el paso //Semaforo //Velocidad Maxima // //Lomo de Toro //Paso de Cebra // //Bache if (señaleticas [x].X == elemento.X && señaleticas [x].Y == elemento.Y) espacioDisponible = false; } } if (espacioDisponible) { elemento.Id = generarID (); señaleticas.Add (elemento); if (elemento is Semaforo) { //Busca semaforos cercanos para relacionarlos for (int x = 0; x < semaforos.Count; x++) { if ((semaforos [x].X == elemento.X + 36 || semaforos [x].X == elemento.X - 36 || semaforos [x].X == elemento.X) && (semaforos [x].Y == elemento.Y + 36 || semaforos [x].Y == elemento.Y - 36 || semaforos [x].Y == elemento.Y)) { semaforos [x].Adjunto = (Semaforo)elemento; ((Semaforo)elemento).Adjunto = semaforos [x]; } } semaforos.Add ((Semaforo)elemento); } ordenarSeñaleticas (); } }
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 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 static double angulo2puntos(Elemento v1, Elemento v2) { double xdif = v2.X - v1.X; double ydif = v2.Y - v1.Y; return pasarAGrados(Math.Atan2 (ydif, xdif)); }
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 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 static bool estaSobre(Elemento elemento) { int x1 = (int)elemento.X; int y1 = (int)elemento.Y; int x2 = (int)elemento.X; int y2 = (int)elemento.Y; int xR = Modificar.posX; int yR = Modificar.posY; int carril = 0; if (elemento is Pare) { Pare p = (Pare)elemento; carril = p.Carril; } else if(elemento is CedaElPaso) { CedaElPaso cp = (CedaElPaso)elemento; carril = cp.Carril; } if (elemento.Orientacion == Elemento.SUR && (carril == Elemento.CARRIL1 || carril == Elemento.CARRIL1Y2)) { x1 -= 9; y1 += 4; } else if (elemento.Orientacion == Elemento.ESTE && (carril == Elemento.CARRIL1 || carril == Elemento.CARRIL1Y2)) { x1 += 4; y1 -= 9; } else if (elemento.Orientacion == Elemento.NORTE && (carril == Elemento.CARRIL1 || carril == Elemento.CARRIL1Y2)) { x1 += 27; y1 -= 22; } else if (elemento.Orientacion == Elemento.OESTE && (carril == Elemento.CARRIL1 || carril == Elemento.CARRIL1Y2)) { x1 -= 22; y1 -= 45; } else { x1 = -5000; y1 = -5000; } if (elemento.Orientacion == Elemento.SUR && (carril == Elemento.CARRIL2 || carril == Elemento.CARRIL1Y2)) { x2 -= 45; y2 += 4; } else if (elemento.Orientacion == Elemento.ESTE && (carril == Elemento.CARRIL2 || carril == Elemento.CARRIL1Y2)) { x2 += 4; y2 += 27; } else if (elemento.Orientacion == Elemento.NORTE && (carril == Elemento.CARRIL2 || carril == Elemento.CARRIL1Y2)) { x2 -= 9; y2 -= 22; } else if (elemento.Orientacion == Elemento.OESTE && (carril == Elemento.CARRIL2 || carril == Elemento.CARRIL1Y2)) { x2 -= 22; y2 -= 9; } else { x2 = -5000; y2 = -5000; } if ((xR >= x1 && xR <= x1 + 18 && yR >= y1 && yR <= y1 + 18) || (xR >= x2 && xR <= x2 + 18 && yR >= y2 && yR <= y2 + 18)) { idElementoEliminar = elemento.Id; return true; } if (idElementoEliminar == elemento.Id) idElementoEliminar = -1; return false; }