#!/usr/bin/perl use strict; use warnings; use CGI; my ($farben); my $zeilen = ''; my %test = ( 1 => { text => 'Gesamter Verlauf 384 Einheiten rot nach blau', anz => 384, }, 2 => { text => 'Gesamter Verlauf 256 Einheiten rot nach grün', anz => 256, para => 1, }, 3 => { text => 'Gesamter Verlauf 128 Einheiten rot nach gelb', anz => 128, para => 2, }, 4 => { text => '134 Farben von rot nach grün', anz => 134, para => 1, }, 5 => { text => '6 Farben von rot nach gelb', anz => 6, para => 2, }, 6 => { text => '10 Farben von rot nach blau', anz => 10, }, 7 => { text => '10 Farben von rot nach grün', anz => 10, para => 1, }, 8 => { text => '10 Farben von rot nach gelb', anz => 10, para => 2, }, ); foreach my $testnr (sort {$a <=> $b} keys %test) { $zeilen .= "Test $testnr - $test{$testnr}{text}"; $farben = farbverlauf ($test{$testnr}{anz},(defined $test{$testnr}{para} ? $test{$testnr}{para} : undef)); $zeilen .= ''; foreach my $nr (@$farben) { $zeilen .= ''; } $zeilen .= '
'; } print STDOUT CGI -> new -> header . < $zeilen
Test Farbverlauf
HTML_TEIL ; # --------------------------------------------------------------------------------------------------------------------- sub farbverlauf { # # Logik: # ====== # 1. Mitte von 128 bis 255, also FF8080 bis FFFF80 = Rot -> Gelb # 2. Links von 255 runter bis 128, also FFFF80 bis 80FF80 = Gelb -> Grün # 3. Rechts von 128 hoch bis 255, also 80FF80 bis 80FFFF = Grün -> Blau # Ergibt 384 Farben # # Wird aufgerufen mit der Anzahl der benötigten Farben und liefert eine Array-Referenz zurück # # Beispiel: # ========= # my $farben = farbverlauf (4[,1]); # print "Farbe 2 = " . $farben -> [2] . "\n"; # optionaler Parameter: 0 oder undef=von rot nach blau; 1=von rot nach grün; 2=von rot nach gelb # my $anzahl = $_[0]; my %config = ( 0 => { max => 384, }, 1 => { max => 256, }, 2 => { max => 128, }, ); my $modus = (defined $_[1] && exists $config{$_[1]} ? $_[1] : 0); my @arr; if ($anzahl > 1) { $anzahl = $config{$modus}{max} if $anzahl > $config{$modus}{max}; # Minimale Schrittweite darf 1 sein my $schritt = int ($config{$modus}{max} / $anzahl + .5); # Schrittweite anhand Anzahl Werte for (my $z = 0; $z < $anzahl; $z ++) { my @rgb = (255,128,128); # Startfarbe fest Rot $rgb[1] = int (128 + $z * $schritt); if ($rgb[1] > 255) { # Überlauf Mitte nach links schieben $rgb[0] -= $rgb[1] - 256; $rgb[1] = 255; } if ($rgb[0] < 128) { # Überlauf Links nach rechts schieben $rgb[2] += 127 - $rgb[0]; $rgb[0] = 128; } push @arr,sprintf ('#%02X%02X%02X',@rgb); } } return \@arr; }