3600){ $dur=3600; } # Anzahl der Animationspunkte $anz=6000; if(isset($_GET['anz'])) { $anz=$_GET['anz']; } else { $anz=$dur*20; } if ($anz <10) { $anz=10; } elseif ($anz >32000){ $dur=32000; } #Anfangswerte: if(isset($_GET['x'])) { $x0=$_GET['x']; } else { $x0=mt_rand(100,1000)/100; } if(isset($_GET['y'])) { $y0=$_GET['y']; } else { $y0=mt_rand(100,1000)/100; } if(isset($_GET['z'])) { $z0=$_GET['z']; } else { $z0=mt_rand(100,1000)/100; } if(isset($_GET['t'])) { $t0=$_GET['t']; } else { $t0=0; } # Parameter if(isset($_GET['k'])) { $kw=$_GET['k']; } else { $kw=10; } if(isset($_GET['l'])) { $lw=$_GET['l']; } else { $lw=28; } if(isset($_GET['m'])) { $mw=$_GET['m']; } else { $mw=8.0/3.0; } # Skalierung if(isset($_GET['s'])) { $skale=$_GET['s']; } else { $skale=0.16; } # Drehung phi um Vektor (vp, vq, vr) (Einheitsvektor) if(isset($_GET['p'])) { $vp=$_GET['p']; } else { $vp = mt_rand(0,1000)/1000; } if(isset($_GET['q'])) { $vq=$_GET['q']; } else { $vq = mt_rand(0,1000)/1000; } if(isset($_GET['r'])) { $vr=$_GET['r']; } else { $vr = mt_rand(0,1000)/1000; } if(isset($_GET['o'])) { $phigrad=$_GET['o']; } else { $phigrad=mt_rand(0,359); } $phi=$phigrad/180.0*M_PI; # Drehung um phi #x' = (t p p + c) x + (t p q - s r) y + (t p r + s q) z #y' = (t p q + s r) x + (t q q + c) y + (t q r - s p) z #z' = (t p r - s q) x + (t r q + s p) y + (t r r + c) z #mit s = sin(phi), c = cos(phi) und t = 1 - cos(phi) $vb=sqrt($vp*$vp+$vq*$vq+$vr*$vr); if ($vb != 0) { $vp = $vp/$vb; $vq = $vq/$vb; $vr = $vr/$vb; } else { $vp = 1; $vq = 0; $vr = 0; } $rs=sin($phi); $rc=cos($phi); $rt = 1 - cos($phi); # Funktion definieren function funcdgl ($t,$x1,$x2,$x3,&$kutta1,&$kutta2,&$kutta3) { global $kw,$lw,$mw; $kutta1=$kw*($x2-$x1); $kutta2=$lw*$x1-$x2-$x1*$x3; $kutta3=$x1*$x2-$mw*$x3; return TRUE; } # stroke-dasharray-Weglaenge $ssum = 0; # Pfad berechnen $x1=$x0; $x2=$y0; $x3=$z0; $zz=$x3-$lw+1; $px=($rt*$vp*$vp + $rc)*$x1 + ($rt*$vp*$vq - $rs* $vr)*$x2 + ($rt*$vp*$vr + $rs*$vq)*$zz; $py=($rt*$vp*$vq + $rs*$vr)*$x1 + ($rt*$vq*$vq + $rc)*$x2 + ($rt*$vq*$vr - $rs*$vp)*$zz; # Ausgabe vorbereiten $px=round($px*$skale,2); $py=round($py*$skale,2); $pfad="M$px,$py"."L"; $dash="0,3E4"; $ddt=$dur/$anz; $vorherx=$px; $vorhery=$py; # Schrittweite fest: $dt=0.01; # dgl loesen for ($j = 1; $j <= $anz; $j++) { $t=$ddt*$j+$t0; $kutta1=funcdgl($t,$x1,$x2,$x3,$kutta11,$kutta21,$kutta31); $kutta2=funcdgl($t+$dt/2,$x1+$dt*$kutta11/2.0,$x2+$dt*$kutta21/2.0,$x3+$dt*$kutta31/2.0,$kutta12,$kutta22,$kutta32); $kutta3=funcdgl($t+$dt/2,$x1+$dt*$kutta12/2.0,$x2+$dt*$kutta22/2.0,$x3+$dt*$kutta32/2.0,$kutta13,$kutta23,$kutta33); $kutta4=funcdgl($t+$dt,$x1+$dt*$kutta13,$x2+$dt*$kutta23,$x3+$dt*$kutta33,$kutta14,$kutta24,$kutta34); $x1=$x1 +$dt*($kutta11+$kutta14+2.0*$kutta12+2.0*$kutta13)/6; $x2=$x2 +$dt*($kutta21+$kutta24+2.0*$kutta22+2.0*$kutta23)/6; $x3=$x3 +$dt*($kutta31+$kutta34+2.0*$kutta32+2.0*$kutta33)/6; # Divergenzen abfangen $x1=min(3.27e4,max(-3.27e4,$x1)); $x2=min(3.27e4,max(-3.27e4,$x2)); $x3=min(3.27e4,max(-3.27e4,$x3)); # Drehung $zz=$x3-$lw+1; $px=($rt*$vp*$vp + $rc)*$x1 + ($rt*$vp*$vq - $rs* $vr)*$x2 + ($rt*$vp*$vr + $rs*$vq)*$zz; $py=($rt*$vp*$vq + $rs*$vr)*$x1 + ($rt*$vq*$vq + $rc)*$x2 + ($rt*$vq*$vr - $rs*$vp)*$zz; # Ausgabe vorbereiten if (($j % 10) ==9) { $pfad .="\n"; $dash .="\n"; } $px=round($px*$skale,2); $py=round($py*$skale,2); $pfad .=" $px,$py"; # Pfadrechnerei $hx=$px-$vorherx; $hy=$py-$vorhery; $ssum = $ssum+sqrt($hx*$hx+$hy*$hy); $vorherx=$px; $vorhery=$py; $psum=round($ssum,2); $dash .=";$psum,3E4"; } # svg-header senden: $content="Content-type: image/svg+xml"; header($content); # Automatisches Neuladen, muss nicht funktionieren! if ($auto=="ja") { $dura=$dur; $content="refresh: $dura; url=lorenz2tiny.php?auto=ja&dur=$dur&x=$x1&y=$x2&z=$x3&t=$t&k=$kw&l=$lw&m=$mw&s=$skale&o=$phigrad&p=$vp&q=$vq&r=$vr"; } # Sicherstellen dass dann auch neu vom server geladen wird: header($content); # Bild in Speicher schreiben ob_start(); # xml-Zeile ausgeben echo ""; # und jetzt das Dokument ?> Lorenz-Attraktor Animation des Lorenz-Attraktors. Mittels der Knöpfe rechts unten (oder der entsprechenden GET-Parameter) kann Einfluß drauf genommen werden, ob die Animation fortgesetzt werden soll, automatisch fortgesetzt oder neu gestartet werden soll. Mittels der GET-Parameter kann man im Bedarfsfalle auch die Startposition und die Parameter selbst festlegen. s ist ein Skalierungsparameter, dur die Animationsdauer in Sekunden (optional anz die Anzahl der Animationspunkte, per Voreinstellung 20*dur). Differentialgleichung: dx/dt = k(y-x) dy/dt = l x - y - x z dz/dt = x y - m z Um die Richtung (x, y, z) = (p, q, r) wird das Problem um den Winkel o (in Grad) gedreht. \n"; } else { echo " \n"; } # Bewegten Kreis zeigen oder nicht? if ($kr){ echo " "; } ?> " xlink:title="Fortsetzen"> " xlink:title="Neu starten und dann jeweils nach Ablauf der Animation automatisch neu starten (muß nicht bei allen Darstellungsprogrammen funktionieren)"> " xlink:title="Neue Animation starten, weiteren automatischen Neustart unterbinden"> O H 2007