Je veux générer une carte de chaleur sous forme Windows. J'ai un ensemble de points comme entrée. Comment faire de cela de la manière la plus simple? Merci. P>
8 Réponses :
Divisez la surface en une grille de cellules et comptez les points à l'intérieur de chaque cellule. P>
Compte tenu du nombre de points, calculez une couleur pour chaque cellule p>
Voici une méthode simple qui générera une couleur basée sur la position relative d'une valeur comprise entre min et max. Les valeurs plus proches de MIN seront plus vertes, tandis que les valeurs plus proches de Max seront plus rouges.
Pour utiliser cette méthode, générez votre liste de valeurs et calculez les valeurs min et max. Si vous construisez une grille, vous pouvez gérer l'événement Rowdatabound ou quelque chose de similaire et appelez la méthode HeatMap à partir de là. Obtenez une référence à la cellule et réglez la couleur de fond sur la couleur renvoyée par la méthode HeatMap.
public Color HeatMap(decimal value, decimal min, decimal max)
{
decimal val = (value - min) / (max-min);
return new Color
{
A = 255,
R = Convert.ToByte(255 * val),
G = Convert.ToByte(255 * (1-val)),
B = 0
};
}
Curtis, qu'est-ce que votre solution correcte? Le code que j'ai publié est spacieux de manière intentionnelle mais il fonctionne (dans WPF).
Votre code ne construit pas dans une application de formulaire Windows. Les champs Argb sont prêts uniquement. La couleur est une structure et ARGB n'a que des méthodes.
Ceci est une solution pour le code de Sam.
public Color HeatMapColor(decimal value, decimal min, decimal max)
{
decimal val = (value - min) / (max - min);
int r = Convert.ToByte(255 * val);
int g = Convert.ToByte(255 * (1 - val));
int b = 0;
return Color.FromArgb(255,r,g,b);
}
Et comment est-ce exactement différent de La réponse de Sam ?
Sous Windows Forms, le code de Sam ne fonctionne pas. Les champs Argb sont en lecture seule.
Bâtiment sur les réponses déjà ici, cette méthode vous permet de spécifier les couleurs code> code> que vous souhaitez utiliser comme couleurs max et min.
private Color HeatMapColor(double value, double min, double max)
{
Color firstColour = Color.RoyalBlue;
Color secondColour = Color.LightSkyBlue;
// Example: Take the RGB
//135-206-250 // Light Sky Blue
// 65-105-225 // Royal Blue
// 70-101-25 // Delta
int rOffset = Math.Max(firstColour.R, secondColour.R);
int gOffset = Math.Max(firstColour.G, secondColour.G);
int bOffset = Math.Max(firstColour.B, secondColour.B);
int deltaR = Math.Abs(firstColour.R - secondColour.R);
int deltaG = Math.Abs(firstColour.G - secondColour.G);
int deltaB = Math.Abs(firstColour.B - secondColour.B);
double val = (value - min) / (max - min);
int r = rOffset - Convert.ToByte(deltaR * (1 - val));
int g = gOffset - Convert.ToByte(deltaG * (1 - val));
int b = bOffset - Convert.ToByte(deltaB * (1 - val));
return Color.FromArgb(255, r, g, b);
}
Si j'utilise les couleurs suivantes, Couleur FirstColour = Color.Blue; Couleur secondcolour = Color.Yellow; Je viens d'avoir des nuances de gris
une solution passant de rouge au jaune au vert
Cela a bien fonctionné pour moi.
Si vous voulez du rouge au vert via jaune, vous pouvez également utiliser HSL pour obtenir votre chaleur. Les chiffres dans cette instance seront 0 à 60, où 0 = rouge et 60 = vert ( Voir la figure 11 sur Ce lien ).
Pour mettre en œuvre, vous devez utiliser System.Runtime.Interservices et ajoutez les éléments suivants: P>
if (val == 0)
return ColorTranslator.ToHtml(Color.FromArgb(255, 255, 255)); // white
else
{
// 0 = red, 60 = green
int col = 60 - (int)(60 * val / m_iMax);
return ColorTranslator.ToHtml(ColorTranslator.FromWin32(ColorHLSToRGB(col, 120, 240)));
}
La version C # de "Curtis White" S Réponse:
public Color HeatMap(decimal value, decimal min, decimal max)
{
decimal val = (value - min) / (max - min);
int A, B, R, G;
A = 255;
R = Convert.ToByte(255 * val);
B = Convert.ToByte(255 * (1 - val));
G = 0;
return Color.FromArgb(A, R, G, B);
}