Frage

Vielleicht zu viel Kaffee hatte ich habe, vielleicht zu lange ich habe gearbeitet, egal, ich bin ratlos, was diese Methode funktioniert, oder besser gesagt, warum und wie sie es tut, jemand einige vergießen konnte Licht auf mich? Was ist der 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

Danke für die Antworten jeder. Mit Blick auf dem Rahmen des Verfahrens im Rahmen des Programms ist es klar, dass ihre Absicht war in der Tat eine neue Farbe zurückzugeben, die „am weitesten entfernt“ aus der Menge der vorhandenen Farben ist.

Danke Sparr für posieren die Followup auf diese Frage werde, ich die oben mit Ihrem Rat im Auge auf jeden Fall neu schreiben.

Ich bin nicht sehr gut in der RGB-Farbskala versiert. die Absicht des oben genannten Verfahrens zu kennen ist ein abrufen „kostenlos?“ Farbe der vorhandenen Reihe von Farben, wird die Lösung in 1 eigentlich kostenlos sein in dem Sinne, wie wir die Farbe wahrnehmen? Gibt es einen einfacheren Weg, um eine Farbe zu wählen, die den Satz wird Kompliment, oder ist die numerische Analyse der RGB-Komponenten ergeben tatsächlich die passende Farbe?

War es hilfreich?

Lösung

den Fall betrachtet, in dem die pseudo-festen von den Punkten in der Farbtabelle definiert ist, ein großer „hohl“ in seinem Innern, so daß nextColor den Punkt in der Mitte des Hohl als nextColor auswählt. Je nachdem, was Sie wissen um die Farbtabelle, könnte dieser Fall äußerst selten sein. Wenn vorhergesagt wird, selten genug sein, und Sie sind bereit, eine suboptimale zu akzeptieren (vorausgesetzt, wir nextColor die Ausgabe als optimal nehmen) Lösung in diesen Fällen dann eine deutliche Optimierung stellt sich vor.

In allen Fällen mit Ausnahme der oben beschriebenen ein, die Farbe durch nextColor ausgewählt wird auf der Oberfläche des minimalen Rumpfes irgendwo konvex alle Punkte in 1/64-dichten Farbraum durch Loops definiert umschließt. Erzeugen die Liste von Punkten auf dieser Oberfläche ist etwas rechnerisch komplex als die einfachen Schleifen, die die Liste aller Punkte zu erzeugen, aber es würde etwa um einen Faktor von 25 Ihren Suchraum reduzieren.

In der überwiegenden Mehrzahl der Fälle das Ergebnis dieser vereinfachten Suche wird ein Punkt auf einem der Ecken des konvexen Hülle sein. In Anbetracht reduziert nur die Ihren Suchraum zu einer trivialen Liste (24 Kandidaten, wenn meine geistige Geometrie dient mich gut), die einfach vor der Zeit gespeichert werden.

Wenn die nextColor aus denjenigen ausgewählt ist „zu nahe“ Ihre Farbtabelle, dann könnte man die ursprüngliche Art zurückgreifen, in der Hoffnung auf Suche läuft von der Art „hohl“ zu finden, oben erwähnt. Die Dichte dieser Suche kann der erste Durchgang bekam auf, wie nah angepasst werden und von dort herunter verengt. Das heißt, wenn die super schnelle Suche ein nextColor 8 Einheiten findet weg von seinem nächsten Nachbarn in Farbtabelle, dann als besser zu machen, dass man eine hohle mindestens 16 Einheiten im ganzen innerhalb der Farbtabelle finden müßte. Führen Sie die ursprüngliche Such mit einem Schritt von 8 und speichert alle Kandidaten mehr als 4 Einheiten ferne (die Höhle ist nicht wahrscheinlich, mit dem Suchraster ausgerichtet werden), dann Mitte eine Radius-12 der Suche nach höherer Dichte auf jedem dieses Kandidaten.

Es kommt zu mir, dass die 1/64-dichten Natur (alle Vielfachen von 4) Ihrem Suchraum wahrscheinlich von dem ursprünglichen Autor zum Zweck der Beschleunigung der Suche in erster Linie eingeführt wurde. In Anbetracht dieser Verbesserungen, tun Sie mit diesem Kompromiss entfernt.

All dies setzt voraus, dass Sie mit Verbesserungen an dieser naiven Methode haften mögen eine Kontrastfarbe zu finden. Es gibt sicherlich bessere Möglichkeiten, da gleich oder mehr (die Farben in Farbtabelle sind die am häufigsten in Ihrer Nutzung? Welche Farben erscheinen kontrast y für das menschliche Auge?) Informationen.

Andere Tipps

Es scheint, wie Sie Farbtabelle haben, die eine Liste von Farben zu speichern.

Dann haben Sie diese seltsam fest codierten Farbraum von

  

Farben, die Komponente, die eine sind   Vielfaches von 4 und sind „nicht zu hell“   aber nicht „zu dunkel entweder“.

Diese Funktion scheint, dass Ihnen die Farbe in den letzteren zu geben, die die am besten mit Ihrer Farbtabelle „Kontrast“.

Wenn ich dagegen sagen, ist dies definiert durch die Farbe wählen, die so weit wie möglich von der Farbtabelle ist mit der 2-Norm.

ein globales Array von Farbobjekten Bei Farbtabelle genannt, wird diese Funktion die Farbe aus dem folgenden Farbraum finden, der in der Nähe * zu jedem in diesem Array ist, und dann wird die eine dieser Farben, die waren am weitesten entfernt:

Rot, Grün, Blau-Komponenten ein Vielfaches von 4 Rot + Grün + Blau zwischen 256 und 512

*:. „Am nächsten“ als die niedrigste Summe der Quadrate der Differenz für jede Farbkomponente definiert ist

Wie Paulus bestimmte, scheint dies wie eine plausible, wenn irrsinnig ineffektiv umgesetzt, naiven Ansatz eine einzige Farbe zu finden, die einen hohen Kontrast mit dem Inhalt der Farbtabelle zur Verfügung stellt. Das gleiche Ergebnis könnte mit einem einzigen Durchlauf durch Farbtabelle und ein bisschen mehr Mathe, statt rund 5 Millionen Pässe durch Farbtabelle, und es gibt viele besseren Möglichkeiten, eine andere Farbe zu finden, die auf einen viel höheren durchschnittlichen Kontrast.

Es wird versucht, Sie eine andere Farbe für

zu bekommen

a) Falschfarben einen Datensatz Codierung.

b) zeichnet eine andere Linie auf der Grafik.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top