10000) ){ $bereich=1000; } } else { $bereich=1000; } # kubische Kurve, Wurzel aus dem Quadrat der Ableitungen function kubisch ($u,$x0,$y0,$x1,$y1,$x2,$y2,$x3,$y3) { $u1=1-$u; $u2=$u1*$u1; $u3=$u1*$u2; $u4=$u*$u; $u5=$u4*$u; $u6=$u2*3*$u; $u7=$u4*3*$u1; # x- und y-Komponenten der Ableitungen $cx=-3*$u2*$x0+3*(1-4*$u+3*$u4)*$x1+3*(2*$u-3*$u4)*$x2+3*$u4*$x3; $cy=-3*$u2*$y0+3*(1-4*$u+3*$u4)*$y1+3*(2*$u-3*$u4)*$y2+3*$u4*$y3; $cc=sqrt($cx*$cx+$cy*$cy); return $cc; } # Integral berechnen - man beachte, wenn # x0 und y0 auf 0 gesetzt werden, kann auch # ein Integral fuer relative Kommandos c bestimmt werden. function integral ($n,$f,$x0,$y0,$x1,$y1,$x2,$y2,$x3,$y3) { if ($f>1) { $f=1; } if ($f<=0) { return 0; } else { # Randpunkte aufsummieren $rand=kubisch (0,$x0,$y0,$x1,$y1,$x2,$y2,$x3,$y3) + kubisch ($f,$x0,$y0,$x1,$y1,$x2,$y2,$x3,$y3); # gucken, dass Anfangsstuetzstellenzahl nicht zu klein ist: $n=max(10,$n); # schlecht geschaetzte Weglaenge: $sumse=0; do { # Schrittweite $s=$f/(2*$n); # Summe gerade und ungerade Stuetzstellen $sg=0; $su=0; for ($i = 1; $i < $n; $i++) { $ug=$i*$f/$n; $sg=kubisch ($ug,$x0,$y0,$x1,$y1,$x2,$y2,$x3,$y3)+$sg; } for ($i = 1; $i <= $n; $i++) { $uu=(2*$i-1)*$s; $su=kubisch ($uu,$x0,$y0,$x1,$y1,$x2,$y2,$x3,$y3)+$su; } # Integral ausrechnen $sum= ($rand+4*$su+2*$sg)*$s/3; # Differenz zur vorherigen Schaetzung $sumd=abs($sumse-$sum); $sumse=$sum; # Wenn klein genug, dann aussteigen, sonst weiter mit verdoppelter Stuetzstellenzahl $n=$n*2; } while ($sumd<1e-10); return $sum; } } # kubischen 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); $x3=mt_rand(-$bereich,$bereich); $y3=mt_rand(-$bereich,$bereich); # grosse viewBox automatisch bestimmen $maxx=max($x0,$x1,$x2,$x3); $minx=min($x0,$x1,$x2,$x3); $maxy=max($y0,$y1,$y2,$y3); $miny=min($y0,$y1,$y2,$y3); $vbx=$minx-15; $vby=$miny-15; $vbw=$maxx-$minx+30; $vbh=$maxy-$miny+30; # Integral ueber gesamte Weglaenge: $int= integral (10,1,$x0,$y0,$x1,$y1,$x2,$y2,$x3,$y3); # Bis wohin Teilintegral? $u=mt_rand(100,900)/1000; # Teilintegral ausrechnen $intf= integral (10,$u,$x0,$y0,$x1,$y1,$x2,$y2,$x3,$y3); # 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 C$x1,$y1,$x2,$y2,$x3,$y3"; # cx(u) und cy(u) fuer den Punkt u berechnen $u1=1-$u; $u2=$u1*$u1; $u3=$u1*$u2; $u4=$u*$u; $u5=$u4*$u; $u6=$u2*3*$u; $u7=$u4*3*$u1; $cx=$u3*$x0+$u6*$x1+$u7*$x2+$u5*$x3; $cy=$u3*$y0+$u6*$y1+$u7*$y2+$u5*$y3; # 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 kubische 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. Drübergelegt 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 1 Kontrollpunkt 2 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