#!/afs/athena/contrib/perl5/perl

use English;
use Tk;

$height=400;
$width=400;

$plotwin = MainWindow->new();

$canvas = $plotwin->Canvas(-height => $height,
			  -width => $width,
			      -background => "white");

$canvas->pack();
srand;
@partygoer = ();
@cols = ("red", "blue", "green", "yellow");

for $i (0..3){
    $col = @cols[$i];
    &newPerson(\%{$partygoer[$i]}, rand(400), rand(400), $col);
}

&associate(\%{$partygoer[0]}, \%{$partygoer[1]}, 0, 50);
&associate(\%{$partygoer[1]}, \%{$partygoer[2]}, 0, 50);
&associate(\%{$partygoer[2]}, \%{$partygoer[3]}, 0, 50);
&associate(\%{$partygoer[3]}, \%{$partygoer[0]}, 0, 50);

&associate(\%{$partygoer[1]}, \%{$partygoer[0]}, 100, 250);
&associate(\%{$partygoer[2]}, \%{$partygoer[1]}, 100, 250);
&associate(\%{$partygoer[3]}, \%{$partygoer[2]}, 100, 250);
&associate(\%{$partygoer[0]}, \%{$partygoer[3]}, 100, 250);


if(0){
&associate(\%{$partygoer[0]}, \%{$partygoer[1]}, 0, 2);
&associate(\%{$partygoer[0]}, \%{$partygoer[2]}, 0, 2);
&associate(\%{$partygoer[0]}, \%{$partygoer[3]}, 0, 2);
&associate(\%{$partygoer[1]}, \%{$partygoer[3]}, 0, 3);
&associate(\%{$partygoer[2]}, \%{$partygoer[0]}, 3, 5);
&associate(\%{$partygoer[3]}, \%{$partygoer[0]}, 10, 100);

&associate(\%{$partygoer[1]}, \%{$partygoer[0]}, 2, 50000);
}

while(1) {
    $n = 0;
    foreach $p (@partygoer) {
	$mx = $my = 0;
	foreach $a (@{${$p}{"a"}}) {
	     ($min, $max) = @{${$p}{$a}};
             $dist = &distance($p, $a);
             next if(($dist > $min) && ($dist < $max));
             if($dist < $min){
		 if($xdif >0) {
		     $mx++;
		 }
		 elsif($xdif < 0){
		     $mx--;
		 }
		 
		 if($ydif > 0){
		     $my++;
		 }
		 elsif($ydif < 0){
		     $my--;
		 }
	     }
    elsif($dist > $max){
		 if($xdif >0) {
		     $mx--;
		 }
		 elsif($xdif < 0){
		     $mx++;
		 }
		 
		 if($ydif > 0){
		     $my--;
		 }
		 elsif($ydif < 0){
		     $my++;
		 }

    }
    else {
	$panic{$p} = 0;
    }
       }
$newx = ${$p}{'x'}+($mx);
$newy = ${$p}{'y'}+($my);
$pinned = 0;
if($newx > 375 || ($newx < 5)){
    $pinned = "x";
}
if($newy > 375 || ($newy < 5)){
    $pinned = "y";
}
if($pinned){
    if($pinned eq "x"){
    $panic{$p} = "y either";
    $panic{$p} = "y low" if $newy <50;
    $panic{$p} = "y high" if $newy >350;

$mx = 0;
}
    if($pinned eq "y"){
    $panic{$p} = "x either";
    $panic{$p} = "x low" if $newx <50;
    $panic{$p} = "x high" if $newx >350;
$my = 0;
}
}

if($panic{$p}){
    ($dir, $care) = split(" ", $panic{$p});
if($dir eq "x"){
    if($care eq "low"){
	$mx = 1;
    }
else {
    $mx = -1;
}
}
elsif($dir eq "y"){
    if($care eq "low"){
	$my = 1;
    }
else {
    $my = -1;
}
}
    $mx *= 5;
    $my *= 5;
}


$mx = $mx;
$my = $my;
    $canvas->move(${$p}{'blob'}, $mx, $my);
${$p}{'x'}+=$mx;
    ${$p}{'y'}+=$my;
    $plotwin->update;
    }
    $plotwin->update;
}

MainLoop;

sub distance {
    my($p1, $p2) = @_;
    $xdif = ${$p1}{'x'} - ${$p2}{'x'};
    $ydif = ${$p1}{'y'} - ${$p2}{'y'};
return sqrt( ($xdif*$xdif) + ($ydif*$ydif) );
}

sub associate {
    ($p1, $p2, $min, $max) = @_;
    push(@{${$p1}{"a"}}, $p2);
    push(@{${$p1}{$p2}}, $min, $max);
	 return $p1;
}

sub newPerson {
    my($person, $x, $y, $color) = @_;
    ${$person}{'blob'} = $canvas->create("oval", $x, $y, ($x+15), ($y+15), "-fill", $color, "-tags", "item");
    ${$person}{'x'} = $x;
    ${$person}{'y'} = $y;
}


