PDL-Graphics-PLplot
view release on metacpan or search on metacpan
my $z;
if ($rosen) {
$z = (1 - $xx) ** 2 + 100 * ($yy - ($xx ** 2)) ** 2;
# The log argument may be zero for just the right grid.
$z = log ($z);
} else {
my $r = sqrt ($xx * $xx + $yy * $yy);
$z = exp (-$r * $r) * cos (2.0 * pi * $r);
}
$z->inplace->setnonfinitetobad;
$z->inplace->setbadtoval(-5); # -MAXFLOAT would mess-up up the scale
my (@indexymin, @indexymax);
my $square_root = sqrt(1. - hclip(( (sequence(XPTS) - $x0) / $a ) ** 2, 1));
# Add 0.5 to find nearest integer and therefore preserve symmetry
# with regard to lower and upper bound of y range.
my $indexymin = lclip( 0.5 + $y0 - $b * $square_root, 0 )->indx;
# indexymax calculated with the convention that it is 1
# greater than highest valid index.
my $indexymax = hclip( 1 + ( 0.5 + $y0 + $b * $square_root ), YPTS )->indx;
my $zlimited = zeroes (XPTS, YPTS);
for my $i ( $indexxmin..$indexxmax-1 ) {
my $j = [ $indexymin->at($i), $indexymax->at($i) ];
$zlimited->index($i)->slice($j) .= $z->index($i)->slice($j);
}
my ($zmin, $zmax) = (min($z), max($z));
my $nlevel = LEVELS;
my $step = ($zmax - $zmin) / ($nlevel + 1);
my $clevel = $zmin + $step + $step * sequence ($nlevel);
pllightsource (1., 1., 1.);
for (my $k = 0; $k < 2; $k++) {
for (my $ifshade = 0; $ifshade < 5; $ifshade++) {
pladv (0);
plvpor (0.0, 1.0, 0.0, 0.9);
plwind (-1.0, 1.0, -0.9, 1.1);
plcol0 (3);
plmtex (1.0, 0.5, 0.5, "t", $title[$k]);
plcol0(1);
if ($rosen) {
plw3d (1.0, 1.0, 1.0, -1.5, 1.5, -0.5, 1.5, $zmin, $zmax,
$alt[$k], $az[$k]);
} else {
plw3d (1.0, 1.0, 1.0, -1.0, 1.0, -1.0, 1.0, $zmin, $zmax,
$alt[$k], $az[$k]);
}
plbox3 (0.0, 0, 0.0, 0, 0.0, 0,
"bnstu", "x axis", "bnstu", "y axis", "bcdmnstuv", "z axis");
plcol0 (2);
cmap1_init(($ifshade == 0) || 0);
if ($ifshade == 0) { # diffuse light surface plot
plsurf3d($x, $y, $z, 0, pdl []);
} elsif ($ifshade == 1) { # magnitude colored plot
plsurf3d($x, $y, $z, MAG_COLOR, pdl []);
}
elsif ($ifshade == 2) { # magnitude colored plot with faceted squares
plsurf3d($x, $y, $z, MAG_COLOR | FACETED, pdl []);
} elsif ($ifshade == 3) { # magnitude colored plot with contours
plsurf3d($x, $y, $z, MAG_COLOR | SURF_CONT | BASE_CONT, $clevel);
} else { # magnitude colored plot with contours and index limits.
plsurf3dl(
$x, $y, $zlimited, MAG_COLOR | SURF_CONT | BASE_CONT, $clevel,
$indexxmin, $indexxmax, $indexymin, $indexymax,
);
}
}
}
plend ();
( run in 1.192 second using v1.01-cache-2.11-cpan-63c85eba8c4 )