Auto fährt um die Kurve

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Auto fährt um die Kurve

Beitrag von Scarabol »

Hi Leute,

ich hab mal nen Code geschrieben, der ein Auto realistisch um die Kurve fahren lässt. Also Drehpunkt ist die Hinterachse, man kann beliebig hart das Lenkrad einschlagen und das ganze bezieht auch die Länge des Fahrzeugs mit ein.

[edit]
So hier schon das erste Update:

Der Lenkeinschlag dreht langsam auf Null zurück
[/edit]

Code: Alles auswählen

InitSprite()
InitSprite3D()
InitKeyboard()

OpenScreen(1024, 768, 32, "test")

CreateSprite(1, 64, 64, #PB_Sprite_Texture)
StartDrawing(SpriteOutput(1))
  Box(0,  16, 32, 32, RGB(192,192,192))
  Box(32, 16, 32, 32, #Gray)
StopDrawing()
CreateSprite3D(1, 1)

; startposition Auto
carx.f = 200
cary.f = 200
; startwinkel Auto
cara.f = 0
; Geschwindigkeit
cars.f = 5

; radabstand
l = 32

; lenkeinschlag
alpha.f = 0*#PI/180

; gegenwinkel zu alpha
beta.f = 90*#PI/180-alpha

; winkel des Autos
angle.f = cara*#PI/180

; max Lenkausschlag
maxlenk.f = 25*#PI/180

Repeat
  FlipBuffers()
  ClearScreen(0)
  ExamineKeyboard()
  
  ; Lenkung
  If KeyboardPushed(#PB_Key_Left)
    alpha - 0.05
  ElseIf KeyboardPushed(#PB_Key_Right)
    alpha + 0.05
  EndIf
  If alpha > maxlenk
    alpha = maxlenk
  ElseIf alpha < -maxlenk
    alpha = -maxlenk
  EndIf
  
  ; beta neu berechnen: beta=90-alpha
  beta.f = 0.5*#PI-alpha
  
  ; Radius der Vorderachse
  r1.f = l/Cos(beta)
  ; Radius der Hinterachse
  r2.f = Tan(beta)*l
  
  ; Wendepunkt der Kurve bestimmen
  mx.f = carx + Sin(angle)*r2
  my.f = cary + Cos(angle)*r2
  
  If KeyboardPushed(#PB_Key_Up)
    ; speed (cars) auf dem Bogen vorangehen
    angle - cars/r1
    If Abs(beta-#PI/2) > 0.01
      ; neue Position des Autos bestimmen
      carx = mx - Sin(angle)*r2
      cary = my - Cos(angle)*r2
    Else
      ; neue Position des Autos bestimmen
      carx + Cos(angle)*cars
      cary - Sin(angle)*cars
    EndIf
    If alpha < 0
      alpha + 0.02
      If alpha > 0
        alpha = 0
      EndIf
    ElseIf alpha > 0
      alpha - 0.02
      If alpha < 0
        alpha = 0
      EndIf
    EndIf
  EndIf
  
  Start3D()
    ; Sprite drehen
    RotateSprite3D(1, -angle*180/#PI, 0)
    ; Sprite auf der Hinterachse zentrieren
    DisplaySprite3D(1, carx-32+Cos(angle)*16, cary-32-Sin(angle)*16)
  Stop3D()
  
  StartDrawing(ScreenOutput())
    ; Hinterachse anzeigen
    Circle(carx, cary, 3, #Red)
    ; Drehpunkt anzeigen
    Circle(mx, my, 3, #Green)
    DrawingMode(4)
    ; Auto Richtung anzeigen
    Line(carx, cary, Cos(angle)*l, -Sin(angle)*l, #Red)
    ; Radius Vorderachse
    Circle(mx, my, l/Cos(beta), #Red)
    ; Radius Hinterachse
    Circle(mx, my, Tan(beta)*l, #Blue)
    ; Lenkung anzeigen
    Line(carx+Cos(angle)*l, cary-Sin(angle)*l, Cos(angle-alpha)*10, -Sin(angle-alpha)*10, #White)
    Line(carx+Cos(angle)*l, cary-Sin(angle)*l, Cos(angle-alpha+#PI)*10, -Sin(angle-alpha+#PI)*10, #White)
    
    DrawingMode(1)
    FrontColor(#White)
    DrawText(10, 10, "Lenkeinschlag: "+Str(alpha*180/#PI)+"°", #White)
    DrawText(10, 30, "CarAngle: "+StrF(angle*180/#PI, 2)+"°", #White)
    DrawText(10, 50, "r2: "+StrF(r2,2), #White)
  StopDrawing()
  
Until KeyboardReleased(#PB_Key_Escape)
End
Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Cool! Beeindruckend!

Bin aber gerade etwas faul...
Was heißen die Linien? Der Punkt? Der Punkt ist wahrscheinlich der Mittelpunkt des gedachten Kreises, um den das Auto fahren würde?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

die darstellung mit den kreisen ist cool :)
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Danke Leute,

das ganze hat mich auch satte 8 Stunden meines Lebens gekostet :D
7 um die Mathematik zu erarbeiten und 1 ums zu coden...

Also hier noch die Erklärung zu den Kreisen:
- roter Punkt: mittlere Position der Hinterachse
- grüner Punkt: gedachter Mittelpunkt der Kreisbahn auf der das Auto fährt.
- rote Linie: Verbindung Mitte-Hinterachse mit Mitte-Vorderachse
- roter Kreis: Kreisbahn auf der die Vorderachse fährt
- blauer Kreis: Kreisbahn auf der die Hinterachse fährt
- weiße Linien: Vorderräder die immer der roten Kreisbahn folgen

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

volle 8h ist aber ein bisschen sehr lange :freak: :?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

...sagt der Berufscoder... :wink:

@ SG:
Nicht jeder ist so flink wie du. :allright:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Naja bin nicht gerade ein Mathegenie :oops:

Wie lange hättest du denn gebraucht? 7.5 h?

[edit]
Kannst ja mal versuchen eine Beschleunigung einzubauen daran scheiter ich gerade und es wird wohl wieder 8h vergehen...
[/edit]

Gruß
Scarabol
Zuletzt geändert von Scarabol am 11.11.2007 00:17, insgesamt 1-mal geändert.
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> Naja bin nicht gerade ein Mathegenie
me 2

> Wie lange hättest du denn gebraucht? 7.5 h?
Machst du Witze? :wink:
Ich steig ein! Ich wette: Weniger als ½ Stunde! :)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Naja bei mir wars wie gesagt die Herleitung...

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ja, das glaube ich dir. Ich bin in Mathe auch nicht der hellste, obwohl ich vieles verstehe.
Aber selber irgendetwas zurecht-rechnen, nee...

Aber SG, du, der hat sich vermutlich sein ganzes Zimmer voll mit vielen kleinen gelben Post-Its geklebt auf jedem eine Formel :lol:
Der ist das wandelnde Formel-Lager... :allright:

[Schleim]
Eigentlich ist es gar nicht so schwer, wenn man sich mit Sinus, Cosinus und PI auskennt, dann kann man prima Winkel und so berechnen... Und SG kann das, wie gesagt, absolut hervorragend.
[/Schleim]
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten