Thread Modul für einfache Kuchengrafik (49 answers)
Opened by bianca at 2010-02-06 13:13

topeg
 2010-02-06 19:10
#131972 #131972
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
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)

View full thread Modul für einfache Kuchengrafik