//método que obtiene las lecturas cronologicas de cada competidor public void obtenLecturasPar() { foreach (Resultado r in lRes) { string sql = "SELECT rssi,UNIX_TIMESTAMP(fecha_hora) as tiempo,milis,UNIX_TIMESTAMP(fecha_hora_ini_local) as tiempo_ini_local,milis_ini_local FROM tags,participante,salida,oleadacat WHERE salida.oleada=oleadacat.oleada AND oleadacat.categoria=participante.categoria AND participante.id_tag=tags.id_tag AND participante.id=" + r.id_participante + " ORDER BY fecha_hora,milis"; MySqlCommand cmd = new MySqlCommand(sql, dbConn); MySqlDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { Lectura auxlec = new Lectura(); auxlec.rssi = System.Convert.ToDouble(rdr.GetString(0)); auxlec.tiempo = System.Convert.ToInt64(rdr.GetString(1)); auxlec.milis = System.Convert.ToInt32(rdr.GetString(2)); //tiempo origen de la antena double dtori = System.Convert.ToInt64(rdr.GetString(3)) + (System.Convert.ToInt32(rdr.GetString(4)) / 1000.00); //tiempo en segundos incluyendo los milisegundos relativo al momento de inicio de la antena auxlec.tms = auxlec.tiempo + (auxlec.milis / 1000.00) - dtori; //estimación de la distancia por la intensidad de la señal de respuesta if (this.bcomp) { auxlec.d_dist = estimaDistCA(auxlec.rssi); } else { auxlec.d_dist = estimaDist(auxlec.rssi); } // se calcula la distancia horizontal a la meta auxlec.a_dist = Math.Sqrt(auxlec.d_dist * auxlec.d_dist - h * h); r.aLec.Add(auxlec); } rdr.Close(); // MessageBox.Show(r.id_participante + " " + r.aLec.Count); //this.CalculaMax(); this.trabajo_rea++; } }
//método que obtiene la minima distancia generalizada entre un Listado de lecturas y una lectura private double[] obtenDgV(List<Lectura> alec, Lectura lec) { double[] res = new double[2]; res[0] = this.obtenDg(alec[0], lec); double daux = res[0]; for (int i = 0; i < alec.Count; i++) { daux = this.obtenDg(alec[i], lec); if (daux < res[0]) { res[0] = daux; if (i >= 1) { if (this.obtenDg(alec[i - 1], lec) < this.obtenDg(alec[i + 1], lec)) { res[1] = this.obtenVel(alec[i - 1], alec[i]); } else { if (i < alec.Count - 1) { res[1] = this.obtenVel(alec[i + 1], alec[i]); } else { res[1] = this.obtenVel(alec[i - 1], alec[i]); } } } else { res[1] = this.obtenVel(alec[i + 1], alec[i]); } } } return res; }
//metodo que calcula la velocidad promedio del intervalo entre 2 lecturas private double obtenVel(Lectura lref1, Lectura lref2) { return Math.Abs((lref1.a_dist - lref2.a_dist) / (lref1.tiempo - lref2.tiempo)); }
//metodo que calcula la Distancia genralizada entre 2 lecturas private double obtenDg(Lectura lref1, Lectura lref2) { // return Math.Pow(lref1.d_dist - lref2.d_dist, 2) +Math.Pow(lref1.tiempo - lref2.tiempo, 2); return Math.Pow(lref1.d_dist - lref2.d_dist, 2); }