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;
		}
예제 #10
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;
		}