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=1; } } else { $runden=40; } if ($daem==1) { $runden=1; } $typ='Saite'; # Wellenzahl/Bogenlänge if(isset($_GET['w'])) { $wz=$_GET['w']; if (($wz < -$kanz/2)OR($wz > $kanz/2)){ $wz='un'; } } else { $wz='un'; } if ($typ=='Saite') { $x[1]=0; $y[1]=500; $x[2]=400; $y[2]=500; $x[3]=800; $y[3]=500; $x[4]=1200; $y[4]=500; # Wellenzahl - bezogen auf die Länge des Stabes if ($wz=='un') { $wz=(2*mt_rand(0,1)-1)*mt_rand(1,1000)/100; } } # Gewicht Interpolation $g=1; # Phase $phase1=mt_rand(0,1000)/500*M_PI; $phase2=mt_rand(0,1000)/500*M_PI; #Schwebung $schweb=1+(1-2*mt_rand(0,1))*mt_rand(1,1000)/1000; #Amplitude $a1=mt_rand(100,300); $a2=mt_rand(100,300); # Kurvensegmente des Pfades in Ruhelage for ($k = 0; $k <=$kanz; $k++) { $u=$k/$kanz; #Ruhelage $p[$k]=(1 - $u)**3*$x[1] + 3*$u*(1-$u)**2*$x[2] + 3*$u**2*(1-$u)*$x[3] + $u**3*$x[4]; $q[$k]=(1 - $u)**3*$y[1] + 3*$u*(1-$u)**2*$y[2] + 3*$u**2*(1-$u)*$y[3] + $u**3*$y[4]; # Ableitung, daraus senkrechte Richtung $ax[$k] = (1 - $u)**2 *(3*$x[2] - 3*$x[1]) + 2*$u*(1-$u)*(3*$x[3] - 3*$x[2]) + $u**2*(3*$x[4] - 3*$x[3]); $ay[$k] = (1 - $u)**2 *(3*$y[2] - 3*$y[1]) + 2*$u*(1-$u)*(3*$y[3] - 3*$y[2]) + $u**2*(3*$y[4] - 3*$y[3]); $al=sqrt($ax[$k]*$ax[$k]+$ay[$k]*$ay[$k]); if ($al==0) { $ax[$k]=0; $ay[$k]=0; } else { $ax[$k]=$ax[$k]/$al; $ay[$k]=$ay[$k]/$al; } } # 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; $c=$j/$janz*2*M_PI*$runden*$schweb; $pf.=''; $dd=$dd*$daem; for ($k = 0; $k <=$kanz; $k++) { # Ortsabhängigkeit $win=$k/$kanz*$wz*2*M_PI; # Welle $pa=$dd*($a1*sin($win-$b+$phase1)+$a2*sin($win-$c+$phase2)); $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); } # Schätzung der Ableitung, erst Randpunkte, danach die in der Mitte $diff[0][0]=round($data[0][0]+$g*(-3*$data[0][0]+4*$data[1][0]-$data[2][0])/6,1); $diff[0][1]=round($data[0][1]+$g*(-3*$data[0][1]+4*$data[1][1]-$data[2][1])/6,1); $diff[0][2]=round($data[0][0]-$g*(-3*$data[0][0]+4*$data[1][0]-$data[2][0])/6,1); $diff[0][3]=round($data[0][1]-$g*(-3*$data[0][1]+4*$data[1][1]-$data[2][1])/6,1); $diff[1][2]=round($data[1][0]-$g*(-3*$data[0][0]-10*$data[1][0]+18*$data[2][0]-6*$data[3][0]+$data[4][0])/36,1); $diff[1][3]=round($data[1][1]-$g*(-3*$data[0][1]-10*$data[1][1]+18*$data[2][1]-6*$data[3][1]+$data[4][1])/36,1); $diff[$kanz][2]=round($data[$kanz][0]+$g*(-3*$data[$kanz][0]+4*$data[$kanz-1][0]-$data[$kanz-2][0])/6,1); $diff[$kanz][3]=round($data[$kanz][1]+$g*(-3*$data[$kanz][1]+4*$data[$kanz-1][1]-$data[$kanz-2][1])/6,1); $diff[$kanz-1][2]=round($data[$kanz-1][0]+$g*(-3*$data[$kanz][0]-10*$data[$kanz-1][0]+18*$data[$kanz-2][0]-6*$data[$kanz-3][0]+$data[$kanz-4][0])/36,1); $diff[$kanz-1][3]=round($data[$kanz-1][1]+$g*(-3*$data[$kanz][1]-10*$data[$kanz-1][1]+18*$data[$kanz-2][1]-6*$data[$kanz-3][1]+$data[$kanz-4][1])/36,1); for ($k = 2; $k <= ($kanz-2); $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 = 2; $k <=$kanz; $k++) { $pfadb.=$diff[$k][2].' '.$diff[$k][3].' '.$data[$k][0].' '.$data[$k][1]."\n"; } # 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=10; } else { $rd=''; $dur=10*$runden; } # svg-header senden: $content="Content-type: image/svg+xml; charset=UTF-8"; header($content); # xml-Zeile ausgeben echo ""; # und jetzt das Dokument ?> Welle, zeitliche Schwebung Zeitliche Schwebung einer Welle in harmonischer Näherung. Bei 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 abhängig vom Typ 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=""/>