Seite 1 von 1

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

Verfasst: 29.01.2007 23:35
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:

Verfasst: 30.01.2007 00:40
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

Verfasst: 30.01.2007 09:11
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?

Verfasst: 30.01.2007 22:14
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.