Lissajou Figures

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;