1000)){ $dur=60; } # Anzahl der Kurvenstuecke if(isset($_GET['anz'])) { $anz=$_GET['anz']; } else { $anz=60; } if (($anz < 20) or ($anz > 250)){ $anz=60; } $anz=round($anz); # Kreisfrequenz x, y: if(isset($_GET['kx'])) { $krx=$_GET['kx']; } else { $krx=mt_rand(1,5); } if (($krx < 1) or ($krx > 30)){ $krx=mt_rand(1,5); } if(isset($_GET['ky'])) { $kry=$_GET['ky']; } else { $kry=mt_rand(1,5); } if (($kry < 1) or ($kry > 30)){ $kry=mt_rand(1,5); } # Lissajous-Figur # Kreisfrequenz x, y: #$krx=mt_rand(1,5); #$kry=mt_rand(1,5); $lx=2*M_PI*$krx; $ly=2*M_PI*$kry; $radius=450; $bogen=($lx+$ly)*$radius; # Startwinkel $phix=mt_rand(0, 360)/180*M_PI; $phiy=mt_rand(0, 360)/180*M_PI; function funx ($t) { global $lx, $phix, $radius; return $radius*cos($lx*$t+$phix); } # Ableitung numerisch... function ablx($t, $h) { return (funx($t-2*$h) - 8*funx($t-$h) + 8*funx($t+$h) - funx($t+2*$h))/(12*$h); } function funy ($t) { global $ly, $phiy, $radius; return $radius*cos($ly*$t+$phiy); } # Ableitung numerisch... function ably($t, $h) { return (funy($t-2*$h) - 8*funy($t-$h) + 8*funy($t+$h) - funy($t+2*$h))/(12*$h); } # Punkte rechnen, Startpunkt, Markierungen $x=funx(0); $y=funy(0); $px=round($xmoveto+$x,1); $py=round($ymoveto+$y,1); $xalt=$x; $yalt=$y; # Ableitungen: $xabl=ablx(0, 0.001)/$anz; $yabl=ably(0, 0.001)/$anz; # erster Kontrollpunkt $kx=round($xabl/3.0,1); $ky=round($yabl/3.0,1); $pfad1="M $px, $py c $kx,$ky "; $einzelpunkte="\n"; # Schleife fuer die weiteren Punkte for ($i = 1; $i <= $anz; $i++) { $xx=($i/$anz); # Randpunkt $x=funx($xx); $y=funy($xx); # Ableitungen fuer x und y $xabl=ablx($xx, 0.001)/$anz; $yabl=ably($xx, 0.001)/$anz; # zweiten Kontrollpunkt rechnen $kx=round($x-$xabl/3.0-$xalt,1); $ky=round($y-$yabl/3.0-$yalt,1); # automatische stetig differenzierbare Fortsetzung # fordern if ($i==2){ $pfad1 .="s "; } $pfad1 .="$kx,$ky "; $px=round($xmoveto+$x,1); $py=round($ymoveto+$y,1); $ppx=round($x-$xalt,1); $ppy=round($y-$yalt,1); $xalt=$x; $yalt=$y; # Kontrollpunkte und Endpunkte $pfad1 .="$ppx,$ppy \n"; $einzelpunkte .="\n"; } # svg-header senden: $content="Content-type: image/svg+xml"; header($content); # xml-Zeile ausgeben echo ""; # und jetzt das Dokument ?> Lissajous-Figur zeichnen Lissajous-Figur zeichnen zufällig oder mit GET-Parametern gesteuert: dur ist die Animationsdauer in Sekunden (zwischen 20 und 1000 zu wählen, sonst ist sie 60). Da die Bogenlänge nur großzügig geschätzt ist, scheint die Zeichnung immer etwas vor dem Ende dieser Zeit vollendet zu sein, nach Ablauf der Zeit beginnt das Zeichnen von vorne. anz ist die Anzahl der Kontrollpunkte (zwischen 20 und 250 zu wählen, sonst ist sie 60). Bei niedrigen Werten für kx und ky reichen auch wenige Kontrollpunkte, bei hohen Werten muß auch anz hoch sein, sonst kommt es zu sichtbaren Fehlern bei der Darstellung. Mit 2Pi multipliziert ergeben ergeben kx und ky die Kreisfrequenzen (jeweils zwischen 1 und 30 zu wählen, sonst zufällig zwischen 1 und 5). Die Phasen werden immer zufällig bestimmt, damit keine Langeweile aufkommt. Nullpunkt festlegen, Pfad ausgeben.