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
kreisfahrt eines rechteckes


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

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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
-
- Beiträge: 557
- Registriert: 29.11.2005 15:05
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.
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