Gerundete Positionierung? Unerwünscht!



  • Bei einer Ansicht, welche auf Tiles (welche fixe Dimensionen in Pixeln haben) basiert würde ich auf Ganzzahlen setzen. Gleitpunktzahlen sind immer nur Annäherungen an einen gewünschten Wert und daher niemals exakt --> statt der gewünschten Genauigkeit erhälst du genau das Gegenteil.

    Auch würde ich an Deiner Stelle beim Scrollen nicht die Position der Tiles ändern sondern eine Art "ViewPort" realisieren, welcher die (gerade sichtbaren) Tiles abbildet.

    Grüße...

    Heiko



  • DirectX

    Aber ich muss doch Gleitpunktzahlen zur Positionierung verwenden, denn sonst funktioniert meine Berechnung zur Bewegung vom Spieler nicht mehr:

    playerMoveSpeedX = 4.0f * (playerMoveX / sqrt(pow(playerMoveX, 2) + pow(playerMoveY, 2)));
    playerMoveSpeedY = 4.0f * (playerMoveY / sqrt(pow(playerMoveX, 2) + pow(playerMoveY, 2)));

    (Es wird dann ungenau, also die Bewegung einer Richtung ist schneller fertig als die der anderen, und genau das möchte ich ja vermeiden)

    Möchte gar keinen Viewport oder Kamera verwenden, da ich mich nicht viel mit DirectX beschäftigen möchte.

    MfG



  • Keine Ideen?

    Hab mal was getestet:

    double posX1 = 0.00000000000000;
    double posX2 = 64.0000000000000;
    
    posX1 += 0.10000000000000;
    posX2 += 0.10000000000000;
    

    Warum zum Teufel ist dann der Ausdruck

    posX2 - 64.0000000000000 == posX1

    FALSE?

    Vor der Erhöhung um 0.1 ist er TRUE...

    Kann man denn überhaupt vernünftig mit Gleitpunktzahlen arbeiten? Scheint ja nicht sehr danach... Wie Löst man das Problem der Ungenauigkeit bei Positionierungen? Es muss doch möglich sein, ohne Ganzzahlen zu positionieren...

    MfG



  • kann es sein, dass der Strich an der Stelle entsteht, in der dir Koordinaten vom positiven ins negative wechseln, oder ist das einfach irgendwo? Ich hab sowan nämlich nicht bei meinen tiles.



  • ceplusplus schrieb:

    Keine Ideen?

    Hab mal was getestet:

    double posX1 = 0.00000000000000;
    double posX2 = 64.0000000000000;
    
    posX1 += 0.10000000000000;
    posX2 += 0.10000000000000;
    

    Warum zum Teufel ist dann der Ausdruck

    posX2 - 64.0000000000000 == posX1

    FALSE?

    MfG

    fließ und gleitkommazahlen sind nie genau. an der letzten stelle gibts immer ne ungenauigkeit weil dein pc im binären zahlensystem einfach nur bis zu ner bestimmten "tiefe" kommt und dann abrunden oder abschneiden muss. soll heißen ein

    double a = 1.0;
    

    ist nicht etwa 1.0~ sondern 1.0000000000000000000000000000000000000000000000000000001 oder so



  • Ne, aber jetzt blick ich langsam hindurch:

    0.00000
    64.0000
    128.000
    
    +
    1.23456
    
    1.23456
    65.2346
    129.235
    

    Hier sieht man, dass die Werte nicht mehr genau +64 betragen. Daran liegt es.

    Frage:
    Wie schreibe ich die Formel um, dass int und nicht float berechnet wird?

    playerMoveSpeedX = 4.0f * (playerMoveX / sqrt(pow(playerMoveX, 2) + pow(playerMoveY, 2)));
    playerMoveSpeedY = 4.0f * (playerMoveY / sqrt(pow(playerMoveX, 2) + pow(playerMoveY, 2)));
    

    Umwandeln darf ich ja nicht, sonst ist eine Bewegung in eine Richtung früher fertig. Gibts keinen double- D3DXVECTOR3? So'n Schmarrn...

    MfG



  • Ach egal mir reichts, da wird man ja deppert. Ich werd die Tiles als Primitive zeichnen und die Kamera verwenden.

    Danke trotzdem.
    MfG



  • TravisG schrieb:

    double a = 1.0;
    

    ist nicht etwa 1.0~ sondern 1.0000000000000000000000000000000000000000000000000000001 oder so

    verbreitet doch nicht immer so ein Halbwissen. 1.0 ist sowohl in float als auch in double genau 1.0.



  • @ceplusplus:
    Theoretisch könntest du auch nur die Position eines einzigen Tiles mit floats ausrechnen, diese Position dann in Integer verwandeln, und alle anderen Tiles relativ zu der Integer Position zeichnen (also mit Integer Offsets).
    Wenn nie etwas rotiert/skaliert/verzerrt wird und die Tiles 1:1 (1 Texel = 1 Pixel) am Bildschirm landen müsste das gut gehen.

    Die Version mit Kamera ist allerdings viel flexibler, daher würde ich die vorziehen.


  • Mod

    alternativ kannst du ausrechnen von wo bis wo ein tile geht, theoretisch muesste das naechste genau an dem punkt weitergehen wo das vorherige aufhoerte, vorausgesetzt du kannst die tilesize pro tile angeben.



  • Optimizer schrieb:

    Welches Grafik-API verwendest du?

    ceplusplus schrieb:

    DirectX

    Danke für die Nachricht.



  • Danke für die Tips.

    Hab rapso's Vorschlag getestet und klappt wunderbar.

    Ich werd wohl doch bei der Methode bleiben, und auf Matrizen & co. verzichten.
    Hab da paar Schwierigkeiten mit den Einheiten:

    Wie positioniert man zB. ein Vertex im world-space in der linken oberen Bildschirmecke? Die ganzen Koordinaten haben ja nix mit Pixel zu tun, da komm ich nicht klar.

    MfG


Anmelden zum Antworten