Winkelberechnung im Koordinatensystem für Kreisdrehung
-
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.zipNicky
-
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
-
CJosef schrieb:
Wie was? VGA?
http://www.brackeen.com/vga/
:pJawohl, (S)VGA.. Habe zwei gute Bücher dazu
-
Kleine Optimierung:
fld x
fld cos1
fmulvorausgesetzt es wird mit REAL4/8 gearbeitet:
fdl x fmul cos1
Außerdem: [F]WAIT macht nur Sinn, wenn man unmaskierte Excpetions behandelt, was du aber durch das FINIT ausschließt. FNCLEX nach FINIT ist nutzlos.
BTW: deine WndProc@WM_KEYDOWN ändert ESI, EDI und EBX, sichert dies aber nicht.
-
Guten Morgen masm,
ja, ich arbeite nur mit REAL Zahlen (DWORD).
In meinen beiden Referenzen steht nur das bei FWAIT die CPU auf die FPU wartet,
mehr nicht...In der WindowProc werden die Zeiger ESI und EDI erst mit den Werten geladen.
Zu den anderen Sachen komme ich noch im Forum für Assembler...
Wo ich dich schonmal vorwarnen kann:
In den beiden Referenzen sind erfreulicher Weise auch alle FPU Befehle und ihre
Operanden aufgeführt. Es wird ausdrücklich darauf hingewiesen das ein Operand
nur ein FPU Register oder eine Speicherstelle sein kann...Ein Hinweis das folgendes auch geht ist nirgends zu finden
dd x 2.5 dd y 4.0 mov ebx, offset x fld dword ptr [ebx] fmul y fistp dword ptr [ebx]
Somit bin ich immer den Umweg über eine temporäre Speicherstelle gegangen,
was natürlich nicht nötig ist.Wie schon gesagt, der Rest dann im Assembler Bereich...
Eine angenehme Nacht noch...
Nicky