kreisfahrt eines rechteckes

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

kreisfahrt eines rechteckes

Beitrag von super_castle »

hallo, ich suche die kreisfahrtformel von einem rechteck für einen einschlagwinkel der räder von 0-45 grad. rechteck :breite=50 länge=100. die achse der einschlagenden räder befindet sich auf der längsseite 10 einheiten von der vorderen kante entfernt.



mfg
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

:? :?
Frage:
ich suche die kreisfahrtformel von einem rechteck für einen einschlagwinkel der räder von 0-45 grad

Benutze:
Bild Suchen

Antwort:
Auto fährt um die Kurve
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
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Beitrag von super_castle »

hallo, vielen dank. ich habe jetz eine einfache variante genommen mit deiner eckpunkteformel, klappt wunderbar. kann jetzt am rechtecksprite alle 4 räder lenken. sieht gut aus und kann es für meine visuelle robotersteuerung mit dem atmega32 an der seriellen schnittstelle schön verwenden. vielleicht hat einer noch andere ideen zum verfeinern der lenkung und der erweiterung von anbauteilen.

mit den steuertasten up,down,left,right probiert es mal aus.

Code: Alles auswählen

  
    
    
  Declare sprite_punkte(x, y, xx, yy, w.f)
  Declare sprite_neu(Sprite, x, y, xx, yy, w.f, dx, dy, h)
  
  Global x1.f,y1.f,dx.f,dy.f,winkel.f,winkeld.f
  
  Global xx1.f,yy1.f,xx2.f,yy2.f,xx3.f,yy3.f,xx4.f,yy4.f
  Global versch_x1.f,versch_y1.f,versch_x2.f,versch_y2.f,versch_x3.f,versch_y3.f,versch_x4.f,versch_y4.f
  Global mul_w.f, sp_lang.f,sp_breit.f
  
  InitSprite()
  InitSprite3D()
  
  OpenWindow(0,0,0,600,500,"sprites!",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)

  OpenWindowedScreen(WindowID(0),5,5,400,400,0,0,0)
  
  CreateGadgetList(WindowID(0))
      TextGadget(0, 450, 35, 105, 20, "Gadget_0")

  ;LoadSprite(0, "roboter.bmp", #PB_Sprite_Texture)
  ;CreateSprite3D(0, 0)
  CreateSprite(0,256,256,#PB_Sprite_Texture)
  CreateSprite3D(0,0)
  StartDrawing(SpriteOutput(0))
    Box(0,0,256,256,RGB(255,0,0))
  StopDrawing() 
  
  CreateSprite(1,500,500,#PB_Sprite_Texture)
  CreateSprite3D(1,1)
  StartDrawing(SpriteOutput(1))
    Box(0,0,500,500,RGB(255,255,0))
  StopDrawing() 
  CreateSprite(2,500,500,#PB_Sprite_Texture)
  CreateSprite3D(2,2)
  CopySprite(1,2) 
   
  CreateSprite(3,10,10,#PB_Sprite_Texture)
  CreateSprite3D(3,3)
  StartDrawing(SpriteOutput(3))
    Box(0,0,10,10,RGB(0,0,255))
  StopDrawing() 
  CreateSprite(4,10,10,#PB_Sprite_Texture)
  CreateSprite3D(4,4)
  CopySprite(3,4) 
  CreateSprite(5,10,10,#PB_Sprite_Texture)
  CreateSprite3D(5,5)
  CopySprite(3,5) 
  CreateSprite(6,10,10,#PB_Sprite_Texture)
  CreateSprite3D(6,6)
  CopySprite(3,6) 
  
  TransparentSpriteColor(0, RGB(255, 0, 255)) 
  Sprite3DQuality(1)
  
  
  dx=100
  dy=100
  
  versch_x1=32
  versch_y1=35
  versch_x2=32
  versch_y2=35
  versch_x3=32
  versch_y3=35
  versch_x4=32
  versch_y4=35
  mul_w=15
  sp_lang=20
  sp_breit=7
  
  
  
  Repeat

    Event.l = WindowEvent()    
    
    If GetAsyncKeyState_(#VK_RIGHT)
      winkeld=winkeld+0.05
      If winkeld>1.5
        winkeld=1.5
      EndIf  
      sprite_punkte(dx,dy,versch_x1,versch_y1,winkel)
      sprite_neu(3,xx1,yy1,sp_breit,sp_lang,winkeld*mul_w+winkel,0,0,255)
      sprite_punkte(dx,dy,versch_x2,versch_y2,winkel)
      sprite_neu(4,xx2,yy2,sp_breit,sp_lang,winkeld*mul_w+winkel,0,0,255)
      sprite_punkte(dx,dy,versch_x3,versch_y3,winkel)
      sprite_neu(5,xx3,yy3,sp_breit,sp_lang,-winkeld*mul_w+winkel,0,0,255)
      sprite_punkte(dx,dy,versch_x4,versch_y4,winkel)
      sprite_neu(6,xx4,yy4,sp_breit,sp_lang,-winkeld*mul_w+winkel,0,0,255)
    ElseIf GetAsyncKeyState_(#VK_LEFT)
      winkeld=winkeld-0.05
      If winkeld<-1.5
        winkeld=-1.5
      EndIf  
      sprite_punkte(dx,dy,versch_x1,versch_y1,winkel)
      sprite_neu(3,xx1,yy1,sp_breit,sp_lang,winkeld*mul_w+winkel,0,0,255)
      sprite_punkte(dx,dy,versch_x2,versch_y2,winkel)
      sprite_neu(4,xx2,yy2,sp_breit,sp_lang,winkeld*mul_w+winkel,0,0,255)
      sprite_punkte(dx,dy,versch_x3,versch_y3,winkel)
      sprite_neu(5,xx3,yy3,sp_breit,sp_lang,-winkeld*mul_w+winkel,0,0,255)
      sprite_punkte(dx,dy,versch_x4,versch_y4,winkel)
      sprite_neu(6,xx4,yy4,sp_breit,sp_lang,-winkeld*mul_w+winkel,0,0,255)
    EndIf
  
    If GetAsyncKeyState_(#VK_UP)
    winkel=winkel+winkeld
      y1=Sin(winkel/180*#PI)*1
      x1=Cos(winkel/180*#PI)*1
      dx+x1
      dy+y1    
    ElseIf GetAsyncKeyState_(#VK_DOWN)
      winkel=winkel-winkeld
      y1=Sin(winkel/180*#PI)*1
      x1=Cos(winkel/180*#PI)*1
      dx-x1
      dy-y1 
    EndIf  
 
    DisplaySprite(1, 0,0)  
    ;CopySprite(2,1) für testzwecke zum zeichnen
    
    sprite_neu(0,dx,dy,25,50,winkel,0,0,255)
    
    sprite_punkte(dx,dy,versch_x1,versch_y1,winkel)
    sprite_neu(3,xx1,yy1,sp_breit,sp_lang,winkeld*mul_w+winkel,0,0,255)
    sprite_punkte(dx,dy,versch_x2,versch_y2,winkel)
    sprite_neu(4,xx2,yy2,sp_breit,sp_lang,winkeld*mul_w+winkel,0,0,255)
    sprite_punkte(dx,dy,versch_x3,versch_y3,winkel)
    sprite_neu(5,xx3,yy3,sp_breit,sp_lang,-winkeld*mul_w+winkel,0,0,255)
    sprite_punkte(dx,dy,versch_x4,versch_y4,winkel)
    sprite_neu(6,xx4,yy4,sp_breit,sp_lang,-winkeld*mul_w+winkel,0,0,255)
        
    FlipBuffers()
  
    Until Event = #PB_Event_CloseWindow   

End  

Procedure sprite_punkte(x, y, xx, yy, w.f)
    w = w * (#PI/180)
    r.f = Sqr(Pow(xx,2)+Pow(yy,2))/2
    t.f = ATan(xx/yy)
    w1.f = w - t : w2.f = w + t : w3.f = w + #PI - t : w4.f = w + #PI + t
    
    xx1= x+Cos(w1)*r
    yy1= y+Sin(w1)*r
    
    xx2=x+Cos(w2)*r
    yy2=y+Sin(w2)*r
   
    xx3=x+Cos(w3)*r 
    yy3=y+Sin(w3)*r   
   
    xx4=x+Cos(w4)*r
    yy4=y+Sin(w4)*r  
    
EndProcedure

Procedure sprite_neu(Sprite, x, y, xx, yy, w.f, dx, dy, h)
  ; Sprite - Nummer des Anzuzeigenen Sprite
  ; x      - X-Positon des Mittelpunks bzw. Rotationspunkts vom Sprite
  ; y      - Y-Positon des Mittelpunks bzw. Rotationspunkts vom Sprite
  ; xx     - Breite des Sprite
  ; yy     - Höhe des Sprite
  ; w      - Rotationswinkel des Sprite (in Grad, wobei 0° Richtung Osten ist)
  ; dx     - Verschiebt den Mittelpunkt und damit auch den Rotationspunkt
  ;          auf dem Sprite in X-Richtung
  ; dy     - Verschiebt den Mittelpunkt und damit auch den Rotationspunkt
  ;          auf dem Sprite in Y-Richtung
  ; h      - Transparenz des Sprite (0 Transparent, 255 voll sichtbar)
    w = w * (#PI/180)
    r.f = Sqr(Pow(xx,2)+Pow(yy,2))/2
    t.f = ATan(xx/yy)
    w1.f = w       - t : w2.f = w       + t : w3.f = w + #PI - t : w4.f = w + #PI + t
    TransformSprite3D(Sprite, Cos(w1)*r, Sin(w1)*r, Cos(w2)*r, Sin(w2)*r, Cos(w3)*r, Sin(w3)*r, Cos(w4)*r, Sin(w4)*r)
    Start3D()
      DisplaySprite3D(Sprite, x-Cos(w)*dy+Sin(w)*dx, y-Sin(w)*dy-Cos(w)*dx, h)
    Stop3D() 
EndProcedure
  

  


pure-fan
Rüpel
Beiträge: 8
Registriert: 18.12.2007 22:45

Beitrag von pure-fan »

Ja, das läuft Super.

MFG
Antworten