1000)){ $dur=60; } # Anzahl der Kurvenstuecke if(isset($_GET['anz'])) { $anz=$_GET['anz']; } else { $anz=400; } if (($anz < 50) or ($anz > 1001)){ $anz=400; } $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; # Bogen aufsummieren beginnen $summe =0; $arc[0]=0; # erster Kontrollpunkt $kx=round($xabl/3.0,1); $ky=round($yabl/3.0,1); $pfad1="M$px,$py c$kx,$ky "; $values="$px,$py"; $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; # Bogen grob schaetzen $summe = $summe + sqrt($xabl*$xabl+$yabl*$yabl); $arc[$i]=$summe; # 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"; $values .=";$px,$py"; } # Bogen schaetzen fuer stroke-dashoffset-Animation: $bogen=$summe; $dashoffset=""; for ($i = 0; $i <= $anz; $i++) { #$ii=$anz-$i; $arci=round($bogen-$arc[$i],1); if ($anz == $i) { $dashoffset.="$arci"; } else { $dashoffset.="$arci;"; } } $arc=0; $bogen=round($summe,1); # 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). Die Bogenlänge wird nur näherungsweise berechnet. Die orange Trajektorie hat eine konstante Malgeschwindigkeit, die blaue entspricht der näherungsweise berechneten Lissajous-Figur. Der animierte Kreis gibt näherungsweise die Bewegung eines Objektes wieder, welches eine Lissajous-Bewegung ausführt. 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. Bewegung animieren. Das animierte Objekt. Trajektorie mit gleichmäßiger Geschwindigkeit gemalt. Trajektorie gemäß genähert berechneter Geschwindigkeit gemalt. O H 2006