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; # 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 # da df/di = df/dx dx/di $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 Lissajous-Figur zufällig oder mit GET-Parametern gesteuert: 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.