The following example produces Lissajou figures:
#!/usr/bin/perl
use Spectra;
use GQE;
$r_max = 10000;
($fx, $fy, $np, $par) = @ARGV;
$fx = $fx || 2;
$fy = $fy || 3;
$par = $par || (0.01*sqrt(sqrt($fx+$fy)));
$np = $np || 101;
Spectra::delete("*.*");
Spectra::set( "raise off");
Spectra::set( "cif off"); # change-input-focus to off
Spectra::cls();
print "\033[5;1f Usage:\n\n";
print " TScan.pl fx fy np par \n\n";
print " Examples: \n";
print " TScan.pl 4 5 \n";
print " TScan.pl 9 10 201\n";
print " TScan.pl 7 8 201 0.01 \n\n";
print " Press the space bar to terminate the loop \n";
$t1 = SCAN->create( name => t1,
start => -1,
stop => 1,
np => $np) or
die "Failed to create t1 ";
$t2 = SCAN->create( name => t2,
start => -1,
stop => 1,
np => $np) or
die "Failed to create t2 ";
Spectra::autoscale();
#($user, $system, $cuser, $csystem) = times;
$start = (times)[0];
$pi = Gra_decode_double( "4.*atan(1.)");
$f1 = 2*$pi/($np-3);
for $r (0 .. $r_max )
{
for $i (0 .. ($np - 1))
{
$t1->{x}[$i] = cos($fx*($f1*$i+$r*$par));
$t1->{y}[$i] = sin($fy*($i*$f1 + 0*($r+0.5)*$par));
}
$t2->set( colour => 'white');
$t1->set( colour => 'black');
Spectra::display( over => 1);
for $i (0 .. ($np - 1))
{
$t2->{x}[$i] = cos($fx*($f1*$i+($r+0.5)*$par));
$t2->{y}[$i] = sin($fy*($i*$f1 + 0*($r+0.5)*$par));
}
$t2->set( colour => 'black');
$t1->set( colour => 'white');
Spectra::display( over => 1);
$let = Spectra::key();
last if( $let == 32);
}
$end = (times)[0];
printf "\n Time %.2f seconds \n", $end - $start;