in reply to Generating Fractals with Perl?

Here's a fairly crude Mandelbrot I prepared earlier:

#!/usr/bin/perl -w use strict; use GD; use vars qw($P @Q $col $row @colours ); my ($maxcol, $maxrow, $max_colours, $max_iterations, $max_size ) = (640,350,16,512,4); my ($XMax,$XMin,$YMax,$YMin) = (1.2,-2.0,1.2,-1.2); my $deltaP = ($XMax - $XMin) / $maxcol; my $deltaQ = ($YMax - $YMin) / $maxrow; $Q[0] = $YMax; my $image = new GD::Image($maxcol,$maxrow); for ( 0 .. $max_colours - 1) { $colours[$_] = $image->colorAllocate(int(rand(256)), int(rand(256)), int(rand(256))); } for( 1 .. $maxrow ) { $Q[$_] = $Q[$_ -1] - $deltaQ; } $P = $XMin; for $col ( 0 .. $maxcol -1 ) { for $row ( 0 .. $maxrow - 1) { my ($X,$Y,$XSquare,$YSquare) = (0,0,0,0); my $colour = 1; while (( $colour < $max_iterations ) && (($XSquare + $YSquare ) < $max_size )) { $XSquare = $X * $X; $YSquare = $Y * $Y; $Y *= $X; $Y += $Y + $Q[$row]; $X = $XSquare - $YSquare + $P; $colour++; } $image->setPixel($col,$row,$colours[$colour % $max_colours] +); } $P += $deltaP; } open(PNG,">image$$.png") || die "Cannot open output - $!\n"; binmode(PNG); print PNG $image->png; close(PNG);

If you look in the examples for my module Linux::Svgalib there are some further examples.

/J\

Replies are listed 'Best First'.
Another example
by gellyfish (Monsignor) on Mar 09, 2002 at 19:10 UTC

    And this one draws a random Dragon Outline as a CGI program :

    #!/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 ]} <DATA>; ($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

    /J\