#!/usr/bin/perl

# obwod_wielokata( @xy )
#   Procedura oblicza dlugosc obwodu wielokata. Do procedury nalezy
#   przekazac punkty w postaci ( $x0, $y0, $x1, $y1, $x2, $y2, ...).
#

sub obwod_wielokata {
    my @xy = @_;

    my $P = 0;                          # Obwod.

    # Polaczenie ostatniego i pierwszego punktu jest wykonywane juz na poczatku 
    # procedury, a nie na jej koncu (punkt [-2, -1] ponizej).
    for ( my ( $xa, $ya ) = @xy[ -2, -1 ];
          my ( $xb, $yb ) = splice @xy, 0, 2;
          ( $xa, $ya ) = ( $xb, $yb ) ) { # Przejscie do kolejnego punktu.
        $A += dlugosc( $xa, $ya, $xb, $yb );
    }

    return $P / 2;
}

print obwod_wielokata( 0, 1,  1, 0,  3, 2,  2, 3,  0, 2 ), "\n";

# Procedura odleglosc( @p ) oblicza odleglosc euklidesowa pomiedzy dwoma
# punktami o d wymiarow, dla ktorych istnieje 2 * d wspolrzednych.  Dla przykladu,
# para punktow trojwymiarowych powinna byc przekazana do tej procedury
# jako ( $x0, $y0, $z0, $x1, $y1, $z1 ).

sub odleglosc {
    my @p = @_;                 # Wspolrzedne punktow.
    my $d = @p / 2;             # Liczba wymiarow.

    # Procedura zostala zoptymalizowana dla przypadku z dwoma wymiarami.
    return sqrt( ($_[0] - $_[2])**2 + ($_[1] - $_[3])**2 )
        if $d == 2;

    my $S = 0;                  # Suma kwadratow.
    my @p0 = splice @p, 0, $d;  # Uzyskanie punktu startowego.

    for ( my $i = 0; $i < $d; $i++ ) {
        my $di = $p0[ $i ] - $p[ $i ];  # Roznica...
        $S += $di * $di;                # ...podniesiona do kwadratu i zsumowana.
    }

    return sqrt( $S );
}
