J'essaie d'afficher graphiquement un graphique de n lignes et j'essaie de trouver un moyen d'attribuer de manière dynamique des couleurs distinctes en fonction du nombre de lignes que j'ai. Les valeurs de RVB vont de 0 à 1. Je ne peux pas utiliser de blanc car le fond est blanc. Je l'ai trouvé facile pour N <7:
XXX PRE>Cela me donne noir, bleu, vert, cyan, rouge, magenta, jaune. Mais après cela, il utilisera du blanc puis une boucle. Quelqu'un peut-il savoir un bon moyen d'affecter des valeurs RVB pour un index? J'ai aussi une valeur d'opacité pour jouer avec. P> p>
3 Réponses :
J'ai écrit ce code une fois pour résoudre exactement le problème que vous décrivez (l'arrière-plan était également blanc). C'est la même idée que la vôtre, seulement généralisée. Il devrait être facile de s'adapter d'OCAML à votre langue.
Utilisation forte> p> Vous n'avez pas besoin de dire à la fonction combien de couleurs dont vous aurez besoin. Appelez la fonction avec 1, 2, ... pour obtenir la couleur numéro 1, numéro 2, ... Les couleurs des petits numéros sont larges, les dernières couleurs bien sûr se rapprochent et se rapprochent de l'autre. p> fort> strong> p> lsl code> est "Code logique à gauche",
lsr code> "Logical Shift Droite" et
! code> signifie simplement "accéder à une référence". Les couleurs OCAML RGB sont représentées dans un seul entier, avec un octet par couleur. P>
let number_to_color n =
let color = ref 0 in
let number = ref n in
for i = 0 to 7 do
color := (!color lsl 1) +
(if !number land 1 <> 0 then 1 else 0) +
(if !number land 2 <> 0 then 256 else 0) +
(if !number land 4 <> 0 then 65536 else 0);
number := !number lsr 3
done;
!color
for r from 0 to 255 step (255*3/N): for g from 0 to 255 step (255*3/N): for b from 0 to 255 step (255*3/N): ...
ma méthode préférée pour le faire est de trouver des points Nous représentons la roue de couleur comme une plage de valeurs comprise entre 0 et 360. Ainsi, le Les valeurs que nous utiliserons sont (une saturation plus élevée signifie que la couleur est plus "riche"; une saturation inférieure signifie que la couleur est plus proche de gris. Une légèreté plus élevée signifie que la couleur est "plus brillante"; une légèreté inférieure signifie que la couleur est "plus sombre".) p> MAINTENNE, un calcul simple nous donne les valeurs RVB de chacun de ces couleurs. P> http://fr.wikipedia.org/wiki / Hsl_and_hsv # conversion_from_hsv_to_rgb p> Notez que les équations données peuvent être simplifiées: p> Remarque: Ceci est intentionnellement une implémentation horriblement inefficace. Le point de donner à cet exemple dans Python est essentiellement pour que je puisse donner pseudocode exécutable. P> n code> des points espacés uniformément le long de la roue de couleur.
360 / n * 0 code>,
360 / n * 1 code>, ...,
360 / n * (n - 1) code >. Ce faisant, nous avons défini la Hue em> de chacune de nos couleurs. Nous pouvons décrire chacune de ces couleurs comme des couleurs de la valeur de la hue-saturation (HSV) en réglant saturation à 1 et la légèreté à 1. P>
implémentation pseudo-code-ish en Python h2>
mise en œuvre concise dans python h2>
Après 20 premières couleurs, il devient un peu gaspillé de ne pas profiter des couleurs avec saturation et / ou légèreté différente de 1.
C'est absolument vrai. Il serait préférable de générer un ensemble de couleurs pour S = 1, v = 1, puis peut-être S = 0,5, v = 1, et ainsi de suite. Vraisemblablement, il pourrait y avoir une façon algorithmique de le faire, mais il faudrait faire des chèques pour éviter de générer beaucoup de couleurs presque gris ou quasi noires qui sont difficiles à distinguer.
Si f = (H / 60 - Math.Floor (H / 60)) N'a-t-il pas le sol (H / 60) toujours 0 depuis que H est compris entre 0 et 5? Si cela est vrai F est compris entre 0 et 5/60. Est-ce exact?
Grande prise, Suart - Je voulais écrire "Hue" là-bas. Merci!
Dans la mise en œuvre concise des UniquesColors, l'objet Hues ne devrait pas être un générateur car les autres générateurs consommeront le même itérateur, ce qui ne tire que la moitié des couleurs attendues. Changer la ligne sur Hues = [...] correctement.
Peut-être une bonne exigence pour une réponse est que les couleurs sont de manière optimale aussi loin que possible les unes des autres. (Vous ne voulez pas simplement sélectionner 0x001, 0x002 et 0x003 si vous pouvez faire quelque chose comme 0xf00, 0x0f0 et 0x00f)
Vous n'avez pas vraiment de valeur d'opacité pour jouer avec :) sur fond blanc, 0,0,0 avec une opacité de 50% est identique à 127,127,127 avec une opacité à 100%. En d'autres termes, l'opacité n'est pas indépendante des autres paramètres.