Example #1
0
        private void OnTimerTick(object sender, EventArgs e)
        {
            for (; m_HeatZones.Count < 50;)
            {
                int x = 0;
                int y = 0;
                switch (m_Rand.Next(4))
                {
                case 0:
                    // left
                    x = -(int)m_MaxTemperature / 2 + 1;
                    y = m_Rand.Next(m_SizeY);
                    break;

                case 1:
                    // top
                    x = m_Rand.Next(m_SizeX);
                    y = -(int)m_MaxTemperature / 2 + 1;
                    break;

                case 2:
                    // right
                    x = m_SizeX - (int)m_MaxTemperature / 2 - 1;
                    y = m_Rand.Next(m_SizeY);
                    break;

                case 3:
                    // bottom
                    x = m_Rand.Next(m_SizeX);
                    y = +(int)m_MaxTemperature / 2 - 1;
                    break;
                }

                // if no more heat zones -> create new ones
                NHeatZone heatZone = new NHeatZone(x, y, m_MaxTemperature);

                do
                {
                    heatZone.m_DX = m_Rand.Next(4) - 2;
                    heatZone.m_DY = m_Rand.Next(4) - 2;
                }while (heatZone.m_DX == 0 && heatZone.m_DY == 0);

                m_HeatZones.Add(heatZone);
            }

            // gets the values
            m_HeatMap.Data.SetValues(double.NaN);
            double[] values = m_HeatMap.Data.Values;

            for (int i = m_HeatZones.Count - 1; i >= 0; i--)
            {
                NHeatZone heatZone = m_HeatZones[i];

                int radius = heatZone.m_Radius;

                // move the heat zone
                heatZone.m_X += heatZone.m_DX;
                heatZone.m_Y += heatZone.m_DY;

                bool removeZone = false;

                if (heatZone.m_X < -radius)
                {
                    removeZone = true;
                }
                else if (heatZone.m_X >= m_SizeX + radius)
                {
                    removeZone = true;
                }

                if (heatZone.m_Y < -radius)
                {
                    removeZone = true;
                }
                else if (heatZone.m_Y >= m_SizeX + radius)
                {
                    removeZone = true;
                }

                if (removeZone)
                {
                    m_HeatZones.RemoveAt(i);
                    continue;
                }

                int centerX = heatZone.m_X;
                int centerY = heatZone.m_Y;

                int startX = Math.Max(0, centerX - radius);
                int startY = Math.Max(0, centerY - radius);

                int endX = Math.Min(m_SizeX - 1, centerX + radius);
                int endY = Math.Min(m_SizeY - 1, centerY + radius);

                for (int x = startX; x <= endX; x++)
                {
                    for (int y = startY; y <= endY; y++)
                    {
                        double value = heatZone.m_Temperature - 2 * Math.Sqrt(Math.Pow(x - centerX, 2) + Math.Pow(y - centerY, 2));
                        if (value >= 0)
                        {
                            int    index    = y * m_SizeX + x;
                            double curValue = values[index];

                            if (double.IsNaN(curValue))
                            {
                                values[index] = value;
                            }
                            else
                            {
                                curValue += value;

                                if (curValue > m_MaxTemperature)
                                {
                                    curValue = m_MaxTemperature;
                                }

                                values[index] = curValue;
                            }
                        }
                    }
                }
            }

            m_HeatMap.Data.OnDataChanged();

            nChartControl1.Refresh();
        }
        private void CreateDymmyData(NHeatMapSeries heatMap)
        {
            Random           rand           = new Random();
            List <NHeatZone> heatZones      = new List <NHeatZone>();
            double           maxTemperature = 70;

            while (heatZones.Count < 50)
            {
                int x = 0;
                int y = 0;
                switch (rand.Next(4))
                {
                case 0:
                    // left
                    x = -(int)maxTemperature / 2 + 1;
                    y = rand.Next(m_SizeY);
                    break;

                case 1:
                    // top
                    x = rand.Next(m_SizeX);
                    y = -(int)maxTemperature / 2 + 1;
                    break;

                case 2:
                    // right
                    x = m_SizeX - (int)maxTemperature / 2 - 1;
                    y = rand.Next(m_SizeY);
                    break;

                case 3:
                    // bottom
                    x = rand.Next(m_SizeX);
                    y = +(int)maxTemperature / 2 - 1;
                    break;
                }

                // if no more heat zones -> create new ones
                NHeatZone heatZone = new NHeatZone(x, y, maxTemperature);

                do
                {
                    heatZone.m_DX = rand.Next(4) - 2;
                    heatZone.m_DY = rand.Next(4) - 2;
                }while (heatZone.m_DX == 0 && heatZone.m_DY == 0);

                heatZones.Add(heatZone);
            }

            // gets the values
            heatMap.Data.SetValues(double.NaN);
            double[] values = heatMap.Data.Values;

            for (int i = heatZones.Count - 1; i >= 0; i--)
            {
                NHeatZone heatZone = heatZones[i];

                int radius = heatZone.m_Radius;

                // move the heat zone
                heatZone.m_X += heatZone.m_DX;
                heatZone.m_Y += heatZone.m_DY;

                bool removeZone = false;

                if (heatZone.m_X < -radius)
                {
                    removeZone = true;
                }
                else if (heatZone.m_X >= m_SizeX + radius)
                {
                    removeZone = true;
                }

                if (heatZone.m_Y < -radius)
                {
                    removeZone = true;
                }
                else if (heatZone.m_Y >= m_SizeX + radius)
                {
                    removeZone = true;
                }

                if (removeZone)
                {
                    heatZones.RemoveAt(i);
                }
                else
                {
                    int centerX = heatZone.m_X;
                    int centerY = heatZone.m_Y;

                    int startX = Math.Max(0, centerX - radius);
                    int startY = Math.Max(0, centerY - radius);

                    int endX = Math.Min(m_SizeX - 1, centerX + radius);
                    int endY = Math.Min(m_SizeY - 1, centerY + radius);

                    for (int x = startX; x <= endX; x++)
                    {
                        for (int y = startY; y <= endY; y++)
                        {
                            double value = heatZone.m_Temperature - 2 * Math.Sqrt(Math.Pow(x - centerX, 2) + Math.Pow(y - centerY, 2));

                            if (value >= 0)
                            {
                                int    index    = y * m_SizeX + x;
                                double curValue = values[index];

                                if (double.IsNaN(curValue))
                                {
                                    values[index] = value;
                                }
                                else
                                {
                                    curValue += value;

                                    if (curValue > maxTemperature)
                                    {
                                        curValue = maxTemperature;
                                    }

                                    values[index] = curValue;
                                }
                            }
                        }
                    }
                }
            }

            heatMap.Data.OnDataChanged();
        }