Kurven glätten



  • Tach Leute. Ich wollte mal Fragen, ob eine(r) von euch schonmal den Graphen einer Funktion in einem Programm (C++ o.ä. mir kommts eigentlich nur aufs Prinzip an) geglättet hat. Sagen wir mal ich hab 10 Werte einer Kurve will die Kurve aber so glatt haben als wären es um die hundert Werte im gleichen Definitionsbereich. Wie macht z.B. Excel so etwas? Was gibt es an Algorithmen um diese Aufgabe zu lösen? (Google spuckte bei mir nur Mist aus:-(((()

    MFG,

    MaSTaH



  • Hallo,

    such mal nach Interpolation, Hermite Interpolation, Splines, Bi-Splines etc.
    Dann solltest du fündig werden.



  • Danke, mach ich...



  • Auf meiner HP hab ich ein kleines Tut zu kubischen Splines. Könnte dich interessieren.



  • Danke, wird ne Menge zu coden... 😃



  • Hmm.. ich habe mir da vor kurzem auch mal ein paar gedanken drüber gemacht, und dachte an folgendes: Man hat drei Punkte P1, P2 und P3, angenommen, man verbindet P1 mit P2 und P2 mit P3. Es entsteht jetzt also ein Winkel bei P2. Von diesem bildet man die Winkelhalbierende, ich nenne sie "wa". Auf wa nimmt man jetzt einen Punkt P4, der eine gewisse strecke A von dem Punkt P2 entfernt ist (je weiter weg, desto größer die "Krümmung"). Nun schlägt man um P4 einen Kreis mit dem radius A. Nun bildet man die Tagenten von P1 und P2 zu dem Kreis. Zwischen diesen beiden Punkten kann man nun noch beliebig viele neue Punkte erschaffen, um eine Krümmung zu erhalten.
    Ich weiß nicht, ob dies gut funktionieren wird, und ich weiss auch nicht, wie schwierig es wäre dies in eine Funktion unterzubringen.

    DasPinsch



  • Und was ist mit P3?



  • Original erstellt von WebFritzi:
    Und was ist mit P3?

    damit macht man natürlich das gleiche wie mit P1!



  • Interpolation mit 4 Punkten:

    //interpolates between L0 and H0 taking the previous (L1) and next (H1)
    points into account
    inline float ThirdInterp(const float x,const float L1,const float L0,const
    float H0,const float H1)
    {
    return
    L0 +
    .5f*
    x*(H0-L1 +
    x*(H0 + L0*(-2) + L1 +
    x*( (H0 - L0)*9 + (L1 - H1)*3 +
    x*((L0 - H0)*15 + (H1 - L1)*5 +
    x*((H0 - L0)*6 + (L1 - H1)*2 )))));
    }

    oder lieber gleich 6:

    [...]
    {
    return p2 + 0.04166666666*x*((p3-p1)*16.0+(p0-p4)*2.0
    + x *((p3+p1)*16.0-p0-p2*30.0- p4
    + x *(p3*66.0-p2*70.0-p4*33.0+p1*39.0+ p5*7.0- p0*9.0
    + x *( p2*126.0-p3*124.0+p4*61.0-p1*64.0- p5*12.0+p0*13.0
    + x *((p3-p2)*50.0+(p1-p4)*25.0+(p5-p0)*5.0)))));
    }

    fur x zwischen 0 bis 1 interpolieren die immer zwischen den mittleren beiden punkten. Die kurven passen aneinander, so dass du zwischen beliebig vielen Punkten interpolieren kannst.

    Ansonsten guck dir die Hermite-Derivate an (Cardinal, CatmullRom, ...)

    Falls du approximierende Kurven suchst (Kurven, die sich den punkten annähern, sie aber in der Regel nicht durchlaufen), such mal Beziér, B-Spline (nicht Bi-Spline) oder NURBS. Das NURBS-Prinzieb lässt sich übrigens auch auf Beziér übertragen.


Anmelden zum Antworten