3D Spline Interpolation

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Arby.

    Definiere

    Goof schrieb:

    3D-Spline.
    Üblicherweise hast Du eine Punktwolke, die einem Spline-Algo unterzogen wird.
    Dazu gehört dann eine Funktion, der Du ein x reingibst und ein y zurüch bekommst.
    Wenn das bei Dir nicht der Fall ist, wurde das ggf. bei der Implementierung vergessen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    jo - definiere das mal.
    Ich kenne zB cubic Splines, das ist aber was ganz anneres als eine Ausgleichs funktion durch eine Punkt-Wolke.



    Hier interpoliere ich Bezier-Splines, und im dort anhängigen Projekt auch cubicSplines. Letztere aber ohne Erklärung, weil ich mit numerische Mathematik nicht so der BestFriend bin.
    Aber ich verlinke, wo dazu was erklärt wurde (möge verstehen, wem es gegeben ist, zu verstehen).
    codeproject.com/Articles/22535…Splines-and-Cubic-Splines
    die Frage ist was für Splines hast du denn? Es gibt schließlich verschiedene Arten und du hast bestimmt noch irgendwelche anderen Informationen außer die Punkte selbst.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    Goof schrieb:

    Der Spline ist durch Punkte definiert.
    Die Frage ist: Durch wieviele Punkte?
    "3D-Spline" deutet auf etwas hin, was mir als "cubic spline" bekannt ist (verbindet glaub 4 Punkte, wenn ich recht erinnere).
    Und warum sagst du "der Spline"? Hast du nur einen einzigen? Üblicherweise hat man massenhaft Splines, je nachdem wieviele Punkte man verbinden möchte (und was für eine Art Spline verwendet wird).

    Das Spline-Prinzip ist ja, dass man eine kleine Anzahl von Punkten zu einer Kurve verbindet, und um eine Riesen-Menge an Punkten zu verbinden setzt man viele Splines knickfrei aneinander.
    Ansonsten müsste man gewaltig numerische Mathematik betreiben, um ein Polynom zu basteln und zu lösen, mit so vielen Variablen wie man Punkte hat (so ähnlich). Und heraus kommt nichtmal eine wirklich überzeugende Kurve, sondern es treten auch Aufschaukelungs-Effekte auf und sowas.
    Also da fährt man besser mit viele kurze Polynome (Splines), die man einfach so knickfrei aneinanderhängt.

    Wie dem auch sei, für cubicSpline hab ich dir auf eine Lösung verlinkt.
    Nachteil der Lösung: Sie funzt zwar, aber nicht gut erklärt.

    Wesentlich komfortabler würde es natürlich, wenn du von Cubic-Splines auf Cubic-Bezier-Kurven umstiegest, denn dafür gibts recht gute Unterstützung im Framework.
    (Interpolation wird aber auch vom FW nicht unterstützt, aber das nachzureichen ist ja grade das Thema meines Links (das mitte Splines ist nur angehängt))

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Kubische Splines arbeiten mit der Ableitung. Alle Splines interpolieren generell immer nur zwischen 2 Punkten, das ist der Vorteil der Splines, dass man keine Information über die anderen Punkte braucht.

    Und für 3D braucht man halt die Gradienten anstatt die Steigung, was für 2D natürlich reicht....
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    Goof schrieb:

    Der Spline ist durch Punkte definiert.
    Kann es sein, dass Du lediglich die Punktwolke vorliegen hast?
    Dann musst Du tatsächlich zunächst aus dieser einen Spline berechnen. Mit dem Rechenergebnis kannst Du dann für beliebige Koordinaten die Werte berechnen lassen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wenn man über die APIs von CAD-Programmen Spline-Daten vorgworfen bekommt, handelt es sich in den meisten Fällen (zumindest nach meiner Erfahrung) um sog. "Non-uniform rational B-Splines", abgekürzt "Nurbs".
    Um einzelne Punkte berechnen zu können, berechnet man aus dem Spline(-Objekt), also dessen Knoten und Kontrollpunkten, eine Folge von Linien und Kreisbögen, die sich dem Spline so nah und genau wie möglich annähern. Je genauer das sein soll, desto länger dauert die Berechnung und desto mehr Elemente entstehen. Hat man so einen approximierten Linienzug, ist der Rest ein "Kinderspiel", weil man nur noch mit Linien und Kreisbögen zu tun hat.
    Es gibt dazu diverse Algorithem, ich habe mal - als ich mich damit auseinandersetzen musste - so einen im Netz gefunden. Aber frag mich bitte nicht mehr wo. Ich denke mit "Nurbs" und "approximate" als Suchbegriffe sollte man da fündig werden können.

    Edit: War wohl doch schon etwas länger her, als ich mich damit auseinandersetzen musste. Ich hab mir unsern Code nochmal angesehen. Die Vorgehensweise ist wohl doch andersrum: Es gibt Algorithmen, die Spline-Punkte genau berechnen können. (Wichtig dabei: CAD-Programme arbeitet mit "gewichteten" Kontrollpunkten, d.h. das Gewicht muss bei der Berechnung berücksichtigt werden.) Mit Hilfe dieser Funktion haben wir uns dann die Annäherung an Kreisbögen berechnet.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Arby“ ()