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);
        }