interpolation highmap



  • Es ist in dem Sinn keine Highmap, also aus einer .raw Datei, sondern ein Gitter aus float Koordinaten.
    Jedes Dreieck kann mit seinen Ecken z.B. auf y1=0.444, y2=1.554 und y3=7.894 höhe liegen.

    Meine xpos und zpos Koordinaten ligen also irgendwo dazwischen, wenn ich irgendwo auf dem Dreieck stehe.

    Das Dreieck-Netz ist sehr grob gestrickt.



  • TGGC schrieb:

    Entweder bilineare Interpolation oder eine senkrechte Gerade mit dem Dreieck schneiden.

    Bye, TGGC (Denken, und gut ist.)

    Ich weiß nicht wie das geht. Ich meine genau das ist meine Problem. Einen Algorithmus dazu in Codeartiger Form zu finden.



  • Trulli schrieb:

    Ich stolper einfach über mir unverständliche mathematische Gleichungen

    Die mathematische Gleichung dafür ist recht primitiv. Es ist sehr lobenswert, dass du bei google etc. gesucht hast, aber wenn du das schon nicht verstehst...Mehr als dir zu sagen wie es geht kann auch hier niemand und du wirst sicherlich dutzende Pages gefunden haben die das sehr ausführlich tun.

    Versuch doch mal, dir dass Ganze 2-dimensional vorzustellen. Zeichne dir in ein Koordinatensaystem eine Linie, setz irgendwo auf diese Linie einen Punkt und versuche dessen Höhe auszurechnen. Hast du das dann geschafft UND verstanden, schaust du dir die Gleichungen für die 3D-Version nochmal an und dir wird hoffentlich vieles klarer werden.



  • Was mir bei mathematischen Gleichungen so aufstößt, ist das ich nie weiß was mit A und a und ß usw.. gemeint ist.
    Wenn zum Beispiel A/B = C ist, ist dann die x,y oder z koordinate von A gemeint, oder besteht der Eckpunkt plötzlich nur noch aus einer einzigen Koordinate im Universum.
    Ich weiß, daß sich das blöd anhört. Aber Mathe ist nicht mein Ding. Kann trotzdem ganz gut proggen. Meistens löse ich meine Probleme auch ganz gut.
    Ich habe Tonnenweise vollgekritzelter DinA4 Zettel mit Koordinatenkreuzen vor mir zu liegen.

    A B E R
    Ich hab ne Sperre und brauche endlich ein Stück Code.

    ODER
    Vielleicht eine mathematische Gleichung, in der Zeile für Zeile aufgelöst wird.



  • Die Formel ist nur eine Zeile, die dann einfach in mehreren Dimensionen angewandt wird. Es steckt nicht mehr als ein Steigungsdreieck dahintet, also y= mx + b.

    Bye, TGGC (Denken, und gut ist.)


  • Mod

    du weißt doch die x und z position eines punktes
    damit weißt du, in welcher 'masche' deines 'gitternetes' der punkt liegt. nimm dir die eckpunkt heraus, aus der die masche aufgespannt ist.

    nun hast du links zwei punkte und rechts zwei punkte. zwischen jeweils dem oberen und unterem jeder seite kannst du nun interpolieren durch

    unten.y*(1.f-nachkommastellen(punkt.z)) + oben.y*nachkommastelle(punkt.z)
    

    wenn du das für beide seiten machst, dann hast du nun die höche für die linke und rechte seite der masche.

    nun kannst du auf die gleiche art und weise zwischen den beiden punkten interpolieren, mittels punkt.x, so erhällst du dann die höche an deinem punkt

    noch irgendwelche klarheiten:D ?

    rapso->greets();



  • Ich habs so gemacht. Ruckelt aber tierisch

    //Hilfsfunktion wegen DivZero Error
    float dif(float n, float z)
    {
        if (n == 0 || z == 0) return 0;
        else                  return n/z;
    }
    
    FUNTION
    b = dif(x3,x1);
    c = dif(y3,b);
    h1 = y3-c; //die höhe auf der x-Achse
    
    b = dif(x2,x1);
    c = dif(y2,b);
    h1 = y2-c; //die höhe auf der z-Achse
    
    b = dif(xpos,zpos);
    c = dif(h1,b);
    return = y2-c;
    


  • Kans auch nicht sein. Wird immer geändert wenn ich mich von einem Dreieck zum anderen bewege. Also keine Steigung auf dem einzelnen Dreieck.
    Sch.... ich bin kurz vorm Zusammenbruch.



  • Das schlimme ist, man kann nach den vielen Rechenschritten nicht mehr nachvollziehen, welcher der falsche war.


  • Mod

    wieso nicht? du kannst das doch im debugger gut mal testen, nimm als höchenwerte sowas wie 1,2,3,4 für die ecken und schau nach wo er dir müll ausgibt.

    zum coden gehört nunmal auch debuggen, je besser du das kannst, desto schneller wirst du mit der zeit vorrankommen. 👍

    rapso->greets();



  • Genau.

    Bye, TGGC (Dem beste BdT)



  • So nun habe ich endlich die Lösung

    Gegeben war also:

    Auf einem Dreieck liegt ein Punkt mit den bekannten Koordinaten x_pos, z_pos.

    Die Höhe y_pos ist unbekannt.

    Das Dreieck hat die Eckpunkte (x1,y1,y2), (x2,y2,z2), (x3,y3,z3).

    float ypos, lambda1, lambda2;
    
         if (x2 != x1){
             lambda2 = ( (zpos-z1) - (xpos-x1)*(z2-z1)/(x2-x1) )/( (z3-z1) - (x3-x1)*(z2-z1)/(x2-x1) );
             ypos = y1 +  (y2-y1)/(x2-x1)*(xpos-x1)  +( (y3-y1)-(x3-x1)*(y2-y1)/(x2-x1) )*lambda2;
         }else{
             lambda2 = (xpos-x1)/(x3-x2);
             lambda1 = ( (zpos-z1) - (z3-z1)*lambda2 )/(z2-z1);
             ypos = y1 + (y2-y1) * lambda1 + (y3-y1)*lambda2;
         }
    
             return ypos;
    

    Für alle, die mal auf das selbe Problem stoßen


Anmelden zum Antworten