public bool añadirfp(FlightPlan fp) //añade el plan de vuelo dado como parámetro, solo si no estaba ya en la lista { int i = 0; bool found = false; //Si no hay ningún FP en la lista, se puede añadir if (ListFP.Count == 0) { ListFP.Add(fp); } //Si hay algún FP en la lista comprobamos que el que se vaya añadir no esté else { //Recorremos la lista buscando su ID while (i < ListFP.Count && found == false) { if (fp.GetID() == ListFP[i].GetID()) { found = true; } else { i++; } } //Si no lo encontramos, lo añadimos a la lista if (found == false) { ListFP.Add(fp); } } return(found); //found=true: ya estaba en la lista, no lo ha añadido / found=false: no estaba en la lista, lo ha añadido }
public List <double> DadmeDistancias(int pos) //Nos da una lista con distancias entre el vuelo en la posición dada como parámetro y todos los demás vuelos { //Cogemos el plan de vuelo en la posición dada como parámetro FlightPlan fp = ListFP[pos]; //Creamos la lista que nos va a devolver List <double> dist = new List <double>(); //Recorremos la lista int i = 0; while (i < ListFP.Count) { //Mientras no sea el vuelo respecto al que estamos calculando las distancias, calculamos y metemos en la lista if (i != pos) { dist.Add(fp.Distance(ListFP[i])); } i++; } //Devolvemos la lista return(dist); }
public void CargarFichero(string fichero) //lee un fichero con datos de vuelos { StreamReader R = new StreamReader(fichero); //leer fichero string linea = R.ReadLine(); //leer primera línea while (linea != null) { string[] trozos = linea.Split(' '); //partimos la linea por los espacios //leemos los datos string id = trozos[0]; string compañia = trozos[1]; double velocidad = Convert.ToDouble(trozos[2]); double ix = Convert.ToDouble(trozos[3]); double iy = Convert.ToDouble(trozos[4]); double fx = Convert.ToDouble(trozos[7]); double fy = Convert.ToDouble(trozos[8]); //creamos el FP FlightPlan fp = new FlightPlan(id, compañia, velocidad, ix, iy, fx, fy); //asignamos la posicion actual (en el constructor a la posición actual se le asigna la inicial) fp.SetAX(Convert.ToDouble(trozos[5])); fp.SetAY(Convert.ToDouble(trozos[6])); //añadimos el fp a la lista ListFP.Add(fp); linea = R.ReadLine(); } R.Close(); //cerrar fichero }
public void SolucionarConflictos(int dseg, int interval) //soluciona los conflictos (se supone que antes he de comprobar si hay) { int i = 0; int j = 0; while (i < ListFP.Count) { FlightPlan fp1 = ListFP[i]; j = 0; while (j < ListFP.Count && i != j) { FlightPlan fp2 = ListFP[j]; while (fp1.HasArrived() == false && fp2.HasArrived() == false) { if (fp1.Estaenconflicto(fp2, dseg) == -1) { fp1.ChangeSpeedToAvoidConflict(); } fp1.Move(interval); fp2.Move(interval); } fp1.Restart(); fp2.Restart(); j++; } i++; } }
//Constructor copia public FlightPlan(FlightPlan fp) { this.ID = fp.GetID(); this.compañia = fp.GetCompañia(); this.velocidad = fp.GetVelocidad(); this.IX = fp.GetIX(); this.FX = fp.GetFX(); this.AX = fp.GetAX(); this.IY = fp.GetIY(); this.FY = fp.GetFY(); this.AY = fp.GetAY(); this.incrementov = fp.GetIncrementoV(); }
public void GuardarVuelos(string fichero) //escribe fichero con los datos actuales de los vuelos { StreamWriter W = new StreamWriter(fichero); //escribir fichero int i = 0; while (i < ListFP.Count) { FlightPlan f = ListFP[i]; W.WriteLine(f.GetID() + " " + f.GetCompañia() + " " + Convert.ToString(f.GetVelocidad()) + " " + Convert.ToString(f.GetIX()) + " " + Convert.ToString(f.GetIY()) + " " + Convert.ToString(f.GetAX()) + " " + Convert.ToString(f.GetAY()) + " " + Convert.ToString(f.GetFX()) + " " + Convert.ToString(f.GetFY())); i++; } W.Close(); //cerrar fichero }
public int Estaenconflicto(FlightPlan plan, double ds) //dice si hay o no conflicto entre dos vuelos { //calculamos la distancia entre los dos vuelos double distace = this.Distance(plan); //si la distancia entre los dos vuelos es menor a la de seguridad, hay conflicto if (distace <= ds) { return(-1); //hay conflicto } //si la distancia entre los dos vuelos es mayor a la de seguridad, no hay conflicto else { return(0); //no hay conflicto } }
public Boolean Estaranenconflicto(FlightPlan plan, double ds) //dice si habrá, en un futuro, conflicto entre el fp y el fp dado omo parametro { //Parámetros fp clase double Hthis = Math.Sqrt((this.FX - this.AX) * (this.FX - this.AX) + (this.FY - this.AY) * (this.FY - this.AY)); //H: distancia que hay desde donde está hasta su posición final double Cthis = (this.FX - this.AX) / Hthis; //C: coseno double Sthis = (this.FY - this.AY) / Hthis; //S: seno //Parámetros fp plan double Hplan = Math.Sqrt((plan.FX - plan.AX) * (plan.FX - plan.AX) + (plan.FY - plan.AY) * (plan.FY - plan.AY)); //H: distancia que hay desde donde está hasta su posición final double Cplan = (plan.FX - plan.AX) / Hplan; //C: coseno double Splan = (plan.FY - plan.AY) / Hplan; //S: seno double OX = this.GetIX() - plan.GetIX(); double OY = this.GetIY() - plan.GetIY(); double CV = (this.GetVelocidad() * Cthis - plan.GetVelocidad() * Cplan) / 3600; double SV = (this.GetVelocidad() * Sthis - plan.GetVelocidad() * Splan) / 3600; //Definimos el parámetro distancia double distancia; //Caso particular: los dos aviones vuelan en la misma dirección, en el mismo sentido y a la misma velocidad --> la distancia será siempre la misma if (SV == 0 && CV == 0) { distancia = this.Distance(plan); //me da igual en la posición que estén } //Todos los demás casos: //Las fórmulas que usamos las hemos obtenido manualmente optimizando la distancia y con las ecuaciones del movimiento else { //Momento en el que la distancia será mínima double t = -(OY * SV + OX * CV) / (CV * CV + SV * SV); //Distancia mínima distancia = Math.Sqrt((OX + t * CV) * (OX + t * CV) + (OY + t * SV) * (OY + t * SV)); } if (distancia < ds) { return(true); } else { return(false); } }
public Boolean BuscarConflictos(int dseg) //dice si hay conflictos o no (no los soluciona) { int i = 0; int j = 0; bool found = false; while (i < ListFP.Count && found == false) { FlightPlan fp1 = ListFP[i]; while (j < ListFP.Count && i != j && found == false) { FlightPlan fp2 = ListFP[j]; if (fp1.Estaranenconflicto(fp2, dseg) == true) { found = true; } j++; } i++; } return(found); //found=true: hay conflictos ; found=false: no hay conflictos }
public double Distance(FlightPlan plan) //calcula la distancia entre mi avión y la del avión del flightplan dado como parámetro { return(Math.Sqrt((this.AX - plan.AX) * (this.AX - plan.AX) + (this.AY - plan.AY) * (this.AY - plan.AY))); }