File: x13.pl

package info (click to toggle)
plplot 5.3.1-4
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 26,248 kB
  • ctags: 11,687
  • sloc: ansic: 86,045; xml: 17,249; sh: 12,400; tcl: 8,113; cpp: 6,824; perl: 4,383; python: 3,915; makefile: 2,899; java: 2,788; fortran: 290; sed: 5; awk: 1
file content (91 lines) | stat: -rwxr-xr-x 2,716 bytes parent folder | download
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
#! /usr/bin/env perl
#
# Demo x13 for PLplot PDL bindings
#
# Does a simple pie chart
#
# Copyright (C) 2004  Rafael Laboissiere
#
# This file is part of PLplot.
#
# PLplot is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Library Public License as published
# by the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# PLplot is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Library General Public License for more details.
#
# You should have received a copy of the GNU Library General Public License
# along with PLplot; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

# N.N. Although the visual results of this script is essentially the
# same as that produced by the equivalent C example x13c, the code
# below is quite different from that of x13c.c.  I use the vectorized
# operations of PDL extensively, such that most of the "for" loops
# disappeared. [R.L.]

use PDL;
use PDL::Graphics::PLplot;
use Math::Trig qw [pi];

my @text = (
  "Maurice",
  "Geoffrey",
  "Alan",
  "Rafael",
  "Vince"
);

my $per = pdl [10, 32, 12, 30, 16];

# Parse and process command line arguments

plParseOpts (\@ARGV, PL_PARSE_SKIP | PL_PARSE_NOPROGRAM);

# Initialize plplot

plinit ();

plenv (0, 10, 0, 10, 1, -2);
plcol0 (2);
# n.b. all theta quantities scaled by 2*pi/500 to be integers to avoid
# floating point logic problems.
my $theta0 = 0;
my $dthet = 1;
for (my $i = 0; $i <= 4; $i++) {
  # n.b. the theta quantities multiplied by 2*pi/500 afterward so
  # in fact per is interpreted as a percentage.
  my $theta1 = 5 * $per->index ($i);
  my $theta = $theta0 + sequence ($theta1->sclr + 1) * $dthet;
  my $xx = 5 + 3 * cos ((2 * pi / 500) * $theta);
  my $n = ($xx->dims)[0];
  my $x = zeroes ($n + 1);
  $x->slice("1:$n") .= $xx;
  $x->index (0) .= 5;
  my $yy = 5 + 3 * sin ((2 * pi / 500) * $theta);
  my $y = zeroes ($n + 1);
  $y->slice("1:$n") .= $yy;
  $y->index (0) .= 5;
  plcol0 ($i + 1);
  plpsty (($i + 3) % 8 + 1);
  plfill ($x, $y);
  plcol0 (1);
  plline ($x, $y);
  my $just = (2 * pi / 500) * ($theta0 + $theta1 / 2);
  my $dx = .25 * cos ($just);
  my $dy = .25 * sin ($just);
  $just = ((2 * $theta0 + $theta1) < 250
           || (2 * $theta0 + $theta1) > 750) ? 0 : 1;
  plptex (($xx->index ($n / 2) + $dx), ($yy->index ($n / 2) + $dy),
          1.0, 0.0, $just, $text[$i]);
  $theta0 += $theta1;
}
plfont (2);
plschr (0, 1.3);
plptex (5.0, 9.0, 1.0, 0.0, 0.5, "Percentage of Sales");

plend ();