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