Winkelberechnung im Koordinatensystem für Kreisdrehung



  • Was genau willst du der FPU sagen? Du hast also irgendeinen Punkt, was genau willst du jetzt damit machen? Sag einfach mal was du erreichen willst und nicht wie du denkst, dass du es erreichen willst...



  • B = blauer Punkt, A = Beliebiger Punkt, alpha := winkel gegen x-Achse:
    vektoriell: C = B-A
    alpha = arccos(C.x/sqrt(C.x2+C.y2))



  • C = A-B



  • dot schrieb:

    Was genau willst du der FPU sagen? Du hast also irgendeinen Punkt, was genau willst du jetzt damit machen? Sag einfach mal was du erreichen willst und nicht wie du denkst, dass du es erreichen willst...

    Das er mir den Punkt an x=200 und y=200 einen Grad weiter bewegt...



  • Was für eine API verwendest du denn? GDI, GDI+, DirecX, OGL?
    Wenn du den Drehwinkel und den Drehpunkt kennst, wird die Rotation eines Bildes durch Kombination von Translations- und Rotationsmatrix bewerkstelligt.
    (GDI: SetWorldTranform() + BitBlt())



  • masm schrieb:

    Was für eine API verwendest du denn? GDI, GDI+, DirecX, OGL?
    Wenn du den Drehwinkel und den Drehpunkt kennst, wird die Rotation eines Bildes durch Kombination von Translations- und Rotationsmatrix bewerkstelligt.
    (GDI: SetWorldTranform() + BitBlt())

    Hallo masm,

    1993 hatten wir auf unserer Dorfschule noch keine Matrizen 😞

    Ich zeichne nur mit der Windows GDI32. Alle Berechnungen erfolgen nur mit FPU
    wegen der Winkelfunktionen (keine Hilfe von Windows).

    Um bei meinem Beispiel zu bleiben:

    Mittelpunkt ist bei x=300 und y=300

    Wenn der Punkt bei x=350 und y=250 liegt sollte das Ergebnis 45° sein.
    Wenn der Punkt bei x=250 und y=250 liegt sollte das Ergebnis 135° sein.
    Wenn der Punkt bei x=250 und y=350 liegt sollte das Ergebnis 225° sein.
    Wenn der Punkt bei x=350 und y=350 liegt sollte das Ergebnis 315° sein.

    http://supernicky.dyndns.info/bild2.html

    Das Programm wie es jetzt läuft:
    http://supernicky.dyndns.info/3d_programm_3.zip

    Nicky



  • supernicky schrieb:

    Das er mir den Punkt an x=200 und y=200 einen Grad weiter bewegt...

    Dann mach es so wie von mir verlinked:

    \begin{align} x_{neu} &= x_{alt} \cdot \cos(1°) - y_{alt} \cdot \sin(1°) \\ y_{neu} &= x_{alt} \cdot \sin(1°) + y_{alt} \cdot \cos(1°) \end{align}

    Wobei du den Rotationsmittelpunkt zuerst von x und y abziehen, dann rotieren und dann wieder draufaddieren musst...



  • dot schrieb:

    supernicky schrieb:

    Das er mir den Punkt an x=200 und y=200 einen Grad weiter bewegt...

    Dann mach es so wie von mir verlinked:

    \begin{align} x_{neu} &= x_{alt} \cdot \cos(1°) - y_{alt} \cdot \sin(1°) \\ y_{neu} &= x_{alt} \cdot \sin(1°) + y_{alt} \cdot \cos(1°) \end{align}

    Wobei du den Rotationsmittelpunkt zuerst von x und y abziehen, dann rotieren und dann wieder draufaddieren musst...

    Hallo dot,

    die Formel scheint zu passen.. lediglich in der oberen Formel erhalte ich einen
    Wert der typisch für Y und in der unteren für X währe.

    Ich schreibe es mal um und gucke was passiert...

    Gruß, Nicky

    PS: Wenn soviel mit cos und sin gerechnet wird, brauch ich MMX/SSE wohl garnicht
    erst einsetzen.. Dort habe ich keinen Befehl wie FSIN oder FCOS gefunden.



  • Entschuldigung, aber den Code muss du dir doch irgendwoher kopiert haben? Das was der Code jetzt tut, steht doch im Wiederspruch zu deiner Frage.



  • sin(1°) und cos(1°) sind Konstanten, die du vorberechnen kannst...



  • masm schrieb:

    Entschuldigung, aber den Code muss du dir doch irgendwoher kopiert haben? Das was der Code jetzt tut, steht doch im Wiederspruch zu deiner Frage.

    Hallo masm,

    das stimmt wohl.. eigentlich habe ich nur die Formel zum bestimmen des Winkels gesucht....

    Falls ich die Formel von dot zum laufen bekomme, entfällt das ganze aber.
    Noch läuft es leider nicht..

    Gruß, Nicky



  • Mein Freund Olly hat mit im Übrigen verraten, das du dich nicht an die WinABI hältst - dies ist der Grund warum es nicht richtig funktioniert (win7, x64). EBX, ESI und EDI müssen in callbacks vor Veränderung geschützt werden: sehr einfach geht das mit der USES-Direktive:

    WndProc proc uses ebx edi esi hWnd:HWND,...



  • Gibt es eigentlich einen bestimmten Gund, wieso du das unbedingt mit Assembler machen willst?



  • masm schrieb:

    Mein Freund Olly hat mit im Übrigen verraten, das du dich nicht an die WinABI hältst - dies ist der Grund warum es nicht richtig funktioniert (win7, x64). EBX, ESI und EDI müssen in callbacks vor Veränderung geschützt werden: sehr einfach geht das mit der USES-Direktive:

    WndProc proc uses ebx edi esi hWnd:HWND,...

    Alle FPU Anweisungen liegen in einer Prozedur (PROC). Vor dem Aufruf sichere
    ich alle Register mit pushad und danach hole ich alle mit popad zurück...

    Das Programm von mir funktioniert tadellos... es ist nur nicht gerade optimal 😉

    Gruß, Nicky



  • dot schrieb:

    Gibt es eigentlich einen bestimmten Gund, wieso du das unbedingt mit Assembler machen willst?

    Hallo dot,

    ja den gibt es... ich möchte das ganze auch für die (S)VGA Programmierung nutzen.
    Dies kann ich damit 1:1 umsetzen...

    Gruß, Nicky



  • Oh, d.h. du programmierst unter DOS oder gar an einem eigenen Betriebssystem?



  • dot schrieb:

    Oh, d.h. du programmierst unter DOS oder gar an einem eigenen Betriebssystem?

    Kein eigenes OS :p

    Unter DOS wenn ich auf die VGA Karte zugreifen möchte...

    Gruß, Nicky



  • Wie was? VGA?
    http://www.brackeen.com/vga/
    :p



  • dot schrieb:

    supernicky schrieb:

    Das er mir den Punkt an x=200 und y=200 einen Grad weiter bewegt...

    Dann mach es so wie von mir verlinked:

    \begin{align} x_{neu} &= x_{alt} \cdot \cos(1°) - y_{alt} \cdot \sin(1°) \\ y_{neu} &= x_{alt} \cdot \sin(1°) + y_{alt} \cdot \cos(1°) \end{align}

    Wobei du den Rotationsmittelpunkt zuerst von x und y abziehen, dann rotieren und dann wieder draufaddieren musst...

    Hallo dot,

    es klappt... habe nun die ganze Zeit daran gesessen die Formel auf die FPU umzuschreiben..

    sin1 habe ich vorberechnet = 0,017 und cos1 = 0,99
    Das Ergebnis von x musste ich einmal zwischenspeichern in tmpx, da der Originalwert
    ja noch gebraucht wird für die Berechnung von Y.

    fninit
        		fnclex
    
        		fld x
        		fsub mm_x
        		fstp x
    
        		fld y
        		fsub mm_y
        		fstp y
    
        		fld x
        		fld cos1
        		fmul
        		fld y
        		fld sin1
        		fmul
        		fsub
        		fadd mm_x
        		fstp tmpx
    
        		fld sin1
        		fld x
        		fmul
        		fld cos1
        		fld y
        		fmul
        		fadd
        		fadd mm_y
        		fstp y
    
        		fld tmpx
        		fstp x
    		fwait
    

    Danke schön 👍

    Nicky



  • freut mich 🙂


Anmelden zum Antworten