# Plot a 3D function
use gifplot;
package gifplot;

sub func {
    my ($x,$y) = @_;
    return sin($x)*cos($y);
}

sub plotmesh {
    my ($p3,$nx,$ny) = @_;
    my $min = $p3->{zmin};
    my $max = $p3->{zmax};
    my $dx = ($p3->{xmax}-$p3->{xmin})/$nx;
    my $dy = ($p3->{ymax}-$p3->{ymin})/$ny;
    my $cscale = 240.0/($max-$min);
    my $x = $p3->{xmin};
    for ($i = 0; $i < $nx; $i++) {
	my $y = $p3->{ymin};
	for ($j = 0; $j < $ny; $j++) {
	    my $z1 = func($x,$y);
	    my $z2 = func($x+$dx,$y);
	    my $z3 = func($x+$dx,$y+$dy);
	    my $z4 = func($x,$y+$dy);
	    my $c1 = $cscale*($z1-$min);
	    my $c2 = $cscale*($z2-$min);
	    my $c3 = $cscale*($z3-$min);
	    my $c4 = $cscale*($z4-$min);
	    my $c = int (($c1+$c2+$c3+$c4)/4.0);
	    if ($c < 0) { $c = 0; }
	    if ($c > 239) { $c = 239; }
	    $c = $c + 16;
	    $p3->solidquad($x,$y,$z1,$x+$dx,$y,$z2,$x+$dx,$y+$dy,$z3,$x,$y+$dy,$z4,$c);
	    $y = $y + $dy;
	}
	$x = $x + $dx;
    }
}

$f = new FrameBuffer(500,500);
$cm = new ColorMap("cmap");
$p3 = new Plot3D($f,-5,-5,-2,5,5,2);
$p3->lookat(20);
$p3->autoperspective(40);
$p3->clear($BLACK);
$p3->rotu(60);
$p3->rotr(30);
$p3->rotd(10);
$p3->start();
plotmesh($p3,50,50);

$f->writeGIF($cm,"plot3d.gif");

print "Image written to 'plot3d.gif'\n";



syntax highlighted by Code2HTML, v. 0.9.1