//metodo que asigna el Tiempo de Cruce de Meta cuando solo hay una lectura de un participante private void estimaTCM2(Resultado r) { Lectura lec = r.aLec[0]; if (lRes.Count >= 2) { double vel=this.obtenVelMasCercano(r); vel=(vel<=0)?2.00:vel; r.tc_meta = (lec.tiempo + lec.a_dist /vel ); } else { r.tc_meta = (lec.tiempo + lec.a_dist / 2); //el 2 es velocidad tipica : 2m/s } // r.tc_meta_local = r.tc_meta + r.tiempo_ini_local + r.milis_ini_local / 1000; r.tc_meta_local = r.tc_meta; this.trabajo_rea++; }
//método que estima tiempo cruce de meta (promedio de todos los tiempos, con buen orden y sin nodos desordenados) private void estimaTCM(Resultado r) { int numlec = r.aLec.Count - 1; int numlec_efe = 0; double res = 0; for (int i = 0; i < numlec; i++) { Lectura leci = r.aLec[i]; if (leci.bdatoc == true) { Lectura lecj = r.aLec[i + 1]; if (lecj.bdatoc == true && lecj.a_dist != leci.a_dist) { res += lecj.tms + Math.Abs((lecj.tms - leci.tms) * lecj.a_dist / (lecj.a_dist - leci.a_dist)); numlec_efe++; } } } if (numlec_efe > 0) { r.tc_meta = res / numlec_efe; } else { r.tc_meta = 0; } r.tc_meta_local = r.tc_meta + r.tiempo_ini_local + r.milis_ini_local / 1000; this.trabajo_rea++; }
//metodo que calcula todos los tiempos involucrados y los prepara para su insercion private void calculoTiemposFinales(Resultado r) { r.dt_ini = GResultados.UnixTimeStampToDateTime(r.tiempo_ini_local); r.dt_fin = GResultados.UnixTimeStampToDateTime(Math.Truncate(r.tc_meta_local)); r.ts_ini = (r.tiempo_ini_local + (double)r.milis_ini_local / 1000.00); r.sfecha_hora_ini = r.dt_ini.ToString("yyyy-MM-dd HH:mm:ss") + "." + Math.Round(r.milis_ini_local / 10.0, 0); r.milis_fin = (int)Math.Truncate((r.tc_meta_local - Math.Truncate(r.tc_meta_local)) * 1000); r.sfecha_hora_fin = r.dt_fin.ToString("yyyy-MM-dd HH:mm:ss") + "." + Math.Round(r.milis_fin / 10.0, 0); r.stiempo = GResultados.ConvierteUTS2String(r.tc_meta_local - r.ts_ini); }
//método que obtiene a los participantes de cada salida distintos, //que previamente poseen un registro en la BD public int obtenParDistxOleada() { this.trabajo_accion = "Obtenemos participantes"; lRes = new List<Resultado>(); string sql = "SELECT DISTINCT participante.id,participante.categoria,participante.id_tag,UNIX_TIMESTAMP(fecha_hora_ini_local) as tiempo_ini_local,milis_ini_local,oleadacat.oleada,participante.numero,participante.nombre FROM tags,participante,oleadacat,salida WHERE salida.oleada=oleadacat.oleada AND oleadacat.categoria=participante.categoria AND participante.id_tag=tags.id_tag "; MySqlCommand cmd = new MySqlCommand(sql, dbConn); MySqlDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { Resultado res = new Resultado(); res.id_participante = System.Convert.ToInt32(rdr.GetString(0)); res.categoria = rdr.GetString(1); res.id_tag = rdr.GetString(2); res.tiempo_ini_local = System.Convert.ToInt64(rdr.GetString(3)); res.milis_ini_local = System.Convert.ToInt16(rdr.GetString(4)); res.oleada = rdr.GetString(5); res.snumero = rdr.GetString(6); res.nombre = rdr.GetString(7); res.aLec = new List<Lectura>(); lRes.Add(res); this.trabajo_rea++; } rdr.Close(); this.trabajo_tot = this.trabajo_tot_factor * lRes.Count; return lRes.Count; }
//metodo que obtiene la velocidad promedio del participante mas cercano en la misma categoria private double obtenVelMasCercano(Resultado r) { double vel = 0; double dist = -1; double[] res; for (int i = 0; i < lRes.Count; i++) { Resultado rb = lRes[i]; if (rb.categoria.Equals(r.categoria) && rb.cantidad_aLec > 1 && !rb.Equals(r)) { res = this.obtenDgV(rb.aLec, r.aLec[0]); if (dist == -1) { dist = res[0]; vel = res[1]; } else if (dist > res[0]) { dist = res[0]; vel = res[1]; } } } return vel; }