Je génère des graphiques qui nécessitent une chaîne hexadécimale pour les couleurs.
Exemple:
<dataseries name="ford" color="FF00FF" />
Je les crée dynamiquement, donc je voudrais générer le code hexadécimal pour chaque dataseries de manière aléatoire.
Quelle est la meilleure façon de procéder?
Le moyen le plus simple consiste à utiliser String.Format
et utilisez le format hexadécimal pour l'argument.
var random = new Random();
var color = String.Format("#{0:X6}", random.Next(0x1000000)); // = "#A197B9"
OMI, les couleurs purement aléatoires peuvent ne pas être préférables car vous avez besoin de couleurs qui se distinguent aux yeux des humains.
Que diriez-vous de prérégler un certain nombre de couleurs et de les choisir au hasard?
Peut-être pourriez-vous trouver de meilleures réponses dans certaines bibliothèques de cartographie open source.
La réponse de Samuel est la meilleure façon de le faire, assurez-vous simplement que si vous générez les couleurs à l'intérieur d'une boucle, vous n'instanciez pas à chaque fois un nouvel objet Random
parce que new Random()
graines le générateur à l'aide de l'horloge système. Votre boucle va s'exécuter plus rapidement que l'horloge ne peut le faire, donc vous finirez par générer plusieurs des mêmes couleurs encore et encore parce que random
est semé avec la même valeur.
Ça devrait ressembler a quelque chose comme ca:
int numColors = 10;
var colors = new List<string>();
var random = new Random(); // Make sure this is out of the loop!
for (int i = 0; i < numColors; i++)
{
colors.Add(String.Format("#{0:X6}", random.Next(0x1000000)));
}
au lieu de:
int numColors = 10;
var colors = new List<string>();
for (int i = 0; i < numColors; i++)
{
var random = new Random(); // Don't put this here!
colors.Add(String.Format("#{0:X6}", random.Next(0x1000000)));
}
Un bon moyen de générer un bel ensemble de couleurs est de les définir en utilisant une saturation et une luminosité fixes et de faire varier la teinte.
Cela vous donne un bel ensemble de couleurs, qui semblent toutes provenir du même `` ensemble '' - tout pastel, ou tout intense, ou tout blanc cassé, peu importe. Et il est assez facile de coder si vous avez Color.FromHSV ().
Cela cessera probablement de fonctionner une fois que vous aurez trop de couleurs, elles ne se distingueront pas. Mais vous aurez probablement ce problème de toute façon.
En pseudo code:
Sat = 0.5 * 255 //assuming we want range 0-255...
Brightness = 0.9 * 255
NumberOfColours = 7
HueSeparation = 360 / 7
Colors = []
for (i = 0 ; i< NumberOfColours; i++)
Colors.Add(Color.FromHSV(HueSeparation * i, Sat, Brightness)
ou
n = 7
Colors = [Color.FromHSV(x*360/n, 128, 230) for x in range(n)]
(J'aime les listes de compréhension ...)
Random Rand = new Random(); // specify a seed
int r = Rand.Next(0x1000000);
Console.WriteLine("#{0:X6}", r);
J'ai remarqué que vous (Rahkim) avez commenté sur le post de Greg que vous souhaitiez pouvoir mettre son idée (en gardant la saturation et la valeur constantes, et en variant simplement la teinte ... une bonne idée) dans le code. Vous pouvez! Ou plutôt, quelqu'un a déjà pour vous!
J'ai trouvé cet article de blog sur Conversion de HSV en couleur RVB en utilisant C # , et je suis sûr qu'il y en a plus. Vous vous retrouverez probablement avec une plus belle suite de couleurs de cette façon qu'en les choisissant de manière totalement aléatoire.
De plus, bien sûr, cette méthode facilite l'obtention d'un bel ensemble de couleurs ... puisque la teinte va de 0 à 359, vous pouvez faire quelque chose comme définir votre teinte quelque chose comme ceci:
Hue = (PreviousHue + 50) % 360;
(J'ai choisi 50 car il n'entre pas dans 360 uniformément, donc si vous allez au-delà de 360, vous ne commencerez pas à répéter les teintes instantanément. Vous devrez jouer avec la valeur pour obtenir une séparation idéale en fonction du nombre de couleurs différentes vous attendez.)
De cette façon, vous n'avez pas à vous soucier du cas où le code choisit au hasard deux couleurs qui sont très proches l'une de l'autre lorsqu'il y a encore beaucoup d'espace de "teinte" inutilisé.