# 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