Thread Modul für einfache Kuchengrafik
(49 answers)
Opened by bianca at 2010-02-06 13:13
Was ganz einfaches auf Basis von Graphics::Magick:
Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 #!/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(); Der Rest ist dein Sache. modedit Editiert von pq: teilbaum Graphics::Magick Last edited: 2012-03-15 20:28:14 +0100 (CET) |