#!/usr/bin/perl -w use CGI qw(:standard); use strict; use GD; use vars qw($magnitude $P $Q $scale); my ($x_centre,$y_centre) = (320,175); if ( scalar param() < 3 ) { my @configs = map {chomp; [ split ]} ; ($P,$Q,$scale) = @{ $configs[rand @configs] }; } else { $P = param('real'); $Q = param('imaginary'); $scale = param('scale'); } my $image = new GD::Image($x_centre * 2,$y_centre * 2); my $back_colour = $image->colorAllocate(255,255,255); my $fore_colour = $image->colorAllocate(0,0,0); my ($x,$y) = (0.50001,0); $magnitude = ($P*$P) + ($Q*$Q); $P = 4*$P/$magnitude; $Q = -4*$Q/$magnitude; $scale = $x_centre * $scale; for ( 1 .. 12000 ) { my $temp_x = ($x * $P ) - ($y * $Q ); $y = ($x * $Q) + ($y * $P ); my $temp_y = $y; $x = 1 - $temp_x; $magnitude = sqrt(($x * $x ) + ($y * $y)); $y = sqrt((-$x + $magnitude)/2); $x = sqrt(($x + $magnitude)/2); ($x = -$x) if ($temp_y < 0 ); if ( rand() < 0.5 ) { $x = -$x; $y = -$y; } $x = (1- $x) / 2; $y = $y / 2; my $col = int(($scale * ($x - 0.5 )) + $x_centre); my $row = int($y_centre - ($scale * $y)); if ( ($_ > 0 ) && ($col >= 0 ) && ($col < (2 * $x_centre)) && ($row >= 0 ) && ($row < ($y_centre * 2 ))) { $image->setPixel($col,$row,$fore_colour); } } print header('image/png'); binmode(STDOUT); print $image->png; __END__ 1.646009 0.967049 0.75 2.447261 -0.967049 0.75 1.325508 0.786533 0.75 1.415414 0.856803 0.75 1.255399 0.691977 0.75 2.792809 -0.657593 0.75 3.018153 -0.098854 0.75 2.998122 0.004298 0.75