Winkelberechnung für Bilddrehung

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

CrowSmith

ehemals "Fleisch"

Betreff: Winkelberechnung für Bilddrehung

BeitragSo, Nov 07, 2010 23:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo.

Ich brauche für mein aktuelles Projekt eine Drehung, dessen Winkel ich durch die ArcusCosinus-Funktion ermiteln muss. Ich habe meine Berechnungen einige male durchgesehen und durchgeprüft aber mir fällt der Fehler nicht auf, der jedoch da ist und somit die Berechnung verfälscht.

Es gibt eine PositionX und eine PositionY. An der daraus resultierenden Koordinate sitzt das Bild, das ich drehen will. Das Bild soll in Richtung des Cursors (Also der aktuellen Koordinate MouseX()/MouseY()) gedreht werden.

Aktueller Code:
BlitzBasic: [AUSKLAPPEN]


a=Abs(PositionX-MouseX()) ;Siehe Bild!
b=Abs(PositionY-MouseY())

If a<=1 Then a=1 ;Diese 4 Zeilen dienen dazu, weder a noch b jemals gleich 0 zu setzen, denn
If a>=799 Then a=799 ;ansonsten wäre der Winkel auch gleich 0
If b>=599 Then b=599
If b<=1 Then b=1

c=Sqr((a^2)+(b^2)) ;Einfache Seitenberechnung im Dreieck

Winkel=ACos(((((a^2)-(b^2)-(c^2))/(2*b*c))*-1))



Hier das erklärende Bild zum Code:
user posted image

Jedoch bekomme ich bei dieser Berechnung nicht das gewünschte Resultat ... Manuell am Taschenrechner habe ich es hunderte male überprüft und HIER bekomme ich dann den Winkel ganz ohne Probleme heraus...

Ich bin ratlos...

Weiss einer eine Lösung?

MfG, der Fleisch
Worklogs: TotalWar2D
Wbsites: Privat / Entwicklerstudio / Gewerbe (Folgen bald)
Smartphones: Samsung Galaxy S I9000 / Samsung Galaxy S2 I9100 / Samsung Galaxy S3 (Kommt 2012)
Notebook 1: HP Pavillion DV6700 (AMD 64 X2 TL-60 @ 2.00GHz, 4GB DDR3 1333MHz, Nvidia GeFroce 8400M GS, Win Vista Home Premium 32Bit)
Notebook 2: HP Pavillion DV6t Quad Edition (KOMMT BALD =] )
Notebook 3: Clevo X7200 (KOMMT BALD =] )
Desktop: (KOMMT BALD =] )

Eingeproggt

BeitragSo, Nov 07, 2010 23:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Atan2 wie es vor wenigen Tagen schon erfragt wurde (hier).
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Xeres

Moderator

BeitragSo, Nov 07, 2010 23:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei deinem Winkelkreis ist die Y-Achse gespiegelt. 90° deuten nach Oben.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

CrowSmith

ehemals "Fleisch"

BeitragSo, Nov 07, 2010 23:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe es jetzt so:
Code: [AUSKLAPPEN]

Winkel=ATan2(PositionY-MouseY(),PositionX-MouseX())


Also so wie hier:
https://www.blitzforum.de/foru...hp?t=36018

und es funktioniert nicht!

Und jetzt?
Worklogs: TotalWar2D
Wbsites: Privat / Entwicklerstudio / Gewerbe (Folgen bald)
Smartphones: Samsung Galaxy S I9000 / Samsung Galaxy S2 I9100 / Samsung Galaxy S3 (Kommt 2012)
Notebook 1: HP Pavillion DV6700 (AMD 64 X2 TL-60 @ 2.00GHz, 4GB DDR3 1333MHz, Nvidia GeFroce 8400M GS, Win Vista Home Premium 32Bit)
Notebook 2: HP Pavillion DV6t Quad Edition (KOMMT BALD =] )
Notebook 3: Clevo X7200 (KOMMT BALD =] )
Desktop: (KOMMT BALD =] )

Xeres

Moderator

BeitragSo, Nov 07, 2010 23:54
Antworten mit Zitat
Benutzer-Profile anzeigen
"es funktioniert nicht!" Was soll uns dass denn helfen? Rolling Eyes
Was soll passieren, was passiert stattdessen?
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

CrowSmith

ehemals "Fleisch"

BeitragSo, Nov 07, 2010 23:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Was passieren soll, ist im ersten Post ganz oben sehr detailiert beschrieben Xeres^^ Ich will den Winkel berechnen, um den sich das Bild drehen soll.

Das Bild soll in Richtung meines Cursors ausgerichtet werden.

Das heisst ich denke mir das Dreieck zwischen meiner Cursorkoordinate und der Koordinate des Bildes und berechne via Satz des Pythagoras die Seite C (Linie zwischen Koor_Cursor und Koor_Bild). Dann berechne ich via ArcusCosinus-Funktion (Acos) den Winkel alpha.

Ist Alles oben zu sehen.

Atan2 habe ich ausprobiert wie im Beispiel beschrieben aber es funktioniert nicht. Heißt ich bekomme meinen Winkel nicht korrekt raus, ich bekomme immer irgendwelche völlig sinnfreien Winkel im Minusbereich und auch nur im Bereich des oberen linken viertels des Winkelkreises.

So und jetzt habe ich halt gefragt was man noch machen kann^^

Oder habe ich bei Atan2 irgendetwas verwechselt?

MfG, Fleisch
Worklogs: TotalWar2D
Wbsites: Privat / Entwicklerstudio / Gewerbe (Folgen bald)
Smartphones: Samsung Galaxy S I9000 / Samsung Galaxy S2 I9100 / Samsung Galaxy S3 (Kommt 2012)
Notebook 1: HP Pavillion DV6700 (AMD 64 X2 TL-60 @ 2.00GHz, 4GB DDR3 1333MHz, Nvidia GeFroce 8400M GS, Win Vista Home Premium 32Bit)
Notebook 2: HP Pavillion DV6t Quad Edition (KOMMT BALD =] )
Notebook 3: Clevo X7200 (KOMMT BALD =] )
Desktop: (KOMMT BALD =] )

Xeres

Moderator

BeitragMo, Nov 08, 2010 0:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin mal so frei, auf meinen eigenen Beitrag zu deuten...
Was ein sinnvoller Winkel ist, hängt von der Betrachtungsweise ab...

Nachtrag:
Ich weiß nicht, ob ich das hier schon mal gepostet habe... seis drum.

Bedienung mit den Pfeiltasten:
BlitzBasic: [AUSKLAPPEN]
AppTitle("Sinus & Kosinus")
Graphics(800, 600, 0, 2)
SetBuffer BackBuffer()
Local timer = CreateTimer(60)

Const KEY_Escape = 1, KEY_UP = 200, KEY_DOWN = 208
Const KEY_LEFT = 203, KEY_RIGHT = 205
Local radius = 150, winkel = 45, x, y

Repeat

If KeyDown(KEY_UP) Then radius = ((radius + 1)+300) Mod 300
If KeyDown(KEY_DOWN) Then radius = ((radius -1)+300) Mod 300
If KeyDown(KEY_LEFT) Then winkel = ((winkel + 1)+360) Mod 360
If KeyDown(KEY_RIGHT) Then winkel = ((winkel - 1)+360) Mod 360

x = 400 + Cos(winkel) * radius
y = 300 - Sin(winkel) * radius

;** Der Radius:
Color(255, 0, 0)
Line(400, 300, x, y)
Text(400 + Cos(winkel) * radius/2, 300 - Sin(winkel) * radius/2, "Atan2: "+ATan2(y-300,x-400))
;** Die 0° Linie:
Color(0, 0, 255)
Line(400, 300, 400 + Cos(0) * radius, 300)
Text(400 + Cos(0) * radius, 300, " 0°", False, True)

;*** Sinus:
Color(255, 255, 0)
Line(400, 300, 400, 300 - Sin(winkel) * radius)
Line(x, y, 400, 300 - Sin(winkel) * radius) ;Zum Trabant
Text(380, 300 - Sin(winkel) * radius/2, "Sin", True, True)

;*** Kosinus:
Color(0, 255, 0)
Line(400, 300, 400 + Cos(winkel) * radius, 300)
Line(x, y, 400 + Cos(winkel) * radius, 300) ;Zum Trabant
Text(400 + Cos(winkel) * radius/2, 300, "Cos")

Color(255, 255, 255)
;** Die Mitte...
DrawKreis(400, 300, 10)
;** Die Umlaufbahn...
DrawKreis(400, 300, radius, False)
;** Der Trabant...
DrawKreis(x, y, 5)

Text(10, 10, "Winkel: "+winkel+"°")
Text(10, 25, "Sinus: "+Sin(winkel))
Text(10, 40, "Kosinus: "+Cos(winkel))
Text(10, 55, "Winkel (Atan2): "+(-ATan2(y-300,x-400)+360) Mod 360)

Flip(0)
WaitTimer(timer)
Cls
Until KeyHit(KEY_Escape)
End


Function DrawKreis(fx, fy, fr, solid=1)
Oval(fx-fr, fy-fr, fr*2, fr*2, solid)
End Function
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

CrowSmith

ehemals "Fleisch"

BeitragMo, Nov 08, 2010 0:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt habe ich es so:

Code: [AUSKLAPPEN]

 ;(-ATan2(ZielY - StartY , ZielX - StartX) + 360) Mod 360
 Turmwinkel=(-ATan2(MouseY()-PositionY,MouseX()-PositionX)+360) Mod 360


Der gleiche Fehler wie eben schon...

So langsam aber sicher dreh ich echt am Rad...
Worklogs: TotalWar2D
Wbsites: Privat / Entwicklerstudio / Gewerbe (Folgen bald)
Smartphones: Samsung Galaxy S I9000 / Samsung Galaxy S2 I9100 / Samsung Galaxy S3 (Kommt 2012)
Notebook 1: HP Pavillion DV6700 (AMD 64 X2 TL-60 @ 2.00GHz, 4GB DDR3 1333MHz, Nvidia GeFroce 8400M GS, Win Vista Home Premium 32Bit)
Notebook 2: HP Pavillion DV6t Quad Edition (KOMMT BALD =] )
Notebook 3: Clevo X7200 (KOMMT BALD =] )
Desktop: (KOMMT BALD =] )

Xeres

Moderator

BeitragMo, Nov 08, 2010 0:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie wendest du nun diesen Winkel an? Drehst du die Bilder vor? Sin/Cos?
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

CrowSmith

ehemals "Fleisch"

BeitragMo, Nov 08, 2010 0:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wende den Winkel direkt an:

Code: [AUSKLAPPEN]

 DrawImage3D(Turm,PositionXTurm,PositionYTurm,0,Turmwinkel,1,0)
Worklogs: TotalWar2D
Wbsites: Privat / Entwicklerstudio / Gewerbe (Folgen bald)
Smartphones: Samsung Galaxy S I9000 / Samsung Galaxy S2 I9100 / Samsung Galaxy S3 (Kommt 2012)
Notebook 1: HP Pavillion DV6700 (AMD 64 X2 TL-60 @ 2.00GHz, 4GB DDR3 1333MHz, Nvidia GeFroce 8400M GS, Win Vista Home Premium 32Bit)
Notebook 2: HP Pavillion DV6t Quad Edition (KOMMT BALD =] )
Notebook 3: Clevo X7200 (KOMMT BALD =] )
Desktop: (KOMMT BALD =] )

Xeres

Moderator

BeitragMo, Nov 08, 2010 0:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Man beachte, dass das Draw3D -Koordinatensystem nicht dem gewöhnlichen Koordinatensystem entspricht, sondern seinen Koordinatenursprung im Mittelpunkt des Bildschirms hat. Wobei X+ nach rechts und Y+ nach oben gehen. (DrawImage3D)

Also flippe die Y-Achse:
Code: [AUSKLAPPEN]
Turmwinkel=(ATan2(MouseY()-PositionY,MouseX()-PositionX)+360) Mod 360
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

CrowSmith

ehemals "Fleisch"

BeitragMo, Nov 08, 2010 0:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh maaaaan ich blicke nicht mehr durch...


Also hier ist der Code:
Code: [AUSKLAPPEN]

AppTitle "Test_06"

PositionX#=0
PositionY#=0

Graphics3D 800, 600, 32, 2 ;Grafikmodus X,Y,Farbtiefe,Fenstermodus
SeedRnd MilliSecs()
SetBuffer BackBuffer() ;Setzt den hinteren Buffer als Buffer

Local Timer=CreateTimer(60)
Local Camera=CreateCamera()
CameraClsColor Camera,255,255,255

Include "./Includes/Draw3D2.bb"

DrawInit3D(Camera)

Rumpf = LoadImage3D("./Grafiken/Rumpf.png",2,2,0,0)
Turm = LoadImage3D("./Grafiken/Turm.png",2,2,0,0)

MaskImage3D (Rumpf,$FFFFFF)
MaskImage3D (Turm,$FFFFFF)

Rumpfwinkel#=0
Turmwinkel#=0
GeschwRumpf#=2
GeschwDrehenRumpf=3

Repeat

 ;HidePointer

 DrawImage3D(Rumpf,PositionX,PositionY,0,Rumpfwinkel,1,0)

 PositionXTurm=PositionX-Cos(Rumpfwinkel)*GeschwRumpf
 PositionYTurm=PositionY+Sin(Rumpfwinkel)*GeschwRumpf
 DrawImage3D(Turm,PositionXTurm,PositionYTurm,0,Turmwinkel,1,0)

 If KeyDown(205) Or KeyDown(32) ;Rechts drehen
  Rumpfwinkel=Rumpfwinkel+GeschwDrehenRumpf
 EndIf

 If KeyDown(203) Or KeyDown(30) ;Links drehen
  Rumpfwinkel=Rumpfwinkel-GeschwDrehenRumpf
 EndIf

 If KeyDown(200) Or KeyDown(17) ;Vorwärts
  PositionX=PositionX+Cos(Rumpfwinkel)*GeschwRumpf
  PositionY=PositionY-Sin(Rumpfwinkel)*GeschwRumpf
 EndIf
 
 If KeyDown(208) Or KeyDown(31) ;Rueckwärts
  PositionX=PositionX+Cos(Rumpfwinkel)*GeschwRumpf*-1
  PositionY=PositionY-Sin(Rumpfwinkel)*GeschwRumpf*-1
 EndIf

 If Rumpfwinkel>360
  Rumpfwinkel=0
 ElseIf Rumpfwinkel<0
  Rumpfwinkel=360
 EndIf

 If Turmwinkel>360
  Turmwinkel=0
 ElseIf Turmwinkel<0
  Turmwinkel=360
 EndIf
 
 ;If PositionX>=MouseX() ;Bewegung des Spielers (Turm)
 ; a=PositionX-MouseX()
 ;Else
 ; a=MouseX()-PositionX
 ;EndIf
 
 ;If PositionY>=MouseY()
 ; b=PositionY-MouseY()
 ;Else
 ; b=MouseY()-PositionY
 ;EndIf

 a=Abs(PositionX-MouseX())
 b=Abs(PositionY-MouseY())
 
 If a<=1 Then a=1
 If a>=799 Then a=799
 If b>=599 Then b=599
 If b<=1 Then b=1

 ;c=Sqr((a^2)+(b^2))

 ;Turmwinkel=ACos(((((a^2)-(b^2)-(c^2))/(2*b*c))*-1))

 ;(-ATan2(ZielY - StartY , ZielX - StartX) + 360) Mod 360
 ;Turmwinkel=(ATan2(MouseY()-PositionY,MouseX()-PositionX)+360) Mod 360
 Turmwinkel=(-ATan2(MouseY()-PositionY,MouseX()-PositionX)+360) Mod 360
 
 DebugLog MouseX() + "//" + MouseY()

 ;Begrenzung der Map (X-Achse)
 If PositionX>=400-16
  PositionX=400-16
 ElseIf PositionX<=-400+16
  PositionX=-400+16
 EndIf

 ;Begrenzung der Map (Y-Achse)
 If PositionY>=300-16
  PositionY=300-16
 ElseIf PositionY<=-300+16
  PositionY=-300+16
 EndIf

 FlushKeys

 WaitTimer Timer
 RenderWorld
 Clear3D()
 Flip 0
Forever


Also wie zur verdammten Hölle kriege ich den verdammten Winkel ordentlich raus???

Ich habe schon unzählige Versuche, das Problem zu lösen durchgemacht und nichts hat auch nur ansatzweise geholfen... ich weiss nicht mehr weiter...
Worklogs: TotalWar2D
Wbsites: Privat / Entwicklerstudio / Gewerbe (Folgen bald)
Smartphones: Samsung Galaxy S I9000 / Samsung Galaxy S2 I9100 / Samsung Galaxy S3 (Kommt 2012)
Notebook 1: HP Pavillion DV6700 (AMD 64 X2 TL-60 @ 2.00GHz, 4GB DDR3 1333MHz, Nvidia GeFroce 8400M GS, Win Vista Home Premium 32Bit)
Notebook 2: HP Pavillion DV6t Quad Edition (KOMMT BALD =] )
Notebook 3: Clevo X7200 (KOMMT BALD =] )
Desktop: (KOMMT BALD =] )

ToeB

BeitragMo, Nov 08, 2010 1:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich nicht den richtigen winkel rausfinde, was früher wirklich oft passiert ist obwohl ich das schon x-mal gemacht habe, habe ich mir als erstes den Winkel ausgeben lassen, also was Atan2 ausgibt. Dann bin ich immer mit der Maus zu den Mir bekannten winkeln gegagen, und zwar 0°, 90°, 180° und 270°. (ein bisschen nach gefühl), also 0° war Rechts davon, 90° unten, 180° Links und 270° oben. Dann habe ich die Werte die Atan2 ausgegeben hat abgelesen und mir aufgeschrieben. Und schon kann man rausfinden, das z.B. die winkelwerte genau "negiert" sind, also "-winkel", oder das ein unterschied von 90° da ist etc.

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Nov 08, 2010 1:43
Antworten mit Zitat
Benutzer-Profile anzeigen
In der Draw3D2 ist ein Beispielcode beigelegt der genau das erklärt.

''_Draw3D2\Draw3D2 Stuff, How Use Atan2.bb''

Kurzfassung:

Code: [AUSKLAPPEN]
   Angle#=ATan2(MouseX3D-PositionX,MouseY3D-PositionY)
   DrawImage3D(ImageHandle,PositionX,PositionY,0,Angle)

Man beachte, dass bei der Draw3D(2) bei Atan2 zuerst X dann Y eingetragen wird. Nicht wie bei 2D, wo man besser dran ist, zuerst Y dann X einzutragen. Das ist auch schon das ganze Geheimnis.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

CrowSmith

ehemals "Fleisch"

Betreff: Die Lösung des Problems

BeitragMo, Nov 08, 2010 4:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Nach stundenlangem Blättern durch die Mitschriften zu Draw3D und dem erneuten Anschauen des von hectic genannten Beispiels habe ich es tatsächlich hingekriegt!

Code: [AUSKLAPPEN]

 ;Bewegung des Spielers (Turm)
 Turmwinkel=(ATan2(MouseX3D-PositionX,MouseY3D-PositionY))-90


So funktioniert es!^^

Ich habe schon gedacht ich würde es niemals hinkriegen :>

Danke euch Allen! Danke!

MfG, der Fleisch :]
Worklogs: TotalWar2D
Wbsites: Privat / Entwicklerstudio / Gewerbe (Folgen bald)
Smartphones: Samsung Galaxy S I9000 / Samsung Galaxy S2 I9100 / Samsung Galaxy S3 (Kommt 2012)
Notebook 1: HP Pavillion DV6700 (AMD 64 X2 TL-60 @ 2.00GHz, 4GB DDR3 1333MHz, Nvidia GeFroce 8400M GS, Win Vista Home Premium 32Bit)
Notebook 2: HP Pavillion DV6t Quad Edition (KOMMT BALD =] )
Notebook 3: Clevo X7200 (KOMMT BALD =] )
Desktop: (KOMMT BALD =] )

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group