Ces deux bouts de code donnent le même résultat !
Code : Tout sélectionner
vx=-#a*#p*Sin(#p*t)*Cos(t)-#r*Sin(t)
vy=-#a*#p*Sin(#p*t)*Sin(t)+#r*Cos(t)
x=x+vx*dt
y=y+vy*dt
Code : Tout sélectionner
r=#r+#a*Cos(#p*t)
x=#r+#a+r*Cos(t)
y=#r+#a+r*Sin(t)
Etonnant non ?
Je vous conseille le n°2


En ce moment je révise la mécanique (du point et du solide).
En fait, ça fait plus de 300 ans que tout est prêt pour faire des jeux vidéos ! La mécanique est une mine d'or !
J'ai voulu appliquer la formule suivante dans un cas particulier : les engrenages.
J'ai une idée de mini-jeu où les engrenages interviennent.
J'avais trouvé ce post.
http://www.purebasic.fr/french/viewtopi ... engrenages
Mais j'ai abordé le problème différemment.
engrenage = cercle avec un rayon modulé !
Pour la forme des dents, il faut composer les sinus (en trouvant les bonnes harmoniques avec les bonnes amplitudes on peut avoir des formes intéressantes :carré, dents de scie,...).
ESSAYEZ !
http://www.sciences.univ-nantes.fr/phys ... rier1.html
METHODE 1
La première méthode est à éviter(car il y a plus simple), je la mets quand même elle utilise les vitesses.
Le repère R1 est fixe, R2 a un mouvement de translation circulaire et également un mouvement de rotation. Le point M se balade dans R2 avec la fonction cosinus (c'est elle qui va donner la forme des dents !).
Il faut utiliser les coordonnées cartésiennes et cylindriques, le produit vectoriel puis intégrer la vitesse pour avoir la position du point M dans R1.
Et ça marche!
Ici #a("a" comme amplitude) donne la hauteur des dents et #p("p" comme pulsation) le nombre de dents.
Code : Tout sélectionner
;engrenages
;auteur Huitbit
;pb v4.10
;*********************************
#largeur_ecran=800
#hauteur_ecran=800
;cercle de rayon #r
#x_centre=#largeur_ecran*0.5
#y_centre=#hauteur_ecran*0.5
#r=#largeur_ecran*0.25
;sinusoïde #a*cos(#p*angle)
#a=10
#p=30
dt.f=#PI/360
t.f=0
x.f=2*(#r+#a)
y.f=#r+#a
x_old.f=x
y_old.f=y
vx.f
vy.f
#spr_engrenage=0
angle.f
InitSprite()
InitSprite3D()
InitKeyboard()
OpenWindow(0,0,0,#largeur_ecran,#hauteur_ecran,"engrenages_1",#PB_Window_ScreenCentered|#PB_Window_SystemMenu )
OpenWindowedScreen(WindowID(0),0,0,#largeur_ecran,#hauteur_ecran,0,0,0)
CreateSprite(#spr_engrenage,2*(#r+#a),2*(#r+#a), #PB_Sprite_Texture)
While t<2*#PI
t=t+dt
vx=-#a*#p*Sin(#p*t)*Cos(t)-#r*Sin(t)
vy=-#a*#p*Sin(#p*t)*Sin(t)+#r*Cos(t)
x=x+vx*dt
y=y+vy*dt
StartDrawing(SpriteOutput(#spr_engrenage))
LineXY(x_old,y_old,x,y,RGB(0,0,255))
StopDrawing()
x_old=x
y_old=y
Wend
StartDrawing(SpriteOutput(#spr_engrenage))
FillArea(#r,#r,RGB(0,0,255),RGB(200,255,0))
StopDrawing()
CreateSprite3D(#spr_engrenage,#spr_engrenage)
Repeat
Repeat
Event = WindowEvent()
If Event = #PB_Event_CloseWindow
End
EndIf
Until Event = 0
angle=angle+1
If angle=360
angle=0
EndIf
ClearScreen(RGB(0,0,0))
Start3D()
Sprite3DQuality(1)
RotateSprite3D(#spr_engrenage,angle,0)
DisplaySprite3D(#spr_engrenage,0,0)
Stop3D()
Delay(1)
FlipBuffers()
ForEver
Plus simple, on travaille avec les coordonnées cylindriques et on agit directement sur le rayon polaire. La fonction choisie donnera la forme des dents (carrées, pointues, tronquées...etc).
Code : Tout sélectionner
;engrenages
;auteur Huitbit
;pb v4.10
;*********************************
#largeur_ecran=800
#hauteur_ecran=800
;cercle de rayon #r
#r=#largeur_ecran*0.25
;sinusoïde #a*cos(#p*angle)
#a=60
#p=8
dt.f=#PI/720
t.f=0
x.f
y.f
x_old.f=2*(#r+#a)
y_old.f=#r
r.f
#spr_engrenage=0
angle.f
InitSprite()
InitSprite3D()
InitKeyboard()
OpenWindow(0,0,0,#largeur_ecran,#hauteur_ecran,"engrenages_2",#PB_Window_ScreenCentered|#PB_Window_SystemMenu )
OpenWindowedScreen(WindowID(0),0,0,#largeur_ecran,#hauteur_ecran,0,0,0)
CreateSprite(#spr_engrenage,2*(#r+#a),2*(#r+#a), #PB_Sprite_Texture)
While t<2*#PI
t=t+dt
r=#r+#a*(Cos(#p*t)+Cos(4*#p*t))*0.5
x=#r+#a+r*Cos(t)
y=#r+#a+r*Sin(t)
StartDrawing(SpriteOutput(#spr_engrenage))
LineXY(x_old,y_old,x,y,RGB(255,0,0))
StopDrawing()
x_old=x
y_old=y
Wend
StartDrawing(SpriteOutput(#spr_engrenage))
FillArea(#r,#r,RGB(255,0,0),RGB(255,200,0))
StopDrawing()
CreateSprite3D(#spr_engrenage,#spr_engrenage)
Repeat
Repeat
Event = WindowEvent()
If Event = #PB_Event_CloseWindow
End
EndIf
Until Event = 0
angle=angle+1
If angle=360
angle=0
EndIf
ClearScreen(RGB(0,0,0))
Start3D()
Sprite3DQuality(1)
RotateSprite3D(#spr_engrenage,angle,0)
DisplaySprite3D(#spr_engrenage,0,0)
Stop3D()
Delay(1)
FlipBuffers()
ForEver

Voilà, c'était pour faire avancer le schmilblick

Hasta la vista !