Page 1 sur 1

Pour les insomniaques !

Publié : ven. 01/mai/2009 18:54
par Huitbit
Bonjour,

Un petit code tout simple mais qui peut servir alors je le poste !
C'est l'occasion de voir que le clearscreen() est à éviter (saccades!).

Code : Tout sélectionner

;Le pendule simple
;auteur Huitbit
;PureBasic 4.30 (Windows - x86)
;*********************************
#largeur_ecran=600
#hauteur_ecran=600

#sprite_laboratoire=0
#sprite_boule=1

#rayon_boule=16

;-CONDITIONS INITIALES
#longueur_fil=#largeur_ecran*0.6
angle.f=45*#PI/180
vitesse_angulaire.f=0
#g=9.8
#dt=0.2

;-PROGRAMME PRINCIPAL
InitSprite()
InitKeyboard()
OpenWindow(0,0,0,#largeur_ecran,#hauteur_ecran,"Le pendule simple",#PB_Window_ScreenCentered|#PB_Window_SystemMenu  )
OpenWindowedScreen(WindowID(0),0,0,#largeur_ecran,#hauteur_ecran,0,0,0)

;-dessin du décor
CreateSprite(#sprite_laboratoire,#largeur_ecran,#hauteur_ecran)
StartDrawing(SpriteOutput(#sprite_laboratoire))
For i=0 To #largeur_ecran Step 8 ; caractère de largeur 8 pixels
  For j=0 To #hauteur_ecran Step 16 ; caractère de hauteur 16 pixels
    DrawText(i,j,Str(Random(1)),RGB(0,64,0),RGB(0,32,0))
  Next j
Next i
StopDrawing()

;-dessin de la boule
CreateSprite(#sprite_boule,2*#rayon_boule,2*#rayon_boule)
StartDrawing(SpriteOutput(#sprite_boule))
Circle(#rayon_boule,#rayon_boule,#rayon_boule,RGB(100,100,255))
StopDrawing()

;-BOUCLE PRINCIPALE
Repeat
  FlipBuffers() 
  
  ;-EQUATIONS DU MOUVEMENT
  vitesse_angulaire=vitesse_angulaire-#g/#longueur_fil*Sin(angle)*#dt
  angle=angle+vitesse_angulaire*#dt
  
  ;-AFFICHAGE

  ;-décor
  DisplaySprite(#sprite_laboratoire,0,0)

  ;-fil
  StartDrawing(ScreenOutput())
  LineXY(#largeur_ecran*0.5,0,#largeur_ecran*0.5+#longueur_fil*Sin(angle),#longueur_fil*Cos(angle),RGB(255,255,255))
  StopDrawing()

  ;-boule
  DisplayTransparentSprite(#sprite_boule,#largeur_ecran*0.5+#longueur_fil*Sin(angle)-#rayon_boule,#longueur_fil*Cos(angle)-#rayon_boule)
  
  Repeat
    Event = WindowEvent()      
    If  Event = #PB_Event_CloseWindow
      End 
    EndIf
  Until Event = 0
  
  Delay(1)
ForEver
Hasta la vista !

Publié : ven. 01/mai/2009 23:03
par kerkael
Hum, il y a un truc anormal dans l'oscillation de ton pendule ... alors je regarde tes valeurs, et je me demande : Pourquoi avoir choisi un angle de 45° ?
En fait, l'absence de frottement fait que ton angle de 45° se reproduit à l'infini dans l'oscillation.
Et si tu rajoutais les frottements, et que tu proposais un angle de départ ? et si on pouvait choisir la longueur de la corde, et si , et si et si ....

Publié : ven. 01/mai/2009 23:56
par Frenchy Pilou
Un truc rigolo serait de faire bouger la fenêtre et que le pendule en subisse les conséquences :D

Publié : sam. 02/mai/2009 0:23
par Huitbit
@kerkael
Le pendule simple est un modèle théorique sans frottements, c'est pour cela qu'il oscille toujours de la même manière. D'où le titre du post ! Tu peux passer la nuit à le regarder :lol:

Avec des frottements, il s'arrêtera au bout de quelques oscillations.

45° car pour le pendule simple on travaille en général avec de petites oscillations(angle<20°) pour pouvoir résoudre l'équation de manière analytique (on remplace le sin(angle) par l'angle lui-même).
Ici la résolution est numérique donc on est libre de dépasser les 20° tout en ayant des résultats corrects !

Les conditions initiales sont arbitraires, tu peux mettre ce que tu veux !



Avec frottements du type f=k*vitesse_angulaire
modification de l'équation:
vitesse_angulaire=vitesse_angulaire-#g/#longueur_fil*Sin(angle)*#dt

en

vitesse_angulaire=vitesse_angulaire-#coeff_frottements*vitesse_angulaire-#g/#longueur_fil*Sin(angle)*#dt
(on peut factoriser si on veut !)

Code : Tout sélectionner

;Le pendule simple avec frottements
;auteur Huitbit
;PureBasic 4.30 (Windows - x86)
;*********************************
#largeur_ecran=600
#hauteur_ecran=600

#sprite_laboratoire=0
#sprite_boule=1

#rayon_boule=16

;-CONDITIONS INITIALES
#longueur_fil=#largeur_ecran*0.6
angle.f=45*#PI/180
vitesse_angulaire.f=0
#coeff_frottements=0.003
#g=9.8
#dt=0.2

;-PROGRAMME PRINCIPAL
InitSprite()
InitKeyboard()
OpenWindow(0,0,0,#largeur_ecran,#hauteur_ecran,"Le pendule simple avec frottements",#PB_Window_ScreenCentered|#PB_Window_SystemMenu  )
OpenWindowedScreen(WindowID(0),0,0,#largeur_ecran,#hauteur_ecran,0,0,0)

;-dessin du décor
CreateSprite(#sprite_laboratoire,#largeur_ecran,#hauteur_ecran)
StartDrawing(SpriteOutput(#sprite_laboratoire))
For i=0 To #largeur_ecran Step 8 ; caractère de largeur 8 pixels
  For j=0 To #hauteur_ecran Step 16 ; caractère de hauteur 16 pixels
    DrawText(i,j,Str(Random(1)),RGB(0,64,0),RGB(0,32,0))
  Next j
Next i
StopDrawing()

;-dessin de la boule
CreateSprite(#sprite_boule,2*#rayon_boule,2*#rayon_boule)
StartDrawing(SpriteOutput(#sprite_boule))
Circle(#rayon_boule,#rayon_boule,#rayon_boule,RGB(100,100,255))
StopDrawing()

;-BOUCLE PRINCIPALE
Repeat
  FlipBuffers() 
  
  ;-EQUATIONS DU MOUVEMENT
  vitesse_angulaire=vitesse_angulaire-#coeff_frottements*vitesse_angulaire-#g/#longueur_fil*Sin(angle)*#dt
  angle=angle+vitesse_angulaire*#dt
  
  ;-AFFICHAGE
  ;-décor
  DisplaySprite(#sprite_laboratoire,0,0)
  ;-fil
  StartDrawing(ScreenOutput())
  LineXY(#largeur_ecran*0.5,0,#largeur_ecran*0.5+#longueur_fil*Sin(angle),#longueur_fil*Cos(angle),RGB(255,255,255))
  StopDrawing()
  ;-boule
  DisplayTransparentSprite(#sprite_boule,#largeur_ecran*0.5+#longueur_fil*Sin(angle)-#rayon_boule,#longueur_fil*Cos(angle)-#rayon_boule)
  
  Repeat
    Event = WindowEvent()      
    If  Event = #PB_Event_CloseWindow
      End 
    EndIf
  Until Event = 0
  
  Delay(1)
ForEver
@Frenchy Pilou

Pourquoi pas un genre de bilboquet Windows !?
Je te laisse faire, tu as eu l'idée le premier :lol: :lol:

Hasta la vista !

Publié : sam. 02/mai/2009 12:32
par kerkael
Ah, j'aime mieux :lol:

Et sinon, je vois des saccades dans le mouvement. C'est dû à quoi ?

Publié : sam. 02/mai/2009 12:52
par Backup
kerkael a écrit :Ah, j'aime mieux :lol:

Et sinon, je vois des saccades dans le mouvement. C'est dû à quoi ?
a windows , qui est une vraie daube !!

ou alors faut revoir tout le noyau de Purebasic :lol:

Publié : dim. 03/mai/2009 0:53
par Huitbit
@kerkael
Et sinon, je vois des saccades dans le mouvement. C'est dû à quoi ?
Peut-être aussi le startdrawing() dans la boucle principale.
Avec un sprite pour le fil, ça devrait être beaucoup mieux.
Mais si tu veux de bonnes saccades, essaye clearscreen() à la place du sprite qui sert de fond d'écran !

Hasta la vista !