#!/usr/bin/perl use strict; use warnings; # PPM Header my $header=<<'EOH'; P3 %s %s %s EOH my $depth=int(shift(@ARGV) || 8); die "Farbtiefe > 1 angeben\n" unless($depth > 1); die "Farbtiefe < 16 angeben\n" if($depth > 16); my $maxval=(2**$depth)-1; my ($data,$height,$width,undef)=create_colors($depth); printf($header,$width,$height,$maxval); while(@$data) { for my $c (1..($width*3)) { print shift(@$data)." "; } print "\n"; } ################################# # Farbkreis erzeugen ################################# # braucht: # Farbtiefe # liefert: # die Liste der Werte # Hoehe # Breite # Farbtiefe sub create_colors { my @data=(); my $depth=shift || 8; my $color=(2**$depth)-1; my $w=$color*2; my $h=$color*2; my $mx=int($w/2); my $my=int($h/2); $mx-=($mx/10); my $radi=int($color/2); for my $x (0..($w-1)) { for my $y (0..($h-1)) { my $diff=diff($x,$y,$mx,$my); my $wi=winkel($x,$y,$mx,$my,$color); my $hell=$diff*($color/$radi); my $r=int($hell-abs($wi)); my $g=int($hell-abs(rotate($wi,($color/3)*2,$color))); my $b=int($hell-abs(rotate($wi,-($color/3)*2,$color))); $r=0 if($r<0); $g=0 if($g<0); $b=0 if($b<0); $r=$color if($r>$color); $g=$color if($g>$color); $b=$color if($b>$color); push(@data,$r,$g,$b); } } return(\@data,$h,$w,$depth); } # Farbtiefe # liefert: # die Liste der Werte binär. # Hoehe # Breite # Farbtiefe sub create_colors_bin { my @l = create_colors(@_); my $d=$l[-1]; $d = $d==4?'S*':$d==8?'C*':$d==16?'L*':''; return(pack($d,@{shift(@l)}), @l); } sub rotate { my ($winkel,$wert,$c)=@_; my $w2=$winkel+$wert; $w2=-$c+($w2-$c) if($w2>=$c); $w2=$c+($w2+$c) if($w2<=-$c); return $w2; } sub diff { my ($xa,$ya,$xb,$yb)=@_; my $dx=abs($xb-$xa); my $dy=abs($yb-$ya); return sqrt($dx**2+$dy**2); } sub winkel { my ($xa,$ya,$xb,$yb,$c)=@_; my $pi = 3.14159265358979; my $dx=$xb-$xa; my $dy=$yb-$ya; return (atan2($dy,$dx)*$c/$pi); }