Einen RGB-Farbverlauf (Schwarz-Rot-Gold) in JS/TS programmieren?
-
@Th69 sagte in Einen RGB-Farbverlauf (Schwarz-Rot-Gold) in JS/TS programmieren?:
Hier mein Code dazu: myCompiler
Mit dem Ergebnis:... Das ist aber noch meiner... Du musst forken und dann neu speichern!
-
function pad(num, size) { num = num.toString(); while (num.length < size) num = "0" + num; return num; } function color(a, n) { return Math.round(1.0 / n * a * 256); } const msg:string = "YAY !! Ich habe alleine Feuer gemacht !!! ;-):"; const n:number = msg.length; let r = 0; let g = 0; let b = 0; let s = "$"; for (let i = 0; i < msg.length; i++) { if (i < n / 2) { r = color(i, n / 2.0); } else { g = color(i - n / 2.0, n / 2.0); } let c = msg.charAt(i); if (c == ' ') { s += `\\color{#${pad(r.toString(16), 2)}${pad(g.toString(16), 2)}${pad(b.toString(16), 2)}}{\\${c}}` } else { s += `\\color{#${pad(r.toString(16), 2)}${pad(g.toString(16), 2)}${pad(b.toString(16), 2)}}{${c}}` } } s += "$" console.log(s);
-
Sorry, habe den Link oben korrigiert.
Dein Code sollte jetzt (fast) identisch zu meinem sein (nur hast du
256
anstatt255
als Faktor und das1.0 / ...
ist überflüssig, wenn du die Division als letztes durchführst).Je länger der Text ist, desto kleiner sind ja die Farbübergänge, d.h. je mehr Buchstaben sind gelb(lich) am Ende. Du könntest dafür dann den Faktor auf z.B. 220 verändern (also weniger hellgelb am Ende):
Oder eben doch im HSV-Farbraum rechnen und dann nur den Farbwert (H) ändern - und Sättigung (S) sowie Helligkeit (V) auf einen konstanten Wert einstellen. Dafür dann am besten entsprechende Umrechnungsmethoden HSV <-> RGB verwenden.
-
@Th69 Ich danke dir, das Thema ist gelöst ...
Und ja, eigentlich ist es "richtiger", den Aktualisierungsschritt erst am Schleifenrumpfende zu machen! r == Red soll aber durchaus den Wert 255 annehmen können.
Bräuchte das jetzt eigentlich nur noch für bash/sed/awk/printf ... Hat da vielleicht noch jemand eine Idee?
-
Falls das noch jemand außer mir braucht, hier noch einmal in Schön, funktioniert mit geraden und ungeraden Längen:
function pad(num, size) { num = num.toString(); while (num.length < size) num = "0" + num; return num; } function color(a, n, maxIncl) { return Math.round(1.0 / n * a * maxIncl); } const msg:string = "Testtext:"; const n1:number = msg.length; const n2:number = n1 / 2; const n3:number = n1 % 2 / 2.0; let r = 0; let g = 0; let b = 0; let s = "$"; for (let i = 0; i < n1; i++) { if (i < n2) { r = color(i + 1, n2 + n3, 255); } else { g = color(i - n2 + n3 + 1, n2 + n3, 256 / 4 * 3); } console.log(r, g, b); let c = msg.charAt(i); if (c == ' ') { s += `\\color{#${pad(r.toString(16), 2)}${pad(g.toString(16), 2)}${pad(b.toString(16), 2)}}{\\${c}}` } else { s += `\\color{#${pad(r.toString(16), 2)}${pad(g.toString(16), 2)}${pad(b.toString(16), 2)}}{${c}}` } } s += "$" console.log(s);
https://www.mycompiler.io/view/BJaAO36TutX
Zeile 23 finde ich noch etwas unübersichtlich, aber das geht vielleicht nicht anders ... habe nun schon wie wild hin und her gerechnet.
So,
-
@noLust Vielleicht noch eine Anmerkung für solche Farbverläufe: Man kann sowas auch recht elegant mit Standardwerkzeugen aus der Computergrafik angehen anstatt es so problemspezifisch direkt zu programmieren. In diesem Fall z.B. mit Linearer Interpolation zwischen zwei Punkten:
Diese Formel beschreibt eine Gerade zwischen den Punkten und in einem Raum beliebiger Dimension (). ist ein Skalar () und das Ergebnis der Formel ist , wenn und , wenn . Für zwischen und liegt es auf der Strecke zwischen und im entsprechenden Verhältnis, also für z.B. auf dem Viertel des Weges zwischen und .
Man kann jetzt und als Start- und Ziel-Farbe z.B. im 3-dimensionalen RGB-Farbraum (oder HSV oder was auch immer) interpretieren und sich so die Zwischen-Farbwerte ausrechnen. Dafür muss man lediglich den Zeichen-Index auf das Intervall umrechnen. Z.B. mit
(i - i_startfarbe) / (i_zielfarbe - i_startfarbe)
.Ich habe mich aus Spaß auch mal an einer generischen Variante versucht (wollte eh nochmal was mit JS herumspielen ). Die ermöglicht es, beliebige (und auch beliebig viele) Farben in einem Array zu definieren, mit denen dann der farbige Text erzeugt wird. Vielleicht kann dir das ja als Inspiration dienen:
https://www.mycompiler.io/view/HaRbj7tNfne
Mit den beliebigen Farben hat man dann auch die Möglichkeit, den Farbverlauf feiner zu justieren, wenn einem das Ergebnis nicht gefällt. Z.B. noch ein Orange einfügen und das Intervall in Richtung Gelb etwas schmaler machen.
-
@Finnegan sagte in Einen RGB-Farbverlauf (Schwarz-Rot-Gold) in JS/TS programmieren?:
Computergrafik
Ach, daher kommt der Spaß. Ja, ich hatte das (meiner Zeit) noch in der Schule berechnen müssen. Aber da ging es darum, den PONR bei Flugzeugen zu berechnen (die nur strikt geradeaus fliegen) ... aber naja, Mathematik.
-
@noLust sagte in [Einen RGB-Farbverlauf (Schwarz-Rot-Gold) in JS/TS programmieren?]
Ach, daher kommt der Spaß. Ja, ich hatte das (meiner Zeit) noch in der Schule berechnen müssen. Aber da ging es darum, den PONR bei Flugzeugen zu berechnen (die nur strikt geradeaus fliegen) ... aber naja, Mathematik.
Ich würde nicht behaupten, dass es "da her" kommt, aber Linearer Interpolation begegnet man dort an vielen Stellen. Mathematisches Standardwerkzeug halt und eine intuitive Methode, das Problem zu betrachten - zumindest aus meiner Perspektive intuitiver als dein Ansatz
-
Ich muss mal schauen, ob mein altes Mathebuch noch wiederauffindbar ist... dann scanne ich die Aufgabe mal ein... die Formulierung war ganz interessant, ich weiß sie aber nicht mehr aus dem ff.
Kleiner Ansporn für mich selber: Ich tippe auf Seite 104.
-
Ist leider weg.