10000) ){ $bereich=1000; } } else { $bereich=1000; } if(isset($_GET['anteil'])) { $anteil=$_GET['anteil']; if (($anteil < 0)OR($anteil > 1) ){ $anteil=0.5; } } else { $anteil=0.5; } # Integral berechnen - man beachte, wenn # x0 und y0 auf 0 gesetzt werden, kann auch # ein Integral fuer relative Kommandos q bestimmt werden. function integral ($f,$x0,$y0,$x1,$y1,$x2,$y2) { if ($f>1) { $f=1; } if ($f<=0) { return 0; } else { $sx=2*($x0-2*$x1+$x2); $sy=2*($y0-2*$y1+$y2); $tx=2*(-$x0+$x1); $ty=2*(-$y0+$y1); $a=$sx*$sx+$sy*$sy; $b=2*($sx*$tx+$sy*$ty); $c=$tx*$tx+$ty*$ty; if ($a ==0) { if ($b==0) { echo 'doof'; return $f*sqrt($c); } else { echo 'doof'; $wu0=2/3/$b*sqrt($c); $dummy=$b*$f+$c; $dummy=$dummy*$dummy*$dummy; $wuf=2/3/$b*sqrt($dummy); return $wuf - $wu0; } } else { $u=0; $dummy=sqrt($a*$u*$u+$b*$u+$c); $wu0=0.25*(2*$a*$u+$b)/$a*$dummy + (4*$a*$c - $b*$b)/8/$a/sqrt($a)*log(2*sqrt($a)*$dummy+2*$a*$u+$b); $u=$f; $dummy=sqrt($a*$u*$u+$b*$u+$c); $wuf=0.25*(2*$a*$u+$b)/$a*$dummy + (4*$a*$c - $b*$b)/8/$a/sqrt($a)*log(2*sqrt($a)*$dummy+2*$a*$u+$b); return ($wuf - $wu0); } } } # quadratische Kurve, Wurzel aus dem Quadrat der Ableitungen function quadratisch ($u,$x0,$y0,$x1,$y1,$x2,$y2) { $u1=1-$u; # x- und y-Komponenten der Ableitungen $cx=-2*$u1*$x0+2*(1-2*$u)*$x1+2*$u*$x2; $cy=-2*$u1*$y0+2*(1-2*$u)*$y1+2*$u*$y2; $cc=sqrt($cx*$cx+$cy*$cy); return $cc; } # bei welchem u ist die Teilweglaenge gleich $f? # Bestimmung nach Newton... function wo ($diff,$f,$x0,$y0,$x1,$y1,$x2,$y2) { # Gesamtlaenge und Startwert raten $u0=1; $w0=integral ($u0,$x0,$y0,$x1,$y1,$x2,$y2); $ui=$f; # Schleife mit Newtonregel do { $wi=integral ($ui,$x0,$y0,$x1,$y1,$x2,$y2); $test=$wi/$w0; $ableitung=quadratisch ($ui,$x0,$y0,$x1,$y1,$x2,$y2); if ($ableitung!=0) { $ui=$ui+($f-$test)*$w0/$ableitung; } else { # vorsichtshalber, # sollte eigentlich bei einer Weglaenge nicht passieren $ui=$ui+($f-$test); } $difi=abs($f-$test); #echo "$test *\n"; } while ($difi>$diff); return $ui; } # quadratischen Pfad zufaellig waehlen $x0=mt_rand(-$bereich,$bereich); $y0=mt_rand(-$bereich,$bereich); $x1=mt_rand(-$bereich,$bereich); $y1=mt_rand(-$bereich,$bereich); $x2=mt_rand(-$bereich,$bereich); $y2=mt_rand(-$bereich,$bereich); # grosse viewBox automatisch bestimmen $maxx=max($x0,$x1,$x2); $minx=min($x0,$x1,$x2); $maxy=max($y0,$y1,$y2); $miny=min($y0,$y1,$y2); $vbx=$minx-15; $vby=$miny-15; $vbw=$maxx-$minx+30; $vbh=$maxy-$miny+30; # Integral ueber gesamte Weglaenge: $int= integral (1,$x0,$y0,$x1,$y1,$x2,$y2); # Bis wohin Teilintegral? #$u=mt_rand(100,900)/1000; # Schaetzen, bei welchem u der gewuenschte Anteil vorliegt $u=wo (1e-12,$anteil,$x0,$y0,$x1,$y1,$x2,$y2); # Teilintegral ausrechnen $intf= integral ($u,$x0,$y0,$x1,$y1,$x2,$y2); # Anteil an der gesamten Weglaenge bestimmen $frac=$intf/$int; # einige Hilfsgroessen $intr=$int-$intf; $ints=$intf-13; $intc=$intf-0.00005; # So sieht der Pfad aus $pfad="M$x0,$y0 Q$x1,$y1,$x2,$y2"; # cx(u) und cy(u) fuer den Punkt u berechnen $u1=1-$u; $u2=$u1*$u1; $u3=$u*$u; $cx=$u2*$x0+2*$u*$u1*$x1+$u3*$x2; $cy=$u2*$y0+2*$u*$u1*$y1+$u3*$y2; # kleine viewBox bestimmen $svx=$cx-14; $svy=$cy-14; $vb="$svx $svy 28 28"; # statische viewBox bestimmen $stvx=$cx-100; $stvy=$cy-100; $stvb="$stvx $stvy 200 200"; # und nun geht es los... # header senden: $content="Content-type: image/svg+xml"; header($content); echo ''; ?> " xmlns="http://www.w3.org/2000/svg" version="1.1" baseProfile="tiny" xmlns:xlink="http://www.w3.org/1999/xlink" xml:lang="de"> Kurvenlänge quadratische Kurve Testen, wie genau Darstellungsprogramme Kurven, die Kurvenlänge und Verwandte berechnen. Der GET-Parameter 'bereich' bestimmt den Bereich, in dem die Kurve zufällig gewählt wird. Ein korrektes Ergebnis besteht aus einer dunkelblauen Kurve, die teilweise von einer magenta Kurve verdeckt wird. Wo die magenta Kurve endet, ist ein gelber Kreis. Über diesem befinden sich sieben schwarze Kreise (nach einer kurzen Animation). Kreise und Pfade haben an der Stelle gleiche Abstände voneinander, die Kreise sind konzentrisch. Druebergelegt ist ein dunkelblau-gelber Maßstab, bei welchem das Muster in der Mitte des Maßstabes genau passen muß (Ausnahme starke Krümmung der Kurve an dieser Stelle)- gelb auf gelb, dunkelblau auf dunkelblau in der Mitte, außen einmal dunkelblau auf magenta und ein Abschluß in gelb. Nach 5s wird der gelbe Kreis mit den konzentrischen Ringen im Bild vergrößert und zentriert. "/> " to="" fill="freeze" calcMode="spline" keySplines="0 0 0 1" /> Die zu untersuchende Kurve. Kurvenlänge: Gemalter Kurventeil: Anteil: Kontrollpunkt Gemalter Kurventeil Kurvenanfangspunkt Kurvenendpunkt Endpunkt des gemalten Kurventeils Testpunkt 'repeatCount' Testpunkt 'repeatDur' Testpunkt 'end' Testpunkt 'max' Testpunkt 'min' Testpunkt 'discrete, keyPoints' Testpunkt 'linear, keyPoints' " d=""> Testpunkt stroke-dasharray " stroke-dashoffset="-" d="" > stroke-dasharray, stroke-dashoffset " d=""> Testmaßstab