Ich versuche, den passendsten Farbnamen abhängig von einem gegebenen Hex-Wert zu erhalten. Zum Beispiel, wenn wir die Hex-Farbe #f00
haben, müssen wir den Farbnamen red
bekommen.Erhalte den nächsten Farbnamen in Abhängigkeit von einer Hex-Farbe
'#ff0000' => 'red'
'#000000' => 'black'
'#ffff00' => 'yellow'
Ich verwende derzeit den levenshtein-Distanz-Algorithmus die nächsten Farbnamen zu bekommen, funktioniert gut, so weit, aber manchmal nicht wie erwartet.
Zum Beispiel:
'#0769ad' => 'chocolate'
'#00aaee' => 'mediumspringgreen'
So irgendwelche Ideen, wie das Ergebnis näher kommen?
Hier ist, was ich machte die nächste Farbe zu erhalten:
Array.closest = (function() {
// http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#JavaScript
function levDist(s, t) {
if (!s.length) return t.length;
if (!t.length) return s.length;
return Math.min(
levDist(s.substring(1), t) + 1,
levDist(t.substring(1), s) + 1,
levDist(s.substring(1), t.substring(1)) + (s[0] !== t[0] ? 1 : 0)
);
}
return function (arr, str) {
// http://stackoverflow.com/q/11919065/1250044#comment16113902_11919065
return arr.sort(function (a, b) {
return levDist(a, str) - levDist(b, str);
});
};
}());
http://jsfiddle.net/ARTsinn/JUZVd/2/
Eine andere Sache ist die Leistung! Es scheint, dass es irgendwo ein wirklich großes Problem gibt, das das wirklich langsam macht (ist es der Algorithmus?).
Für ähnlichere Farben wäre es besser, stattdessen [HSL] (https://en.wikipedia.org/wiki/HSL_and_HSV) Farben zu verwenden. – Sirko
Sie könnten den Sortierschritt um ein Vielfaches beschleunigen, wenn Sie die Abstände vor dem Sortieren vorberechnen würden. – Pointy
Auch ich bin mir nicht sicher, warum Sie nicht eine einfache kartesische Entfernungsberechnung verwenden würden. (Eigentlich würde ich in einen Winkelkoordinatenraum umrechnen und die Entfernung in HSL oder HSV terns machen.) – Pointy