Quadratisches Spline 2 Bezier

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
Mirror
Establishment
Beiträge: 248
Registriert: 25.08.2019, 05:00
Alter Benutzername: gdsWizard
Kontaktdaten:

Quadratisches Spline 2 Bezier

Beitrag 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 ?
Hat den StormWizard 1.0 und 2.0 verbrochen. http://www.mirrorcad.com
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: Quadratisches Spline 2 Bezier

Beitrag von xq »

Spontan würde ich sagen: Nein, es ist nicht möglich, kann es aber nicht begründen
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Mirror
Establishment
Beiträge: 248
Registriert: 25.08.2019, 05:00
Alter Benutzername: gdsWizard
Kontaktdaten:

Re: Quadratisches Spline 2 Bezier

Beitrag 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.
Hat den StormWizard 1.0 und 2.0 verbrochen. http://www.mirrorcad.com
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 574
Registriert: 05.07.2003, 11:17

Re: Quadratisches Spline 2 Bezier

Beitrag von Lord Delvin »

Wenn deine Punkte auf einer Geraden lägen würde es wohl gehen ;)

Was genau willst du erreichen?
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
Mirror
Establishment
Beiträge: 248
Registriert: 25.08.2019, 05:00
Alter Benutzername: gdsWizard
Kontaktdaten:

Re: Quadratisches Spline 2 Bezier

Beitrag von Mirror »

Ich möchte bei einem CAD Programm Bezierkurven anbieten. Dabei soll bei der Umwandlung des Kurventypes die Kurve gleichbleiben.
Hat den StormWizard 1.0 und 2.0 verbrochen. http://www.mirrorcad.com
joeydee
Establishment
Beiträge: 1039
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: Quadratisches Spline 2 Bezier

Beitrag 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
Benutzeravatar
Jonathan
Establishment
Beiträge: 2353
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: Quadratisches Spline 2 Bezier

Beitrag 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.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Mirror
Establishment
Beiträge: 248
Registriert: 25.08.2019, 05:00
Alter Benutzername: gdsWizard
Kontaktdaten:

Re: Quadratisches Spline 2 Bezier

Beitrag 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.
Hat den StormWizard 1.0 und 2.0 verbrochen. http://www.mirrorcad.com
joeydee
Establishment
Beiträge: 1039
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: Quadratisches Spline 2 Bezier

Beitrag 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.
Zuletzt geändert von joeydee am 25.06.2021, 07:54, insgesamt 1-mal geändert.
Mirror
Establishment
Beiträge: 248
Registriert: 25.08.2019, 05:00
Alter Benutzername: gdsWizard
Kontaktdaten:

Re: Quadratisches Spline 2 Bezier

Beitrag 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.
Hat den StormWizard 1.0 und 2.0 verbrochen. http://www.mirrorcad.com
joeydee
Establishment
Beiträge: 1039
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: Quadratisches Spline 2 Bezier

Beitrag von joeydee »

Hm, ok, dann war das ein Missverständnis was genau deine Ausgangslage ist. Da man ja oft auch von "Bezier Splines" redet.
Mirror
Establishment
Beiträge: 248
Registriert: 25.08.2019, 05:00
Alter Benutzername: gdsWizard
Kontaktdaten:

Re: Quadratisches Spline 2 Bezier

Beitrag von Mirror »

Wenn man aus dem quadratischem Spline eine quadratische Bezier und dieses in eine kubische Bezier macht, dann geht es !!! Doch noch erfolgreich...
Hat den StormWizard 1.0 und 2.0 verbrochen. http://www.mirrorcad.com
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 574
Registriert: 05.07.2003, 11:17

Re: Quadratisches Spline 2 Bezier

Beitrag 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 :)
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
Antworten