100)){ $kanz=30; } } else { $kanz=30; } # Dämpfung if(isset($_GET['d'])) { $daem=$_GET['d']; if (($daem <= 0)OR($daem > 1)){ $daem=1; } } else { $daem=0.997; } # Wieviele Runden (bei Dämpfung nicht 1) if(isset($_GET['r'])) { $runden=$_GET['r']; if (($runden <= 0)OR($runden > 100)){ $runden=40; } } else { $runden=40; } if ($daem==1) { $runden=1; } # Wellenzahl/Bogenlänge if(isset($_GET['w'])) { $wz=$_GET['w']; if (($wz < -$kanz/2)OR($wz > $kanz/2)){ $wz=3; } } else { $wz=3; } # Amplitude #$au[0]=100; $au[1]=100; $au[2]=100; $au[3]=100; # Gewicht Interpolation $g=1; # Phase $phase=mt_rand(0,1000)/500*M_PI; # Kurvensegmente des Pfades in Ruhelage for ($k =-2; $k <=$kanz+2; $k++) { $u=$k/$kanz; #Ruhelage $p[$k]=700*cos($u*2*M_PI); $q[$k]=700*sin($u*2*M_PI); #Senkrechte Richtung. $ax[$k]=-sin($u*2*M_PI); $ay[$k]=cos($u*2*M_PI); #Amplitude $a[$k]=(1 - $u)**2*$au[1]+2*$u*(1 - $u)*$au[2]+$u*$u*$au[3]; } # Anzahl der Animationsschritte, Zeitablauf $janz=60*$runden; $pf=''; $dd=1; for ($j = 0; $j <=$janz; $j++) { #Zeitabhängigkeit $b=$j/$janz*2*M_PI*$runden; $pf.=''; $dd=$dd*$daem; for ($k = -2; $k <=$kanz+2; $k++) { # Ortsabhängigkeit $win=$k/$kanz*$wz*2*M_PI; #Welle $pa=$dd*$a[$k]*sin($win-$b+$phase); $px=$p[$k]-$pa*$ay[$k]; $py=$q[$k]+$pa*$ax[$k]; # Daten für die Interpolation $data[$k][0]=round($px,1); $data[$k][1]=round($py,1); } # erster Kontrollpunkt $diff[0][0]=round($data[0][0]+$g*($data[-2][0]-$data[2][0]+8*$data[1][0]-8*$data[-1][0])/36,1); $diff[0][1]=round($data[0][1]+$g*($data[-2][1]-$data[2][1]+8*$data[1][1]-8*$data[-1][1])/36,1); # wegen Kommando S werden dann nur noch die zweiten Kontrollpunkte gebraucht for ($k = 0; $k <= $kanz; $k++) { $km1=$k-1; $km2=$k-2; $kp1=$k+1; $kp2=$k+2; $diff[$k][2]=round($data[$k][0]-$g*($data[$km2][0]-$data[$kp2][0]+8*$data[$kp1][0]-8*$data[$km1][0])/36,1); $diff[$k][3]=round($data[$k][1]-$g*($data[$km2][1]-$data[$kp2][1]+8*$data[$kp1][1]-8*$data[$km1][1])/36,1); } # Daraus Pfad bestimmen $pfadb='M'.$data[0][0].' '.$data[0][1].'C'.$diff[0][0].' '.$diff[0][1].' '.$diff[1][2].' '.$diff[1][3].' '.$data[1][0].' '.$data[1][1]."S\n"; for ($k = 1; $k <=$kanz; $k++) { $pfadb.=$diff[$k][2].' '.$diff[$k][3].' '.$data[$k][0].' '.$data[$k][1]."\n"; } #$pfadb.=" z"; # Pfad eintragen $pf.=$pfadb; # Anfangspfad für Attribut d if ($j==0) { $pin=$pf; } # Fall noch Einträge für values folgen, Semikolon setzen if ($j!=$janz) { $pf.='; '; } } # Wenn keine Dämpfung vorliegt, können wir endlos weiterwackeln if ($daem==1) { $rd='repeatDur="indefinite"'; $dur=1; } else { $rd=''; $dur=$runden; } # svg-header senden: $content="Content-type: image/svg+xml; charset=UTF-8"; header($content); # xml-Zeile ausgeben echo ""; # und jetzt das Dokument ?> Welle: geschlossene Kurve Welle einer kubischen Kurve als Näherung eines Kreises in harmonischer Näherung. Bei starken Krümmungen und wenigen Stützpunkten, großen Amplituden zeigt sich deutlich die Grenze der Näherung. Parameter: Dämpfung d: 1 ohne Dämpfung, typisch um 0.995. Runden: r: größer als 0, maximal 100 (große Datei!), Anzahl der Schwingungen bei Dämpfung. Anzahl Stützpunkte s: mindestens 5, maximal 100 (große Datei!), Vorgabe 10. Wellenzahl/Bogenlänge w: Muß zwischen -s/2 und s/2 liegen, Vorgabe 2, für geschlossene Kurve ganzzahlig. Ist der Betrag der Wellenzahl s/2 oder größer, so ergäbe die Animation Unfug, siehe auch Nyquist-Shannon-Abtasttheorem, genauer ist ein Wert signifikant kleiner als die Grenze. Praktisch brauchbar sind Werte kleiner gleich s/4. fill="freeze" values=""/>