Domanda

Forse ho avuto troppo caffè, forse ho lavorato troppo a lungo, a prescindere, io sono ad una perdita quanto a ciò che questo metodo non ha, o meglio, perché e come lo fa, si poteva gettare un po ' luce su di me? Qual è il nextColor?

public Color nextColor() {
   int max = 0, min = 1000000000, cr = 0, cg = 0, cb = 0;
   for (int r = 0; r < 256; r += 4) {
      for (int g = 0; g < 256; g += 4) {
         for (int b = 0; b < 256; b += 4) {
            if (r + g + b < 256 || r + g + b > 512) {
               continue;
            }
            min = 1000000000;
            for (Color c : colorTable) {
               int dred   = r - c.getRed();
               int dgreen = g - c.getGreen();
               int dblue  = b - c.getBlue();
               int dif = dred * dred + dgreen * dgreen + dblue * dblue;
               if (min > dif) {
                  min = dif;
               }
            }
            if (max < min) {
               max = min;
               cr  = r;
               cg  = g;
               cb  = b;
            }
         }
      }
   }

   return new Color(cr, cg, cb, 0x90);
}

UPDATE

Grazie per le risposte a tutti. Guardando il contesto del metodo all'interno del programma, è chiaro che il loro intento era infatti quello di restituire un nuovo colore che è "più lontano" dal set di colori esistenti.

Grazie Sparr per porre il follow a questa domanda, mi sarà sicuramente riscrivere il sopra con il vostro consiglio in mente.

Non sto molto bene addentro nella scala di colore RGB. Conoscendo l'intenzione del metodo di cui sopra è quello di recuperare un "omaggio?" colore al set di colori già esistenti, sarà la soluzione fornita in 1 in realtà essere gratuita, nel senso di come percepiamo il colore? C'è un modo più semplice per scegliere un colore che complimentarmi con il set, o se l'analisi numerica delle componenti RGB in realtà cede il colore appropriato?

È stato utile?

Soluzione

Si consideri il caso in cui la pseudo-solido definito dai punti nella colorTable ha una grande "vuoto" al suo interno, in modo tale che nextColor seleziona il punto al centro di tale cava come nextColor. A seconda di ciò che si sa circa la colorTable, questo caso potrebbe essere estremamente rari. Se si prevede di essere abbastanza rari, e si è disposti ad accettare una non ottimale (supponendo che prendiamo l'uscita di nextColor essere ottimale) soluzione in questi casi, quindi una significativa ottimizzazione si presenta.

In tutti i casi, eccetto il sopra descritto uno, il colore selezionato da nextColor sarà da qualche parte sulla superficie convesso minimo che racchiude tutti i punti nel colorspace 1/64-denso definito da loop. Generare l'elenco dei punti su quella superficie è leggermente più complessa di quanto computazionalmente semplici loop che generano l'elenco di tutti i punti, ma sarebbe ridurre il vostro spazio di ricerca di circa un fattore di 25.

Nella stragrande maggioranza dei casi, il risultato di tale ricerca semplificata sarà un punto su uno degli angoli di quel convesso. Considerando solo quelli riduce lo spazio di ricerca per un elenco banale (24 candidati, se la mia geometria mentale mi serve bene), che potrebbe semplicemente essere memorizzato prima del tempo.

Se il nextColor selezionati tra quelli è "troppo vicino" al tuo colorTable, allora si potrebbe ripiegare sulla gestione del tipo originale di ricerca nella speranza di trovare una sorta di "vuoto" di cui sopra. La densità di questa ricerca potrebbe essere adattato in base a quanto vicino al primo passaggio ottenuto, e limitato giù da lì. Cioè, se la ricerca super veloce trova un nextColor 8 unità di distanza dal suo vicino più prossimo a colorTable, poi a fare meglio di che si dovrebbe trovare un cavo di almeno 16 unità in tutto all'interno del colorTable. Eseguire la ricerca originale con un passo di 8 e memorizzare eventuali candidati più di 4 unità a distanza (il cavo non è probabile che sia in linea con la vostra griglia di ricerca), quindi centrare un raggio-12 alla ricerca di maggiore densità su ciascuno di tali candidati.

Mi viene da pensare che la natura 1/64-denso (tutti i multipli di 4) del vostro spazio di ricerca è stato probabilmente istituito dall'autore originale allo scopo di accelerare la ricerca in primo luogo. Alla luce di questi miglioramenti, si fa via con tale compromesso.

Tutto questo presume che si vuole attaccare con miglioramenti su questo metodo ingenuo di trovare un colore contrastante. Ci sono certamente modi migliori, dato uguale o superiore (quali colori in colorTable sono i più diffusi nel vostro uso? Quali colori appaiono più contrasto-y per l'occhio umano?) Informazioni.

Altri suggerimenti

Sembra che avete ColorTable che è una memorizzazione di un elenco di colori.

Quindi si dispone di questo spazio colore stranamente hardcoded di

  

I colori che hanno componenti che sono un   multiplo di 4 e sono "non troppo brillante"   ma non "troppo scuro o".

Questa funzione sembra essere dando il colore in quest'ultimo, che "contrasta" il meglio con la vostra tabella dei colori.

Quando dico contrario, questo è definito scegliendo il colore che è il più lontano possibile dalla tabella dei colori utilizzando il 2-norma.

Dato un allineamento globale di oggetti di colore di nome colorTable, questa funzione sarà trovare il colore dal seguente spazio colore che è il * più vicino a ciascuno di tale array, e quindi l'uno di quei colori che era più lontano:

Rosso, Verde, Blu componenti un multiplo di 4 Rosso + verde + blu tra 256 e 512

*:. "Più vicina" è definito come la somma più bassa dei quadrati delle differenze per ogni componente di colore

Come determinato Paul, questa sembra una plausibile, se follemente inefficiente attuata, approccio naive a trovare un singolo colore che fornisce un elevato contrasto con il contenuto di colorTable. Lo stesso risultato è stato trovato con un solo passaggio attraverso colorTable e un po 'più matematica, invece di circa 5 milioni di passaggi attraverso colorTable, e ci sono modi molto migliori per trovare un colore diverso che fornisce un contrasto media molto più elevata.

Si sta cercando di ottenere un altro colore per

a) falsi colori codifica un insieme di dati.

b) elaborare un'altra linea sul grafico.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top