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

use English;
use Tk;

$start = 3.7;
$end = 4;


my $plotwin = MainWindow->new();

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

$canvas->pack();

$bins = 5000;

setupScale('xOrigin' => -1*$start*(8/($end-$start)),
	   'yOrigin' => 8,
	   'yScale' => 1,
	   'xScale' => 8/($end-$start));

for($x=$start;$x<$end;$x+=(($end-$start)/400)){
    print("$x\n");
    doChaos($x);
}

MainLoop;

sub plotPoint {
    my($obj, $x, $y, $r, $color)= @_;

    $color = "black" unless $color;

    $obj->create("oval", ($x-($r/2))."i", ($y - ($r/2))."i", ($x+($r/2))."i", ($y + ($r/2))."i", "-outline", "$color");
}

sub doChaos {
    my($r) = @_;
    @pattern = ();
    $a = rand(1);
    for $i (1..1000){
	$a = -$r*($a*$a)+$r*($a);
	if ($a < 0) { last; }
	last if $a >1;
	$bin = int($a*$bins);
	last if $bin <0;
#	print("$i $a\n");
#	cartesianPoint($canvas, $i/(100/(8*$xScale)), $a*8); 
	$pattern[$bin]++;
    }
    $plotwin->update;
    foreach $b (0..$bins){
	if($pattern[$b] > 1){
	    if ($pattern[$b] > 300) {
		$col = "red";
	    }
	    elsif($pattern[$b] >30){
		$col = "blue";
	    }
	    else{
		$col = "black";
	    }
	    cartesianPoint($canvas, $r, 8*$b/$bins, $col);
	}
    }
}

sub cartesianPoint {
    my($obj, $x, $y, $color) = @_;

    if(!defined $scaleSetup){
	print("Must define scale with call to setupScale\n");
    }

    plotPoint($obj,
	      (($x*$xScale)+$xOrigin),
	      ($yOrigin-($y*$yScale)),
	      0, $color);

#    print "Plotting: ", (($x*$xScale)+$xOrigin), ($yOrigin-($y*$yScale)), "\n"; # 


}

sub setupScale {
    my(%config) = @_;

    $xOrigin = $config{'xOrigin'};
    $yOrigin = $config{'yOrigin'};
    $xScale = $config{'xScale'};
    $yScale = $config{'yScale'};
    $scaleSetup = 1;
}


