Si n = 100; Hvordan genererer jeg 100 visuelt forskjellige farger? Er dette matematisk mulig?
Hvordan å generere n forskjellige farger for ethvert naturlig tall n?
Du ønsker å konvertere til HSL og iterere gjennom verdiene i hue (H) mens de andre 2 verdier konstant.
For hver verdi du konvertere fra HSL tilbake til RGB .
Hvis N er svært store og derfor fargene er ikke visuelt tydelig du kan på det tidspunktet re-iterere over alle de samme fargetoner og endre de andre komponentene å variere metning eller lysstyrke. Så i utgangspunktet du kan ha en maks antall hue verdier å bruke, og når det er truffet du kan starte på nytt med en annen metning eller lysstyrke.
100 er mye farger, men du kan være i stand til å gjøre det ved å fordele dem så tynt som mulig i HSB eller HSL plass; gjør det i RGB er nok vanskelig.
For eksempel kan du velge å bruke 10 forskjellige farger, 4 forskjellige metningsnivåer, og 3 forskjellige innstillinger for lysstyrke, som vil gi deg opp til 120 farger. Du må plukke metning og lysstyrkeverdier nøye; menneskelige øyne er kompliserte og forvirrende sensorer. Hvis du behandler fargerommet som en kjegle, vil du sannsynligvis ha en annen rekke fargetoner i hver lyshet / metningsnivået.
Her er en link til wikipedia oppføring på HSB .
Redigere:
Jeg har ikke noen kompetanse på dette området og mine matematiske ferdigheter er ganske gjennomsnittlig. Men jeg har den oppfatning at løsningen på dette problemet er mer kompleks og interessant enn mange svar her foreslår, siden jeg prøvde å gjøre noe lignende nylig, og fant ikke en løsning.
farge~~POS=TRUNC
Oppfatningen av farge er selvfølgelig subjektivt, men det er betydelig enighet mellom mennesker. For eksempel kan vi alle enige om at rødt, grønt og blått er svært forskjellige farger, og selv fargeblinde mennesker er enige om at svart og hvitt er svært forskjellige.
RGB
Den vanligste representasjon av farge i datasystemer er vektoren (r, g, b) som foreslår en enkel avstand funksjon som

Lar angir området for r , g og b til [0, 1] og se hvordan dette:
- Red (1, 0, 0) og rød (1, 0, 0) har en avstand på 0 , noe som burde være opplagt
- Rød (1, 0, 0) og gul (1, 1, 0) har en avstand på 1 , som er mindre enn avstanden
- Rød (1, 0, 0) og blå (0, 0, 1) som er sqrt (2) , som er plausibelt
Så langt så bra. Problemet er imidlertid at blått og rødt har samme avstand 1 fra svart (0, 0, 0) , men når du ser på bildet dette ser ikke ut til å holde til stede:

Også gul (1, 1, 0) og magenta (1, 0, 1) begge har den samme avstand 1 fra hvite (1, 1, 1) , som ikke synes å være fornuftig enten:

HSL og HSV
Jeg tror det er trygt å anta at analoge beregninger for HSL og HSV fargevalg har de samme problemene. Disse fargevalg er ikke designet for å sammenligne fargen.
CIEDE2000
Heldigvis er det forskere allerede prøver å finne en god måte å sammenligne farger. De kom opp med noen forseggjort metoder, senest ett vesen CIEDE2000

(den fullstendige formelen som er beskrevet i artikkelen er stor )
Denne beregningen tar menneskelig persepsjon i betraktning, som det faktum at vi ser ut til å være ute av stand til å skjelne nyanser av blått veldig godt. Så jeg vil si at vi bruker dette som vårt fargeforskjell funksjon.
The Color Plukke algoritme
naive løsning
Noen svar foreslo følgende algoritme
colors = []
for n in range(n):
success=False
while not success:
new_color = random_color()
for color in colors:
if distance(color, new_color)>far_enough:
colors.append(new_color)
success = True
break
Denne algoritmen har noen problemer:
Avstanden mellom fargene er ikke optimal. Hvis vi tenker oss at fargene skal være som tall på en linje, ville tre tall optimalt fordelt slik:
| A ----- b ----- c |
Pakking ytterligere ett nummer i det uten å flytte a, b, og c er klart dårligere enn omstilling alle fargene.
Algoritmen er ikke garantert å avslutte . Hva om det ikke er noen farge som er langt nok danne de eksisterende fargene i listen? Sløyfen vil fortsette for alltid
riktig løsning
Vel .. Jeg har ikke en.
Ikke et svar på spørsmålet ditt, men hvis n har en maksimal verdi og søknaden din tillater det, kan du bruke en forhåndsdefinert liste over farger som dette:
http://en.wikipedia.org/wiki/List_of_colors
En fordel er at du kan vise et menneskelig lesbart fargenavn i et verktøytips for folk med fargeblindhet.
For det første må du ikke bruke RGB plass; det er vanskelig å finne en verre fargerom for dette problemet. (Avhengig av om du bruker farger for visning eller for utskrifts du enten har et stort antall utvisket farger nærheten svart eller i nærheten av hvitt.)
Hvis du bruker Lab plass, er det perseptuelle fargemodeller (CIE 1996? Og CIE 2000) for å måle visuell nærhet av farger (for print og skjerm henholdsvis).
Du trenger ikke si om du kommer til å beregne farger en gang og lagre resultatet, eller om de trenger å bli omregnet på fly (og i så fall om det har å være deterministisk eller ikke). Tydeligvis noen diskusjon om hvordan best å generere settet vil avhenge av det.
Selv om jeg vil foreslå at jevnt å dele aksene for fargerommet (si til 8), og ved hjelp av de som utgangspunkter ville være mye mer effektiv enn en hvilken som helst tilfeldig prosess. Gjerne trenger du bare å sammenligne et punkt til sine naboer (og bare hvis de allerede er i settet), noe som vil spare deg for et stort antall sammenligninger.
Yeah. Definere tydelig er et produkt av utsette til et fargerom så når vi sier maksimalt forskjellige farger hva vi mener å si er farger som er så langt fra alle de andre fargene som mulig. Men siden fargerommet endrer ikke svaret ikke kommer til å endre seg. Og implementere noe som passer bedre med menneskelige øyne og hvordan menneskelige øyne se farger som CIE-lab de2000 farge avstanden gjør gjøre om alle beregningene hardt, men gjør en statisk liste lett. Her er 128 oppføringer.
private static final String[] indexcolors = new String[]{
"#000000", "#FFFF00", "#1CE6FF", "#FF34FF", "#FF4A46", "#008941", "#006FA6", "#A30059",
"#FFDBE5", "#7A4900", "#0000A6", "#63FFAC", "#B79762", "#004D43", "#8FB0FF", "#997D87",
"#5A0007", "#809693", "#FEFFE6", "#1B4400", "#4FC601", "#3B5DFF", "#4A3B53", "#FF2F80",
"#61615A", "#BA0900", "#6B7900", "#00C2A0", "#FFAA92", "#FF90C9", "#B903AA", "#D16100",
"#DDEFFF", "#000035", "#7B4F4B", "#A1C299", "#300018", "#0AA6D8", "#013349", "#00846F",
"#372101", "#FFB500", "#C2FFED", "#A079BF", "#CC0744", "#C0B9B2", "#C2FF99", "#001E09",
"#00489C", "#6F0062", "#0CBD66", "#EEC3FF", "#456D75", "#B77B68", "#7A87A1", "#788D66",
"#885578", "#FAD09F", "#FF8A9A", "#D157A0", "#BEC459", "#456648", "#0086ED", "#886F4C",
"#34362D", "#B4A8BD", "#00A6AA", "#452C2C", "#636375", "#A3C8C9", "#FF913F", "#938A81",
"#575329", "#00FECF", "#B05B6F", "#8CD0FF", "#3B9700", "#04F757", "#C8A1A1", "#1E6E00",
"#7900D7", "#A77500", "#6367A9", "#A05837", "#6B002C", "#772600", "#D790FF", "#9B9700",
"#549E79", "#FFF69F", "#201625", "#72418F", "#BC23FF", "#99ADC0", "#3A2465", "#922329",
"#5B4534", "#FDE8DC", "#404E55", "#0089A3", "#CB7E98", "#A4E804", "#324E72", "#6A3A4C",
"#83AB58", "#001C1E", "#D1F7CE", "#004B28", "#C8D0F6", "#A3A489", "#806C66", "#222800",
"#BF5650", "#E83000", "#66796D", "#DA007C", "#FF1A59", "#8ADBB4", "#1E0200", "#5B4E51",
"#C895C5", "#320033", "#FF6832", "#66E1D3", "#CFCDAC", "#D0AC94", "#7ED379", "#012C58"
};
Her er den første 256 som et bilde.

(Fra venstre til høyre) (topp-til-bunn). Du kan være i stand til å få noen flere forskjellige farger hvis du sørget for hver farge var så like langt som mulig innenfor fargerom. Det oppslagstabell plukker hver ekstra farge som maksimalt forskjellig fra alle tidligere farger i stedet for å utpeke N i starten og deretter kartlegge fargerom. Så ja, brute force og et høyt nivå farge dsitance algoritme og du er klar til å gjøre det samme sett med farger selv. I løpet av en dag eller så.













