ideale Einheiten Drehung herausfinden

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

eizdealer

Betreff: ideale Einheiten Drehung herausfinden

BeitragMo, Feb 02, 2004 23:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDi, Feb 03, 2004 0:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 03, 2004 0:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 03, 2004 10:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 03, 2004 15:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Da muss ich einfach meinen Senf zu geben WinkCode: [AUSKLAPPEN]
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

BeitragDi, Feb 03, 2004 15:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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#)

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group