100)){ $kanz=10; } } else { $kanz=10; } # 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, Angel, Bogen, Welle, Schlaufe if(isset($_GET['t'])) { $typ=$_GET['t']; if (($typ !='Angel')AND($typ !='Bogen')AND($typ !='Welle')AND($typ !='Schlaufe')){ $typ='Saite'; } } else { $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=='Angel') { $x[1]=0; $y[1]=900; $x[2]=100; $y[2]=400; $x[3]=400; $y[3]=0; $x[4]=1200; $y[4]=100; # Amplitude $au[0]=0; $au[1]=10; $au[2]=30; $au[3]=60; # Wellenzahl - bezogen auf die Länge des Stabes if ($wz=='un') { $wz=0.75; } } elseif ($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; # Amplitude $au[0]=400; $au[1]=0; $au[2]=0; $au[3]=0; # Wellenzahl - bezogen auf die Länge des Stabes if ($wz=='un') { $wz=1.25; } } elseif ($typ=='Bogen') { $x[1]=0; $y[1]=50; $x[2]=270; $y[2]=800; $x[3]=930; $y[3]=800; $x[4]=1200; $y[4]=50; # Amplitude $au[0]=300; $au[1]=0; $au[2]=0; $au[3]=0; # Wellenzahl - bezogen auf die Länge des Stabes if ($wz=='un') { $wz=0.5; } } elseif ($typ=='Welle') { $x[1]=0; $y[1]=50; $x[2]=0; $y[2]=1800; $x[3]=1200; $y[3]=-800; $x[4]=1200; $y[4]=950; # Amplitude $au[0]=100; $au[1]=0; $au[2]=0; $au[3]=0; # Wellenzahl - bezogen auf die Länge des Stabes if ($wz=='un') { $wz=1; } } elseif ($typ=='Schlaufe') { $x[1]=0; $y[1]=100; $x[2]=2800; $y[2]=1100; $x[3]=-1600; $y[3]=1100; $x[4]=1200; $y[4]=100; # Amplitude $au[0]=100; $au[1]=0; $au[2]=0; $au[3]=0; # Wellenzahl - bezogen auf die Länge des Stabes if ($wz=='un') { $wz=0.5; } } # Gewicht Interpolation $g=1; # Phase $phase=mt_rand(0,1000)/500*M_PI; # Punkte Bogen, Kettenlinie $kl=' '; # Kurvensegmente des Pfades in Ruhelage for ($k = 0; $k <=$kanz; $k++) { $u=$k/$kanz; # Kurve $ku=-1+2*$u; $kx=round($u*1200); $ky=round((1-(10**$ku+10**(-$ku))/10.1)*700+50); $kl.=" "; #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; } #Amplitude $a[$k]=$au[0]+(1 - $u)*$au[1]+$u*$au[2]+$u*$u*$au[3]; } $kl.=''; if ($typ!='Bogen') { $kl=''; } # 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 = 0; $k <=$kanz; $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); } # 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: Welle auf einer kubischen Kurve in harmonischer Näherung. Die Kurve ist jeweils links fixiert, hat rechts ein loses Ende. Bei starken Krümmungen und wenigen Stützpunkten, großen Amplituden zeigt sich deutlich die Grenze der Näherung, siehe insbesondere die Typen Welle und Schlaufe. Parameter: Typ t: Saite, Bogen, Angel, Welle, Schlaufe Saite - Gleichgewichtskurve ist eine Gerade Bogen - Näherungsweise eine Kettenlinie, etwas wie ein Gummiband; die roten Kreise geben den eigentlich korrekten Verlauf einer Kettenlinie oder Seilkurve an, welche durch den Bogen angenähert wird. Angel - Ähnlich einer Angelrute Welle - s-förmige Kurve Schlaufe - stark gekrümmte Kurve 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=""/>