ideale Einheiten Drehung herausfinden
Übersicht

![]() |
eizdealerBetreff: ideale Einheiten Drehung herausfinden |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi, ich habe ein ziemlich kniffeliges Problem (auch wenn es auf den ersten blick nicht so aussieht):
Gegeben sind die Richtung, in die eine Einheit schaut und die Richtung, in die die Einheit schauen soll. Beide Werte sind in Grad und liegen im Bereich zwischen 0 und 360. Nun soll ermittelt werden, ob es schneller ist, wenn sich die Einheit nach links oder nach rechts dreht. Ich habe das so probiert: [a\Rotation = Einheit Richtung ; a\TrgtRotation = Einheit Ziel-Richtung] Code: [AUSKLAPPEN] TempFloat# = Abs(a\Rotation - a\TrgtRotation)
If TempFloat# < 0 Then TempFloat = TempFloat + 360 If TempFloat# > 360 Then TempFloat = TempFloat - 360 If TempFloat => 180 Then If a\Rotation => a\TrgtRotation Then a\Rotation = a\Rotation - Float(FrameFactor#) * Float(Typ\RotateSpeed#) ElseIf a\Rotation < a\TrgtRotation Then a\Rotation = a\Rotation + Float(FrameFactor#) * Float(Typ\RotateSpeed#) EndIf ElseIf TempFloat < 180 Then If a\Rotation => a\TrgtRotation Then a\Rotation = a\Rotation - Float(FrameFactor#) * Float(Typ\RotateSpeed#) ElseIf a\Rotation < a\TrgtRotation Then a\Rotation = a\Rotation + Float(FrameFactor#) * Float(Typ\RotateSpeed#) EndIf EndIf Zur Erklärung: Ich berechne die Differenz zwischen TrgtRotation und Rotation, und überprüfe, ob Rotation oder TrgtRotation grösser ist. Bitte lasst euch nicht von den Variablen stören. MFG eiz |
||
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
da hab ich was für dich...
Code: [AUSKLAPPEN] Graphics 800,600,16,2
SetBuffer BackBuffer() Dim Panzer (360) ;PanzerGrafik_berechnen > 360 Einzelbilder < Rect 9,0,2,20 Rect 0,10,20,20,1 Flip Panzer(0) = CreateImage (20,30) GrabImage Panzer(0),0,0 MidHandle Panzer(0) For z= 1 To 359 panzer(z) = CopyImage (Panzer(0)) RotateImage panzer(z),z MidHandle Panzer(z) Text 500,500," Berechne Panzer : "+z Flip Cls Next x= 400: y= 30 ; damit der zielpunkt zu sehen ist Repeat If MouseDown(1) Then x= MouseX () Y= MouseY () ;Winkel bezieht sich auf den Panzer winkel = Objekt_richtung_grad(x,y ,400 ,300) End If ;kürzeren Weg suchen If posPanzer > Winkel And posPanzer -180 < Winkel Then posPanzer = posPanzer -1 If posPanzer > Winkel And posPanzer -180 > Winkel Then posPanzer = posPanzer +1 If posPanzer < Winkel And posPanzer +180 < Winkel Then posPanzer = posPanzer -1 If posPanzer < Winkel And posPanzer +180 > Winkel Then posPanzer = posPanzer +1 If posPanzer = Winkel -180 Or posPanzer -180 = Winkel Then posPanzer = posPanzer +1 posPanzer = (posPanzer+360) Mod 360 ; < 0 oder >359 Oval x-5,y-5,10,10,1 ;Klickpunkt malen DrawBlock Panzer(posPanzer),400,300;Panzer malen Text 100,30, posPanzer + " Panzer" Text 100,60, winkel + " Grad" Flip Cls Until KeyHit (1) End Function Objekt_richtung_grad(Zielpunkt_X,Zielpunkt_Y,Ausgangspunkt_X,Ausgangspunkt_Y ) grad =ATan2(Zielpunkt_Y -Ausgangspunkt_Y, Zielpunkt_X -Ausgangspunkt_X)+90 grad = (grad+360) Mod 360 Return grad End Function Und das war auch kniffelig, aber jetzt geht es.... Kopieren >>>> Probieren |
||
[BB2D | BB3D | BB+]
|
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich benutz das hier .
Bei großem Winkel wird auch ein großer Turn Wert zurück gegeben . Code: [AUSKLAPPEN] Function where_to_turn_Y#(source_pivot,target_pivot) Local temp = CreatePivot() PositionEntity temp,EntityX(source_pivot,True),EntityY(source_pivot,True),EntityZ(source_pivot,True) PointEntity temp,target_pivot Local s# = EntityYaw(source_pivot,True) Local t# = EntityYaw(temp) ; 1 ... 180 Left and -1 ... -180 = Right FreeEntity temp Local wd# =((s - t) Mod 360 + 540) Mod 360 - 180 If Int(wd)=0 Then Return 0.0 EndIf Return -4.0*(wd/10.0) End Function |
||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Pseudo:
Code: [AUSKLAPPEN] winkel_ist=180
winkel_soll=270 links=winkel_ist-winkel_soll rechts=(winkel_ist-winkel_soll)*-1 If links=>rechts Then drehen_links() Else drehen_rechts |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
CodeMaster |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Da muss ich einfach meinen Senf zu geben ![]() Graphics 800,600
SetBuffer BackBuffer() Global PosX#=GraphicsWidth()/2,PosY#=GraphicsHeight()/2,AimX#,AimY#,Dir# While Not KeyDown(1) Cls AimX# = MouseX() AimY# = MouseY() Dir# = Dir# + Sgn(turnto(PosX,PosY,AimX,AimY,Dir#)) * 3 PosX# = PosX# + Cos(Dir#) * 2 PosY# = Posy# + Sin(Dir#) * 2 Oval PosX#-10,PosY#-10,20,20,0 Line PosX#,PosY#,PosX#+Cos(Dir#)*10,PosY#+Sin(Dir#)*10 Flip Wend Function turnto(x1#,y1#,x2#,y2#,dir#) Temp# = (90 - ATan2(x2#-x1#,y2#-y1#) - dir# + 360) Mod 360 If Temp# > 180 Then Temp# = Temp# - 360 Return Temp End Function Wichtig ist die Kombination von der Funktion turnto und der Funktion Sgn. Turnto errechnet den Wert, um den man einen Winkel verändern muss damit das Objekt auf einen bestimmten Punkt "zeigt". Sgn gibt das Vorzeichen dieses Wertes zurück. Mit z.B. 3 multipliziert kann man einen Winkel in 3°-Schritten in die richtige Richtung drehen lassen. |
||
Dies ist ein Text, der an jeden Beitrag von dir angehängt werden kann. Es besteht eine Limit von 500 Buchstaben.
Zuletzt bearbeitet von CodeMaster am Mo Apr 01, Parse error: syntax error, unexpected ';' in htdocs\viewtopic.php on line 102 |
![]() |
eizdealer |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab das jetzt nach Rallimens Methode gelöst. Ist zwar nicht perfekt und braucht etwas mehr Code, aber es funktioniert. Und es ist schnell (sin/cos/tan ist lahm).
Code: [AUSKLAPPEN] If a\Rotation > a\TrgtRotation And a\Rotation -180 < a\TrgtRotation Then
turn = -1 ElseIf a\Rotation > a\TrgtRotation And a\Rotation -180 > a\TrgtRotation Then turn = 1 ElseIf a\Rotation < a\TrgtRotation And a\Rotation +180 < a\TrgtRotation Then turn = -1 ElseIf a\Rotation < a\TrgtRotation And a\Rotation +180 > a\TrgtRotation Then turn = 1 ElseIf a\Rotation = a\TrgtRotation -180 Or a\Rotation -180 = a\TrgtRotation Then turn = 1 EndIf If turn = -1 Then a\Rotation = a\Rotation - Float(FrameFactor#) * Float(Typ\RotateSpeed#) If turn = 1 Then a\Rotation = a\Rotation + Float(FrameFactor#) * Float(Typ\RotateSpeed#) |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group