use strict;
use warnings;

my @poly = qw(0 1.5 2.2 0.3  3.0 2.0 2.8 3.5 0.1 2.2);

my $U = polygon_umfang (@poly);
my $A = polygon_flaeche(@poly);
printf("Umfang = %.2f, Flaeche = %.2f\n", $U, $A);
# ergibt:   Umfang = 9.60, Flaeche = 5.53


sub polygon_umfang 
  {
  my @xy = @_;
  my $P = 0; # Länge des Umfangs.
  my ($xa, $xb, $ya, $yb); 
  # Statt am Ende wird das Polygon gleich geschlossen
  # [-2, -1] ist das letzte Koordinatenpaar.
  ($xa, $ya) = @xy[-2, -1];
  while ($#xy > 0)
    {
    ($xb, $yb) = splice(@xy, 0, 2);
     # Distanz zum nächsten Punkt
    $P += sqrt(($xa - $xb)**2 + ($ya - $yb)**2);
    ($xa, $ya) = ($xb, $yb);
    }
  return $P;
  }


sub polygon_flaeche 
  {
  my @xy = @_;
  my $A = 0; # Die Fläche.
  my ($xa, $xb, $ya, $yb); 
  # Statt am Ende wird das Polygon gleich geschlossen
  # [-2, -1] ist das letzte Koordinatenpaar.
  ($xa, $ya) = @xy[-2, -1];
  while ($#xy > 0)
     {
     ($xb, $yb) = splice(@xy, 0, 2);
     # zum nächsten Punkt
     $A += $xa*$yb - $xb*$ya;
     ($xa, $ya) = ($xb, $yb);
     }
  # Falls die Punkte im Uhrzeigersinn angegeben wurden, 
  # wird die Fläche negativ --> Absolutbetrag nehmen
  return abs($A/2);
  }