The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#! /usr/bin/env perl
#
# Demo x13 for the PLplot PDL binding
#
# 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 Library General 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

# SYNC: x13c.c 1.15

# 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 ();

pladv(0);
# Ensure window has aspect ratio of one so circle is
# plotted as a circle. 
plvasp(1.0);
plwind(0., 10., 0., 10.);
#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 ();