Farbe von rot über gelb zu grün ändern.

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Xwitz
Mitglied
Beiträge: 1104
Registriert: 21.06.2005 21:41

Farbe von rot über gelb zu grün ändern.

Beitrag von Xwitz »

Hallo,

ich brauche mal einen Schubs. Ich will anhand einer Zahl von 0 bis 100 die Farbe von rot über gelb zu grün ändern.

Mein fiktiver Code bisher:

Code: Alles auswählen

<?php

$zahl = 25; //0-100%

if ($zahl < 50){
   $farbe = 'FF'.dechex(255 * ($zahl) / 50).'00';
} elseif ($zahl > 50){
   $farbe = dechex(255 * (100 - $zahl) / 50).'FF00';
} else {
   $farbe = 'FFFF00';
}

?>
dez_to_hex() soll eine Dezimalzahl in eine ganze Hexadezimalzahl wandeln, die Funktion muß ich noch finden. Meine Frage wäre aber, ob es noch einen anderen, besseren Ansatz gibt. Ich habe auch irgendwo gelesen, der "Verlauf" dürfe nicht linear sein um "gut" auszusehen.

Edit: dez_to_hex() -> string dechex ( int number )

Edit2: Rechnung korrigiert.

Edit3: Rechnung korrigiert, gehe jetzt schlafen. :wink:
Dennis63
Ehemaliges Teammitglied
Beiträge: 2597
Registriert: 02.07.2003 18:46

Beitrag von Dennis63 »

Rot wäre ja 255-0-0
Gelb wäre 255-255-0
Blau wäre 0-0-255

Also ich würde erst mal die Farben ansich als DEC Zahl bestimmen.

Code: Alles auswählen

$z = 5; // Prozentzahl, 0 = Rot, 50=Gelb, 100=Blau);
$rot = ($z <= 50 ? 255 : (100-$zahl)/50*255);
$gruen = ($z <= 50 ? $zahl / 50 * 255 : (100-$zahl)/50*255);
$blau = ($z <= 50 ? 255 : ($zahl-50) / 50 * 255
Und jetzt hast Du die Dezimalzahlen zu den Farben und kannst diese dann in HEX-Zahlen umwandeln und hast dann Deine Farben.

Grüße
Dennis
Xwitz
Mitglied
Beiträge: 1104
Registriert: 21.06.2005 21:41

Beitrag von Xwitz »

Nun gut, der Wert für Blau wäre in meinem Fall immer 0, das könnte ich weglassen aber sonst ist das doch das gleiche wie bei mir und ich kann noch ein if einsparen. Aber dennoch Danke.

Code: Alles auswählen

<?php 

$zahl = 25; //0-100%, 0% Rot, 50% Gelb, 100% Grün

if ($zahl < 50){ 
   $farbe = 'FF'.dechex(255 * ($zahl) / 50).'00'; 
} else { 
   $farbe = dechex(255 * (100 - $zahl) / 50).'FF00'; 
}
?>
Die Kurzschreibweise macht doch das gleiche und ist gleich schnell wie das if else Statement oder?
Xwitz
Mitglied
Beiträge: 1104
Registriert: 21.06.2005 21:41

Beitrag von Xwitz »

Die Tücke des Details. dechex() spuckt natürlich manchmal eine einstellige Hexzahl aus.

Falls das jemand findet und nutzen will, so funktioniert's.

Code: Alles auswählen

<?php 
$zahl = 25; //0-100%, 0% Rot, 50% Gelb, 100% Grün 
if ($zahl < 50){ 
   $fh = dechex(255 * ($zahl) / 50);
   $farbe = (strlen($fh) == 1 ? 'ff0'.$fh.'00' : 'ff'.$fh.'00'); 
} else { 
   $fh = dechex(255 * (100 - $zahl) / 50);
   $farbe = (strlen($fh) == 1 ? '0'.$fh.'ff00' : $fh.'ff00'); 
} 
?>
Das mit dem linear = unschön stimmt, von 0 bis 20 und 80 bis 100 gibt es kaum einen Unterschied. Sinus ist aber auch nicht das Richtige.
Antworten

Zurück zu „Coding & Technik“