Wieso macht hat mein Auto bei 45° so nen komischen Sprung?


  • Mod

    *** schrieb:

    Könnte man nicht gleich, dem Beispiel folgend, die 2,74 auf der X Achse addieren und gleichzeitig 1 auf der Y Achse?

    er scheint nur int nutzen zu wollen, mein vorschlag wäre auch so wie deiner 😉

    rapso->greets();



  • *DURCHDREH*
    MAAN!! Was ist da denn los? Warum ist Moved NIE so groß wie das Ratio? Das KANN doch gar nicht sein!!

    if(fRotation >= 0.0 && fRotation < 45*Grad) 
    		{ 
    
    			RatioX = ((float)cos(fRotation/Grad))/((float)sin(fRotation/Grad));
    
    			iMoved = (float)iMoved + (float)sin(fRotation/Grad);
    
    			fprintf(protokoll, "fRotation: %e, Grad: %e, cos: %e , sin: %e, iMoved: %e, RatioX: %e\xd\xa",fRotation, Grad, cos(fRotation/Grad), sin(fRotation/Grad),iMoved, RatioX);
    
    			_pos.x = (float)_pos.x + (float)cos(fRotation/Grad);
    
    			if((float)iMoved >= (float)RatioX)
    			{
    				_pos.y++;
    				iMoved = iMoved - RatioX;
    			}
    
    		}
    

    nach dem projekt muss ich zum Zahnarzt *schenkelklopf*

    Kevin



  • Ich weiss nicht, ob es daran liegt, aber du konvertierst doch ständig nach int

    iMoved = (float)iMoved + (float)sin(fRotation/Grad);
    

    und int kennt nur Ganzzahlen. Wenn du also einen Wert von 0.43irgentwas addierst, wird tatsächlich nichts addiert. Ist RatioX etwa auch eine int Variable?



  • Versuch doch einfach mla so:

    struct point
    {
      float x;
      float y;
    };
    
    // in Klasse:
    point pos;
    
    // Move:
    point temp;
    
    temp.x = cos(fRotation);  // eventuel in Rad umwandeln
    temp.y = sin(fRotation);
    
    // Per Definition ist Länge von Temp = 1:
    /*
      soll ne Gerade sein ---|
                --------/    | cos Rot
            ---/             |
          +-------------------
                sin(Rot)
    L = cos^2 + sin ^2 = 1
    */
    
    // Dann kannste das ganze noch mit speed multiplizieren
    // dann:
    pos.x += temp.x;
    pos.y += temp.y;
    
    // Müsste klappen denke ich
    


  • iMoved = (float)iMoved + (float)sin(fRotation/Grad);

    Ja, das bringt nichts, wenn alle 3 int sind, dann werden die nur für die Addition in floats umgewandelt aber von da gleich wieder zurück nach int -> du kannst es dir sparen.

    Unabhängig von deinem Problem würde ich dir raten, wenn du sowieso nur mit floats arbeitest, sinf und cosf zu nutzen

    MfG MAV



  • Ich hab ma zum Test ob COS und SIN überhaupt funzt cos(1) mal ausgeben lassen - ergebnis: > 26000
    Was soll das denn?

    #include "windows.h"
    #include "stdio.h"
    #include "math.h"

    int main()
    {
    printf("%d", (double)cos(1));

    return 0;
    }

    na so kann ja gar nichts gehen

    Kevin



  • Ich würde sagen, Strg+A, Entf und dann erstmal näher mit Vektorrechnung und Trigonometrie beschäftigen. Bringt doch so echt nix.

    Bye, TGGC



  • @TGGC:

    Bringt doch so echt nix.

    Genau wie deine Beiträge

    @Surkevins:
    Hmm... solltest mal nur float wie schon gesagt nutzen. Aber COS kann doch niemals 26000 ausgeben, soweit ich was maximal PI oder PI*2.

    Probier dein Test mal mit %f, (float) und cosf(1.0f).

    cu



  • Sorry, aber ich stimme TGGC zu. Da fehlt massiv das Grundwissen.
    Nun versuchst du eine float-Variable in ein int-Format zu pressen:

    printf("%d", (double)cos(1));
    

  • Mod

    Surkevins schrieb:

    Ich hab ma zum Test ob COS und SIN überhaupt funzt cos(1) mal ausgeben lassen - ergebnis: > 26000
    Was soll das denn?

    #include "windows.h"
    #include "stdio.h"
    #include "math.h"

    int main()
    {
    printf("%d", (double)cos(1));

    return 0;
    }

    na so kann ja gar nichts gehen

    Kevin

    %d is dezimal
    versuch mal %f

    außerdem ist cos nicht in grad von 0 bis 360, sondern in rad von 0 bis 2PI
    deswegen auch die umrechnung Winkel
    3.141592f/180.f

    rapso->greets();



  • Maxi2, das bringt leider nich viel weil ich nich 0.5 pixel 4example hochwandern kann 😞



  • Wer mich runtermachen will kann sich sein Posting sparen, danke.
    Ich wusste nicht dass RAD anstatt DEG erwartet wird...tzz

    ich hasse das so an diesem Forum dass immer so viele Leute meinen jemand runtermachen zu müssen...es gibt etwas das nennt sich "ZIELE SETZEN"

    Danke an euch anderen die mich trotzdem unterstützen.

    HDL

    Kevin



  • @ ***:

    Mag sein das ihm ein paar Sachen fehlen aber wenn es ihm keiner Zeigt bzw ihm Hilft wird er es nie lernen.

    Jeder war mal ein Noob und hat "dumme" Fragen gestellt, aber Leute wie TGGC (keine Sozialen Kontakte) helfen diesen Anfägner nicht sondern machen sie noch runter. Und das is echt scheisse. Da kann man nur sagen, was für ein toller Programmierer ... (es geht abwärts)



  • Ich weiss, daß ich besser nicht auf diesen Beitrag antworten sollte, aber ich bin ja anonym 😃

    Ich sehe allen Ernstes in diesem ganzen Thread nicht einen einzigen Post, wo jemand runtergemacht wird. Tut mir leid, wenn ich so blind bin. TGGC hat ihm doch nur ans Herz gelegt, sich ein bischen Grundwissen anzueignen und es dann nochmal zu versuchen. Das gleiche versuche ich Surkevins ja auch nahezubringen.

    Leider stelle ich eher fest, daß es langsam zu einem Volkssport wird, auf TGGC rumzuhacken. Anfangs amüsant und vielleicht auch gerechtfertigt, nervt es mittlerweile nur noch. Es erinnert irgendwie an die Lemminge, jeder knallt noch schnell ein "I Hate TGGC" unter seine Postings, weil es gerade so "in" ist.

    Im Übrigen helfe ich gerne. Ich möchte gerne helfen, indem ich Surkevins rate, sein Grundwissen zu vertiefen.

    @Surkevins
    Du hast gesagt, daß du dir Ziele setzt. Muss es denn gleich ein Autorennspiel sein? Wie wärs erstmal mit dem Ziel, die eigenen C++ Kenntnisse zu verfestigen? Und ich gehe jede Wette ein, daß dir die Lösung deines Problems viel leichter von der Hand geht, wenn du den Rat von TGGC befolgst. Lies doch mal ein Tutorial zur Trigonometrie, oder blätter ein paar Seiten vor in deinem Mathebuch.

    mfg



  • an alle TGGC-Basher: Ich habe ehrlich gesagt den Eindruck dass sich TGGC in letzter Zeit wirklich bemüht, aber das wollt Ihr gar nicht sehen, hm?



  • gebe nman recht. und unsinnige beschuldigungen müssen nicht sein.

    und nun kommt wieder aufs thema zurück...



  • Speicher erstmal alle Variabeln als float, dann ist es chonmal besser

    Und multipliziere die Bewegung meinetwegen mit 10 oder sonstwas 🙂 dann ist mehr als 0.5 Pixel



  • HI!
    Die Lösung war einfacher als ich dachte, jedoch verstehe ich nicht ganz wie das Problem DirectX löst.
    Die Lösung ist ganz einfach:

    _pos.x = _pos.x + cosf(fRotation);
    _pos.y = _pos.y - sinf(fRotation/Grad);

    wie es in der Art auch schon gesagt wurde. Das funktioniert auch perfekt, jedoch wundert es mich. Wie ich mitgekriegt habe ist das D3DXVECTOR2 Struct bestehend aus 2 floats, nicht aus 2 ints wie ich annahm. Schön und gut, jedoch wie macht das DX? Angenommen mein Auto steht auf 3° Dann heißt das ja COS(3) nach rechts pro SIN(3) nach oben..is ja klar. Ich addiere den Wert ja immer zu dem floatwert des structs. Jedoch wenn ich das selbst versuche (ohne dieses struct) und ich sage ich will 1 nach oben bei 3 nach rechts, dann wander ich die 3 nach rechts und 1 nach oben, jedoch sieht das ein bisschen abgehakt aus wenn das Auto plötzlich 1 Pixel weiter oben ist, jedoch ist bei DX ein völlig flüssiger Übergang! Man merkt überhaupt nicht wie das Auto nach oben geht..das ist doch nicht möglich, da ein Pixel doch relativ groß ist, wo eine Bewegung nach oben um einen Pixel doch schon auffällt. Um 0.5 Pixel nach oben ist ja nicht möglich. Ich hoffe ihr könnt euch vorstellen was ich meine 🙂

    zum 2. Thema hier:

    Ich habe mir schon oft in Sachen Programmieren Ziele gesetzt. Wie ich mit WINAPI angefangen habe und nichts kapiert habe wurde ich hier auch fertig gemacht, doch ich habe es geschafft und aufgrund der jahrelangen Erfahrung bin ich darin schon richtig gut 🙂 Jetzt brauche ich eine neue Herausforderung! Durch eure Hilfen verstehe ich zu mindest den für DX notwendigen Teil der Trigonometrie schon... Auch Assembler habe ich mir beibringen können und habe auch wirklich kleine kaum den Namen verdienende OSes gecodet und bin immernoch dabei. In den Protected Mode habe ich mich auch eingearbeitet. Bei der Anfrage nach Hilfe kam von 30% der Leute hier nur ein Lachen und meinten ebenfalls das Ziel sei zu hoch gesteckt...FDC + HDD Treiber für den Protected Mode sind doch schon viel, was man erreicht hat. Somit spart euch bitte die heruntermachenden Comments (nicht nur bei mir).

    Die Art wie es TGGC gesagt hat war schon von Grund an sehr agressiv. "Am besten: STRG ALT + ENTF" - solche Comments sind wirklich überflüssig.

    SO!

    kevin



  • Surkevins schrieb:

    "Am besten: STRG ALT + ENTF" - solche Comments sind wirklich überflüssig.

    Lern lesen.

    Ich bin der Meistgehasste, weil mich die meisten hassen...

    Bye, TGGC


  • Mod

    😕

    y+=sin(3) und x+=cos(3)
    sind ganz was anderes als
    y+=1 und x+=3

    das hat nichts mit directX zu tun, das ist nur mathe, wenn du pro bild sin(3) aufaddierst, also 0.1411 (ist ja in RAD!!!), dann kommst du nur alle 7 bilder einen pixel vorran. das ist als nicht wirklich verwunderlich dass das flüssig ausschaut.

    du scheinst das ganz nicht wirklich zu verstehen
    die coordinaten sind in float, also ist es möglich deinen wagen 0.5 hoch zu bewegen, bei der darstellung wird dann auf ganze zahlen abgerundet, aber das ist ja egal für die bewegung deines wagens, denn es sollte ja auch fahren können wenn man nichts sieht oder antialiasing an hat (wo dann subpixel genaue bewegungen möglich wären)

    rapso->greetS();


Anmelden zum Antworten