#!/usr/bin/perl

# pole_wielokata( @xy )
#   Procedura oblicza pole wielokata z uzyciem wyznacznika. Do procedury 
#   nalezy przekazac punkty w postaci ( $x0, $y0, $x1, $y1, $x2, $y2, ...).
#

sub pole_wielokata {
    my @xy = @_;

    my $A = 0;                          # Pole.

    # 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 += wyznacznik( $xa, $ya, $xb, $yb );
    }

    # Jesli punkty zostaly podane w kierunku przeciwnym do ruchu wskazowek zegara,
    # to zmienna $A bedzie miala wartosc ujemna. Z tego powodu nalezy obliczyc
    # wartosc absolutna.

    return abs $A / 2;

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

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

# wyznacznik( $x0, $y0, $x1, $y1 )
# Procedura oblicza wyznacznik dla czterech elementow macierzy
# podanych jako argumenty.
#
sub wyznacznik { $_[0] * $_[3] - $_[1] * $_[2] }
 



