Seite 1 von 1

Quadratisches Spline 2 Bezier

Verfasst: 24.06.2021, 16:57
von Mirror
Hallo,


ich habe einen Algorythmus( Formel ) entwickelt bei der man aus einem quadratischem Spline eine kubische Bezierkurve machen kann. DIe Bezierkurve läuft bei 0 und 0.5 und 1.0 durch die selben Punkte wie das quadratische Spline. Leider aber nicht bei allen anderen Werten, hier weicht sie davon ab.

Ist es überhaupt möglich eine quadratisches Spline durch eine kubische Bezierkurve zu ersetzen ?

Re: Quadratisches Spline 2 Bezier

Verfasst: 24.06.2021, 17:21
von xq
Spontan würde ich sagen: Nein, es ist nicht möglich, kann es aber nicht begründen

Re: Quadratisches Spline 2 Bezier

Verfasst: 24.06.2021, 18:06
von Mirror
Das wäre echt traurig, denn das bedeutet das ich keine Bezierkurven verwenden kann. Vllt. sollte ich aus dem quadratischem Spline ein kubisches machen und versuchen für diesen Fall eine Formel zu finden.

Re: Quadratisches Spline 2 Bezier

Verfasst: 24.06.2021, 18:16
von Lord Delvin
Wenn deine Punkte auf einer Geraden lägen würde es wohl gehen ;)

Was genau willst du erreichen?

Re: Quadratisches Spline 2 Bezier

Verfasst: 24.06.2021, 18:43
von Mirror
Ich möchte bei einem CAD Programm Bezierkurven anbieten. Dabei soll bei der Umwandlung des Kurventypes die Kurve gleichbleiben.

Re: Quadratisches Spline 2 Bezier

Verfasst: 24.06.2021, 20:26
von joeydee
Das geht. Stackoverflow: https://stackoverflow.com/questions/316 ... -cubic-one

Man muss beide Handles auf den Handle der Quadratic-Kurve legen und jeweils um 1/3 verkürzen, dann sind sie deckungsgleich.
("Handles" sind jeweils die mittleren Kontrollpunkte, im Gegensatz zu Start- und Endpunkt, die Bestandteil der Kurve bleiben)

Konkret: Wenn q0,q1,q2 die Kontrollpunkte der quadratischen Bezierkurve sind, und c0,c1,c2,c3 die der kubischen werden sollen, heißen deren Handles q1 bzw. c1,c2.
Dann gilt:
c0=q0 (Startpunkt)
c1=(q1-q0)*2/3+q0 (Handle 1)
c2=(q1-q2)*2/3+q2 (Handle 2)
c3=q2 (Endpunkt)

bezier_quadratic_cubic.jpg

Re: Quadratisches Spline 2 Bezier

Verfasst: 24.06.2021, 21:32
von Jonathan
xq hat geschrieben: 24.06.2021, 17:21 Spontan würde ich sagen: Nein, es ist nicht möglich, kann es aber nicht begründen
Was halt oft geht ist über die Dimensionalität, d.h. die Freiheitsgrade nachzudenken. Wenn kubische Splines mehr Parameter haben als Quadratische, dann erscheint es zumindest mal plausibel, dass quadratische Splines eine echte Untermenge sind, man also zu jeder eine kubische Spline finden kann, die gleich aussieht. (Dass das dann tatsächlich auch geht, müsste man aber noch zeigen). Umgekehrt ist klar, dass man nicht jede kubische Spline durch eine quadratische ersetzen kann. Einfach, weil man dafür zu wenig Parameter hat. Das wäre nur dann möglich, wenn einige Freiheitsgrade 'virtuell' sind, so wie beispielsweise ein Dreieck im dreidimensionalen Raum immer noch nur 2 Parameter hat, man also jeden Punkt auf ihn auch mit 2 anstatt 3 Parametern beschreiben kann.
Diese Dimensionsüberlegung lässt sich auch super viele Probleme anwenden und ist daher sehr nützlich. Zum Beispiel erklärt das auch sofort, warum es sehr leicht ist, Bilder kleiner zu skalieren, aber es super schwer ist, sie danach wieder größer zu machen, ohne das sie matschig aussehen.

Re: Quadratisches Spline 2 Bezier

Verfasst: 25.06.2021, 04:14
von Mirror
@joeydee

Ich habe die Formel(n) ausprobiert und komme nur bei den Endpunkten auf die gesuchten Ergebnisse. Es scheint nicht zu funktionieren. Bei meinen Formeln stimmt wenigstens noch die 0.5 und bei mir sieht die Formel schon ein wenig anders aus.

Re: Quadratisches Spline 2 Bezier

Verfasst: 25.06.2021, 07:26
von joeydee
Dann zeig am besten mal einen Plot, wo (durch meine Formeln) jeweils deine Kontrollpunkte sind und wo die alten und neuen Kurvenpunkte im Vergleich zu liegen kommen.
Dass es prinzipiell geht, zeigt ja mein Bild, das ist nicht aus dem Internet, sondern ein eigener Test (und war nicht der einzige). Nicht nur der Kurvenverlauf an sich, auch die Kurvenabschnitte sind deckungsgleich.

Es gibt natürlich eine rechnerische Abweichung, bei mir im Bereich von E-05 (bei Koordinaten im Bereich von mehreren hundert Einheiten in Float), d.h. man sollte zum rein numerischen Vergleich keinen == Test, sondern einen Differenztest machen, was ja bei Fließkomma grundsätzlich empfehlenswert ist.
Kontrolltest hierzu: 1000f*(2f / 3f) - 1000f*(1f - 1f / 3f)) // 6,103516E-05

Ich hänge auch mal Code mit an, auf lineare Gleichungen runtergebrochen:

Code: Alles auswählen

        //any quadratic control points
        Vector q0 = new Vector(-600, 230);
        Vector q1 = new Vector(-400, -10);
        Vector q2 = new Vector(450, 100);

        //corresponding cubic control points
        Vector c0 = q0;
        Vector c1 = q0 + (q1 - q0) * 2 / 3;
        Vector c2 = q2 + (q1 - q2) * 2 / 3;
	Vector c3 = q2;

        int n = 20;
        for(int i = 0; i < n; i++)
        {
       	    float t = (float)i / n;
            Vector qt = getQuadratic(t, q0, q1, q2);
            Vector ct = getCubic(t, c0, c1, c2, c3);
            Console.WriteLine((qt-ct).Length);
        }


        private Vector getQuadratic(float t, Vector q0, Vector q1, Vector q2)
        {
            Vector a0 = q0 * (1 - t) + q1 * t;
            Vector a1 = q1 * (1 - t) + q2 * t;
            Vector vt = a0 * (1 - t) + a1 * t;
            return vt;
        }

        private Vector getCubic(float t, Vector c0, Vector c1, Vector c2, Vector c3)
        {
            Vector a0 = c0 * (1 - t) + c1 * t;
            Vector a1 = c1 * (1 - t) + c2 * t;
            Vector a2 = c2 * (1 - t) + c3 * t;
            Vector b0 = a0 * (1 - t) + a1 * t;
            Vector b1 = a1 * (1 - t) + a2 * t;
            Vector vt = b0 * (1 - t) + b1 * t; 
            return vt;
        }
Jonathan hat geschrieben: 24.06.2021, 21:32 ... dann erscheint es zumindest mal plausibel, dass quadratische Splines eine echte Untermenge sind, man also zu jeder eine kubische Spline finden kann, die gleich aussieht. (Dass das dann tatsächlich auch geht, müsste man aber noch zeigen)
Um das zu zeigen, setzt man die quadratische und die kubische Gleichung gleich und löst nach den gesuchten Parametern auf. Unter dem Link, den ich gepostet habe, wurde das gemacht.

Re: Quadratisches Spline 2 Bezier

Verfasst: 25.06.2021, 07:44
von Mirror
Ich meinte die Konvertierung von einem quadratischem SPLINE zu einer kubischen Kurve. Du hast aber die Formel für eine quadratische BEZIER-Kurve als Ausgangsbasis geschrieben. Trotzdem danke die Formel werde ich mir aufheben.

Re: Quadratisches Spline 2 Bezier

Verfasst: 25.06.2021, 07:55
von joeydee
Hm, ok, dann war das ein Missverständnis was genau deine Ausgangslage ist. Da man ja oft auch von "Bezier Splines" redet.

Re: Quadratisches Spline 2 Bezier

Verfasst: 25.06.2021, 08:34
von Mirror
Wenn man aus dem quadratischem Spline eine quadratische Bezier und dieses in eine kubische Bezier macht, dann geht es !!! Doch noch erfolgreich...

Re: Quadratisches Spline 2 Bezier

Verfasst: 25.06.2021, 14:28
von Lord Delvin
joeydee hat geschrieben: 25.06.2021, 07:55 Hm, ok, dann war das ein Missverständnis was genau deine Ausgangslage ist. Da man ja oft auch von "Bezier Splines" redet.
Wenn dich die Worte verwirren: Du hast Interpolationsfunktionen, die durch die Stützpunkte gehen und welche, die sie nur annähern.
Wenn du zwischen beiden wechseln willst, dann musst in der Regel die Stützpunkte anpassen.
Genauso kann man in der Regel nicht beliebig zwischen Funktionen wechseln, die unterschiedlich viele Stützpunkte berücksichtigen, um den konkreten Punkt zu bestimmen. Wenn ich es richtig im Kopf habe, dann ist das grob als "Dimension" ausgewiesen, war aber letztlich immer in die Zahl der Stützpunkte konvertierbar. Ist bei mir aber schon mehr als zehn Jahre her :)