#!/usr/bion/perl; use strict; use warnings; {package tortengrafik; use Graphics::Magick; use Math::Trig; sub new { my $class=shift; $class=ref($class) if(ref($class)); my $self={values=>[]}; bless($self,$class); } # füge ein Element hinzu # params: # - Wert Zahlenwert des feldes (muss ein zahl >0 sein) # - Farbe Farbe des Feldes (weiß ist default) # - Text Title/Text des Feldes sub add { my $self=shift; my $value=shift || 0; $value+=0; return 0 unless($value); my $color=shift || '#FFFFFF'; my $title=shift || ''; push(@{$self->{values}},{val=>$value,title=>$title,color=>$color}); $self->{sum}=undef; return 1; } # erzeuge die Grafik # params: # - größe des Diagrammes (radius des Diagramms) # - Abstand zum Rand (wird aufaddiert) # - Textgröße (12 pixes ist default) # - Hintergrundfarbe (Weiß ist default) # - Linenfarbe (Schwarz ist default) sub create { my $self=shift; my $size=shift || 100; my $border=shift || 4; my $text_size=shift || 12; my $bg_color=shift || 'white'; my $line_color=shift || 'black'; # Create Image my $img=Graphics::Magick->new(); $img->Set(size=>($size*2+$border*2)."x".($size*2+$border*2)); $img->Read('xc:'.$bg_color); # get summ unless($self->{sum}) { $self->{sum}=0; for my $val (@{$self->{values}}) { $self->{sum}+=$val->{val}; } } # Draw Felder my $ancle=0; my $center=$size+$border; for my $val (@{$self->{values}}) { my $a=(360/$self->{sum})*$val->{val}; my $new_ancle=$ancle+$a; $img->Draw(primitive=>'ellipse', points=>$center.','.$center.' '.($size/2).','.($size/2).' '.$ancle.','.$new_ancle, fill=>$val->{color}, stroke=>$val->{color}, strokewidth=>$size); $ancle=$new_ancle; } # Draw seperators $ancle=0; for my $val (@{$self->{values}}) { my $a=((pi*2)/$self->{sum})*$val->{val}; my $new_ancle=$ancle+$a; my $px=(cos($new_ancle)*$size)+$center; my $py=(sin($new_ancle)*$size)+$center; $img->Draw(primitive=>'line', points=>"$center,$center $px,$py", stroke=>$line_color, strokewidth=>2); $ancle=$new_ancle; } $img->Draw(primitive=>'ellipse', points=>$center.','.$center.' '.$size.','.$size.' 0,360', stroke=>$line_color, strokewidth=>2); # Draw text; $ancle=0; for my $val (@{$self->{values}}) { my $a=((pi*2)/$self->{sum})*$val->{val}; my $new_ancle=$ancle+$a; my $px=(cos($ancle+$a/2)*$size/2)+$center; my $py=(sin($ancle+$a/2)*$size/2)+$center; my $text=int((100/$self->{sum})*$val->{val}).'%% '.$val->{title}; $img->Draw(primitive=>'text', points=>"$px,$py '$text'", fill=>$line_color, pointsize=>$text_size, strokewidth=>1); $ancle=$new_ancle; } return $img; } 1;} package main; my $g=tortengrafik->new(); $g->add(10,'#FF0000','Test1'); $g->add(20,'#00FF00','Test2'); $g->add(40,'#0000FF','Test3'); $g->add(30,'#FFF000','Test4'); $g->add(20,'#00FFF0','Test5'); $g->add(10,'#000FFF','Test6'); $g->add(40,'#FF00F0','Test7'); $g->add(30,'#F0FF00','Test8'); $g->add(10,'#00F0FF','Test9'); $g->create(300,5,30,'#FFFFFF')->display();