Engrenage en 3 ou 4 lignes (2 méthodes)+MAJ rabotage

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Engrenage en 3 ou 4 lignes (2 méthodes)+MAJ rabotage

Message par Huitbit »

Hello !
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)
Le même engrenage
Etonnant non ?
Je vous conseille le n°2 :lol: :lol:

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.
Image

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é !

Image

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
METHODE 2
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
C'est tout bête mais ça peut servir :wink:
Voilà, c'était pour faire avancer le schmilblick :lol:

Hasta la vista !
Dernière modification par Huitbit le ven. 09/mai/2008 12:01, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

en mettant :

Code : Tout sélectionner

#a=200
#p=360
on obtient un joli soleil :D

alors que

Code : Tout sélectionner

#amplitude=200
#pulsation=20
ça fait un cerf volant !! :)


et voici un vase avec un cactus dedans !!

Code : Tout sélectionner

#amplitude=200
#pulsation=1
decoupé aux ciseaux :D

Code : Tout sélectionner

#amplitude=20
#pulsation=8.2
Dernière modification par Backup le ven. 09/mai/2008 9:38, modifié 4 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Bizarre, mon PB me dit qu initsprite3D() is not a function...

J'ai une ATI X1950 pro...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Ar-S a écrit :Bizarre, mon PB me dit qu initsprite3D() is not a function...

J'ai une ATI X1950 pro...
ça fait un moment que je soupsconne que tu as des problemes avec ton PB
parceque deja chez moi le code du text->> bmp , ne fonctionne pas niveau librairie PureColor..

pourtant j'ai la derniere version telechargé ...

et chez toi ça marche .. :?


initsprite3D() devrai marcher quelque soit la carte graphique....


peut etre ta version de PB ?? moi je suis encore a la 4.10 ....
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Très sympa, merci! :)
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Exemple de "rabotage" des dents !

Message par Huitbit »

Hello !

Merci d'avoir testé le code, j'espère qu'il sera utile :P(Dobro, t'es allé un peu fort avec #a :lol: :lol: ).
Le code n'est pas commenté :oops: , s'il y a un problème, n'hésitez pas.

Image

Code : Tout sélectionner

;engrenages
;pb v4.10
;*********************************
#largeur_ecran=800
#hauteur_ecran=800
;cercle de rayon #r
#r=#largeur_ecran*0.20

;sinusoïde #a*cos(#p*angle)
#a=30
#p=20

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_3",#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)

If r<#r    ;on coupe une dent  
  r=#r

  ElseIf r>#r+#a*2/3   ;on la rabote
  r=#r+#a*2/3
  EndIf

  x=#r+#a+r*Cos(t)
  y=#r+#a+r*Sin(t)
  
  StartDrawing(SpriteOutput(#spr_engrenage))
  LineXY(x_old,y_old,x,y,RGB(50,50,50))
  StopDrawing()
  x_old=x
  y_old=y
Wend
StartDrawing(SpriteOutput(#spr_engrenage))
DrawingMode(  #PB_2DDrawing_Outlined)
Circle(#r+#a,#r+#a,#a,RGB(50,50,50)) 
FillArea(2*#a,#r,RGB(50,50,50),RGB(0,0,255))
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
Quand ces engrenages tourneront pour de bon, je tiendrai compte de leur moment d'inertie (capacité que possède un corps EDIT[immobile] à empêcher la rotation, pour les translations, on s'occupe de la masse, pour les rotations, du moment d'inertie)

Hasta la vista !
Dernière modification par Huitbit le ven. 09/mai/2008 12:16, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Exemple de "rabotage" des dents !

Message par Backup »

Huitbit a écrit :je tiendrai compte de leur moment d'inertie (capacité que possède un corps à empêcher la rotation,
ha ? tien.. je pensais que l'inertie d'un corps était plutôt l'empêchement de s'arrêter !!

(que la force d'inertie d'un corps augmente avec sa vitesse..) ???
(n'étant pas scientifique, je m'informe :) )
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

@Dobro
Tu as aussi raison !
L'inertie, c'est la capacité qu'a un corps à ne pas changer son état.
Si je suis en mouvement, je fais tout pour y rester, si je suis à l'arrêt, idem.
Exemple : Jonas Lomu a plus d'inertie que moi :lol:
:wink:

J'ai corrigé sur le post précédent !
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Re: Engrenage en 3 ou 4 lignes (2 méthodes)+MAJ rabotage

Message par beauregard »

Huitbit a écrit : faire avancer le schmilblick
merci pour ce petit moment récréatif :)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Huitbit a écrit :@Dobro
Tu as aussi raison !
L'inertie, c'est la capacité qu'a un corps à ne pas changer son état.
Si je suis en mouvement, je fais tout pour y rester, si je suis à l'arrêt, idem.
Exemple : Jonas Lomu a plus d'inertie que moi :lol:
:wink:

J'ai corrigé sur le post précédent !
Moi, si je suis en mouvement, je fais tout pour m'arrêter.
Et si je suis arrêté, ... je fais tout pour que ça dure :lol:
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Dobro a écrit :
Ar-S a écrit :Bizarre, mon PB me dit qu initsprite3D() is not a function...

J'ai une ATI X1950 pro...
ça fait un moment que je soupsconne que tu as des problemes avec ton PB
parceque deja chez moi le code du text->> bmp , ne fonctionne pas niveau librairie PureColor..

pourtant j'ai la derniere version telechargé ...

et chez toi ça marche .. :?


initsprite3D() devrai marcher quelque soit la carte graphique....


peut etre ta version de PB ?? moi je suis encore a la 4.10 ....
Ah ba en fait ça vient de JaPBe car avec la GUI classique, ça marche.

Maintenant il faut que je trouve ou ça foire. (je suis en 4.10 et en 4.20b4)
Répondre