public HeatmapState(string player_name, int time_window_secs = 0) { time_window_picosec = time_window_secs * MetaData.SECOND_TO_PICO; this.player_name = player_name; heatmaps = new List <double[, ]> { new double[8, 13], new double[16, 25], new double[32, 50], new double[64, 100] }; sum = 0; seed = new TimeInCell(-1, -1, -1, -1, -1, 0); past_data = new LinkedList <TimeInCell>(); }
public IList <HeatMapData> update(PlayerData pData) { //correct x and y co-ordinates of playerdata. double x = pData.pos_x < 0 ? 0 : pData.pos_x; if (x > MetaData.LEN_X) { x = MetaData.LEN_X; } double y = pData.pos_y + MetaData.Y_OFFSET; if (y < 0) { y = y * -1; } if (y > MetaData.LEN_Y) { y = MetaData.LEN_Y; } int x_index = ((int)Math.Floor(y / (MetaData.LEN_Y / 64))); if (x_index >= 64) { x_index = 63; } int y_index = ((int)Math.Floor(x / (MetaData.LEN_X / 100))); if (y_index >= 100) { y_index = 99; } TimeInCell new_seed = new TimeInCell(pData.ts, seed.curr_index_x, seed.curr_index_y, x_index, y_index, 0); if (new_seed.prev_index_x == -1 && new_seed.prev_index_y == -1) { new_seed.prev_index_x = x_index; new_seed.prev_index_y = y_index; flush_ts = pData.ts; } else { new_seed.time_in_cell = (pData.ts - seed.ts) / MetaData.PICO_TO_MILI; } seed = new_seed; return(updateHeatmaps(new_seed)); }
public IList <HeatMapData> updateHeatmaps(TimeInCell update) { IList <HeatMapData> output_list = new List <HeatMapData>(); //bool toFlush = false; if (time_window_picosec > 0) { while (true) { var item = past_data.First; if (item == null) { break; } if ((update.ts - item.Value.ts) > time_window_picosec) { for (int i = 0; i < 4; i++) { var heatmap = heatmaps[i]; int grid_factor = 1 << (4 - (i + 1)); heatmap[item.Value.prev_index_x / grid_factor, item.Value.prev_index_y / grid_factor] -= item.Value.time_in_cell; } sum -= item.Value.time_in_cell; past_data.RemoveFirst(); } else { break; } } past_data.AddLast(update); } for (int i = 0; i < 4; i++) { var heatmap = heatmaps[i]; int grid_factor = 1 << (4 - (i + 1)); heatmap[update.prev_index_x / grid_factor, update.prev_index_y / grid_factor] += update.time_in_cell; } sum += update.time_in_cell; /*if ((update.ts - flush_ts) > MetaData.SECOND_TO_PICO) * { * toFlush = true; * flush_ts = update.ts; * }*/ //if (toFlush) { for (int i = 0; i < 4; i++) { HeatMapData data = new HeatMapData(i); data.ts = update.ts; data.player_name = player_name; data.sum = sum; data.gridType = i; data.heatmap = (double[, ])heatmaps[i].Clone(); output_list.Add(data); } } return(output_list); }