Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Wie ist das zu interpretieren?
Wenn man im Intervall [0, 1] mit numApproximationPoints = 1 abtastet, ist das dann der Wert an Stelle 0.5? Oder sollen dabei die drei Werte an den Stellen 0, 0.5 und 1 zurueckgegeben werden?
Ziel des Midpoint-Subdivison-Algorithmus ist es, eine Punktemenge zu finden, die eine bestimmte Bezierkurve annähert.
Ein einzelner Subdivision-Schritt bekommt eine Liste mit n Kontrollpunkten als Argument übergeben und gibt zwei Listen mit jeweils n Kontrollpunkten zurück. Die beiden zurückgegebenen Listen werden die “linke” bzw. “rechte” genannt. Sie knüpfen nahtlos aneinander an und ihre Punkte sind grob entlang der gesuchten Bezier-Kurve ausgerichtet.
Auf die linke und rechte Liste kann nun jeweils wieder ein Subdivision-Schritt angewendet werden. Das Ergebnis sind vier Listen, die die Bezierkurve noch besser annähern als die beiden Listen aus dem vorherigen Schritt. Usw…
Hier mal ein einzelner Subdivision-Schritt als Zeichnung:
Die vier schwarzen Punkte sind die Kontrollpunkte der Eingabe-Bezier-Kurve (hier vom Grad 3). Nun wird in insgesamt drei Schritten (grün, blau, rot) Decasteljau mit t=1/2 ausgeführt. Wichtig ist, dass der jeweils nächste Schritt von Decasteljau immer nur auf die im vorherigen Decasteljau-Schritt entstandenen Punktmengen angewendet wird. Wenn man nun von allen eingezeichneten Punktemengen (schwarz, grün, blau, rot. in dieser Reihenfolge) jeweils den ersten und letzten Punkt hernimmt, dann entstehen die lila bzw. orange umrandeten Ausgabe-Listen (linke bzw. rechte).
Man kann gut sehen, dass die beiden Ausgabe-Listen wieder aus jeweils vier Punkten bestehen und damit wieder je eine Bezier-Kurve vom Grad 3 beschreiben.
erstmal vielen Dank für die schnelle Antwort.
Ja deCasteljau wird schon gebraucht vermute ich.
Ich habe noch eine kleine Frage bezüglich curDepth:
am Anfang ist sie ja 0, aber später wenn man subdivision im rekursiven Fall aufruft , was für Wert nimmt sie ?
sorry dass ich vorher meine Frage nicht genau erklärt habe.
CurDepth wird im rekursiven Funktionsaufruf immer um 1 erhöht. Wenn du irgendwann mal maxDepth mal diese Funktion aufgerufen hast, dann kehrt sie aus der Rekursion wieder zurück.
Beispiel:
void rec(unsigned int curDepth, unsigned int maxDepth) {
if (curDepth == maxDepth) {
// No further recursion
std::cout << curDepth << "No further recursion" << std::endl;
}
else {
// Do some stuff before recursive call
std::cout << curDepth << std::endl;
// Recursion
rec(curDepth + 1, maxDepth);
// Do some stuff after recursion
std::cout << curDepth * 1000 << std::endl;
}
}
Ruft man diese Funktion mit curDepth = 0 und maxDepth = 3 auf, ist der Output:
Unstimmigkeiten mit vorherigen Posts bei der Approximation mit 5 Punkten. Rein optisch sehe ich jedoch bei mir kein Unterschied zur Referenzimplementierung.
Kann das so stimmen?
2.:
Genau, also (x,y,z), ist jedoch imho sehr unglücklich formuliert, habe aber auch erst etwas darüber gegrübelt.
Ich habs einfach zeilenweise gemacht und kriege das gleiche Ergebnis wie die Referenzimplementierung (wieder rein optisch).