Page 1 sur 1

Course à pied : 18 Km/h

Publié : jeu. 09/juil./2009 5:27
par Ollivier
Salut,

Bon voilà je pense que ça peut porter à inspiration de poster cette petite curiosité. Je me suis amusé il y a un moment à étudier les mouvements de jambes quand ces dernières gambadent à 18 kilomètres par heure. La référence est le bassin, et non le sol.

A titre indicatif, pour une personne mâle de 20 ans, non fumeur, de 1 mètre 80 de haut, à plus ou moins 5 centimètres avec une masse de 70 Kg à plus ou moins 8 Kg, en système aérobie, la dépense d'énergie dans une course à 18 Km/h est inférieure à la dépense d'énergie dans une course à 14 Km/h. La courbe de dépense d'énergie suit un polynôme de degré 3. Ce polynôme évolue selon quinze paramètres si l'on veut pousser l'étude au perfectionnisme.

J'ai depuis trouvé comment modifier les valeurs afin d'effectuer un arbre des mouvements selon le rythme de course, la charge dorsale, etc, et j'en passe. Donc voici le code initial.

>> Touche Echappement pour quitter
>> Molette de la souris pour modifier la vitesse de lecture (et non le rythme de course)

Bonne bourre!

Code : Tout sélectionner

   DisableDebugger

Structure GraphInfo
   ThreadNo.I
   ScreenOpened.I
   ScreenClosed.I
   ScreenActive.I
   Quit.I
   BackFrame.I
   TestFrame.I
EndStructure

Procedure GraphProcess(*Graph.GraphInfo)
   With *Graph
      InitSprite()
      InitKeyboard()
      InitMouse()
      OpenScreen(800, 600, 32, "")
      \BackFrame = CreateSprite(#PB_Any, 800, 600)
      StartDrawing(SpriteOutput(\BackFrame) )
         Box(0, 0, 800, 600, RGB(1, 1, 1) )
      StopDrawing()
      \TestFrame = CreateSprite(#PB_Any, 80, 60)
      StartDrawing(SpriteOutput(\TestFrame) )
         Box(0, 0, 80, 60, #Red)
      StopDrawing()
      \ScreenOpened = 1
      TG0.F = #PI
      T0V.F = 0.1
         Repeat
            Delay(1)
            T0.F + T0V.F
            T1.F = #PI / 2.0 + Sin(T0) * 0.4
            T2.F = 1.0 + Sin(T0 - #PI / 2.0) * 1.0
            T3.F = 0.5 + Sin(T0) * 0.5
            T4.F = #PI / 2.0
            T5.F = 0.0 - #PI / 2.0
            T6.F = Sin(T0 - #PI / 2.0) * 1.0

            TG0.F + T0V.F
            TG1.F = #PI / 2.0 + Sin(TG0) * 0.4
            TG2.F = 1.0 + Sin(TG0 - #PI / 2.0) * 1.0
            TG3.F = 0.5 + Sin(TG0) * 0.5
            TG4.F = #PI / 2.0
            TG5.F = 0.0 - #PI / 2.0
            TG6.F = Sin(TG0 - #PI / 2.0) * 1.0

            DColX.F = 400.0
            DColY.F = 300.0
            DColWidth.F = Cos(T0 + #PI / 4.0) * 10
            DColHeight.F = Sin(T0 + #PI / 4.0) * 10
            DCuisseX.F = DColX + DColWidth
            DCuisseY.F = DColY + DColHeight
            DCuisseWidth.F  = Cos(T1) * 100
            DCuisseHeight.F = Sin(T1) * 100 
            DJambeX.F = DCuisseX + DCuisseWidth
            DJambeY.F = DCuisseY + DCuisseHeight
            DJambeWidth.F = Cos(T1 + T2) * 100  
            DJambeHeight.F = Sin(T1 + T2) * 100  
            DChevilleX.F = DJambeX + DJambeWidth
            DChevilleY.F = DJambeY + DJambeHeight
            DChevilleWidth.F = Cos(T1 + T2 + T3) * 10
            DChevilleHeight.F = Sin(T1 + T2 + T3) * 10
            DTalonX.F = DChevilleX + DChevilleWidth
            DTalonY.F = DChevilleY + DChevilleHeight
            DTalonWidth.F = Cos(T1 + T2 + T3 + T4) * 5
            DTalonHeight.F = Sin(T1 + T2 + T3 + T4) * 5
            DPiedX.F = DChevilleX + DChevilleWidth
            DPiedY.F = DChevilleY + DChevilleHeight
            DPiedWidth.F = Cos(T1 + T2 + T3 + T5) * 20
            DPiedHeight.F = Sin(T1 + T2 + T3 + T5) * 20
            DOrteilX.F = DPiedX + DPiedWidth
            DOrteilY.F = DPiedY + DPiedHeight
            DOrteilWidth.F = Cos(T1 + T2 + T3 + T5 + T6) * 10
            DOrteilHeight.F = Sin(T1 + T2 + T3 + T5 + T6) * 10

            GColX.F = 400.0
            GColY.F = 300.0
            GColWidth.F = Cos(TG0 + #PI / 4.0) * 10
            GColHeight.F = Sin(TG0 + #PI / 4.0) * 10
            GCuisseX.F = GColX + GColWidth
            GCuisseY.F = GColY + GColHeight
            GCuisseWidth.F  = Cos(TG1) * 100
            GCuisseHeight.F = Sin(TG1) * 100 
            GJambeX.F = GCuisseX + GCuisseWidth
            GJambeY.F = GCuisseY + GCuisseHeight
            GJambeWidth.F = Cos(TG1 + TG2) * 100  
            GJambeHeight.F = Sin(TG1 + TG2) * 100  
            GChevilleX.F = GJambeX + GJambeWidth
            GChevilleY.F = GJambeY + GJambeHeight
            GChevilleWidth.F = Cos(TG1 + TG2 + TG3) * 10
            GChevilleHeight.F = Sin(TG1 + TG2 + TG3) * 10
            GTalonX.F = GChevilleX + GChevilleWidth
            GTalonY.F = GChevilleY + GChevilleHeight
            GTalonWidth.F = Cos(TG1 + TG2 + TG3 + TG4) * 5
            GTalonHeight.F = Sin(TG1 + TG2 + TG3 + TG4) * 5
            GPiedX.F = GChevilleX + GChevilleWidth
            GPiedY.F = GChevilleY + GChevilleHeight
            GPiedWidth.F = Cos(TG1 + TG2 + TG3 + TG5) * 20
            GPiedHeight.F = Sin(TG1 + TG2 + TG3 + TG5) * 20
            GOrteilX.F = GPiedX + GPiedWidth
            GOrteilY.F = GPiedY + GPiedHeight
            GOrteilWidth.F = Cos(TG1 + TG2 + TG3 + TG5 + TG6) * 10
            GOrteilHeight.F = Sin(TG1 + TG2 + TG3 + TG5 + TG6) * 10

            DisplaySprite(\BackFrame, 0, 0)
            StartDrawing(ScreenOutput() )
               Line(DCuisseX, DCuisseY, DCuisseWidth, DCuisseHeight, #White)
               Line(DJambeX, DJambeY, DJambeWidth, DJambeHeight, #White)
               Line(DChevilleX, DChevilleY, DChevilleWidth, DChevilleHeight, #White)
               Line(DTalonX, DTalonY, DTalonWidth, DTalonHeight, #White)
               Line(DPiedX, DPiedY, DPiedWidth, DPiedHeight, #White)
               Line(DOrteilX, DOrteilY, DOrteilWidth, DOrteilHeight, #White)

               Line(GCuisseX, GCuisseY, GCuisseWidth, GCuisseHeight, #White)
               Line(GJambeX, GJambeY, GJambeWidth, GJambeHeight, #White)
               Line(GChevilleX, GChevilleY, GChevilleWidth, GChevilleHeight, #White)
               Line(GTalonX, GTalonY, GTalonWidth, GTalonHeight, #White)
               Line(GPiedX, GPiedY, GPiedWidth, GPiedHeight, #White)
               Line(GOrteilX, GOrteilY, GOrteilWidth, GOrteilHeight, #White)
            StopDrawing()
            FlipBuffers()
            If IsScreenActive()
               ExamineKeyboard()   
               If KeyboardPushed(#PB_Key_Escape)
                  \Quit = 1
               EndIf
               ExamineMouse()
               T0V + MouseWheel() / 100.0
            EndIf
         Until \Quit
      CloseScreen()
      \ScreenOpened = 0
      \ScreenClosed = 1
   EndWith
EndProcedure 

Procedure Graph(*Graph.GraphInfo)
   *Graph\ThreadNo = CreateThread(@GraphProcess(), *Graph)
EndProcedure

   Define Graph.GraphInfo

   Graph(Graph)

   Repeat 
      Delay(1)
      If IsThread(Graph\ThreadNo) = 0
         Break
      EndIf
   ForEver

   End
   
   

Publié : jeu. 09/juil./2009 7:49
par Frenchy Pilou
Donc moins j'avance plus vite, plus je me fatigue plus
:D
Pour le moins étonnant :wink:

PS le truc rigolo, on peut faire de la course en marche arrière :)

Publié : jeu. 09/juil./2009 10:54
par Backup
excellent ! :D

Publié : ven. 10/juil./2009 19:41
par Le Soldat Inconnu
Trop fort, il ne manque que la casquette de facteur avec un gros chien qui lui coure derrière :lol:

Publié : lun. 13/juil./2009 9:09
par Thyphoon
Tient j'avais raté ce sujet ! Excellent ! Tu as repris le code quelque part ou bien c'est du Ollivier 100%? En tout cas c'est très sympa, manque plus que faire le bonhomme tout entier et en faire un jeu .. :P Au moins les mouvements seront fluide :)

Publié : mar. 21/juil./2009 6:27
par Ollivier
Tu as repris le code quelque part ou bien c'est du Ollivier 100%?
100%! C'est simple, si en sortant de chez toi, tu veux courir, tu dois prévenir et demander à Dobro pour qu'il t'autorise à imiter les gestes brèvetés décrits ci-dessus (Ceci est bien entendu l'une des nombreuses conneries que je veux balancer à longueur de temps...)

Plus sérieusement, j'aimerais bien vous montrer l'arbre des mouvements morphologiques de course mais là, je vous balance un code gros comme une maison: j'arrive pas à mettre ces p... de gadgets3D et Window3D, ce qui simplifieraient énormément le schmilblick...

Ollivier

Publié : mar. 21/juil./2009 7:52
par Backup
Ollivier a écrit : 100%! C'est simple, si en sortant de chez toi, tu veux courir, tu dois prévenir et demander à Dobro pour qu'il t'autorise à imiter les gestes brèvetés décrits ci-dessus
développe , tu n'es pas tres clair .

Publié : mar. 21/juil./2009 8:54
par Ollivier
@Dobro

Punaise! T'as raison, je croyais que t'avais la mouche du matin mais il y a une toute petite faute qui s'est glissé dans ma vanne à deux balles, et ça change méchamment le contexte:

« (Ceci est bien entendu l'une des nombreuses conneries que je peux balancer à longueur de temps...) »

Je crois que c'est un doigt plus clair! :D

Ollivier

Re: Course à pied : 18 Km/h

Publié : dim. 08/août/2010 2:38
par Ollivier
Même course en version 4.50...

Re: Course à pied : 18 Km/h

Publié : dim. 08/août/2010 10:54
par venom
ça plante chez moi en pb 4.50 x64
ça ce met en plein écran, puis rien écran noir touche windows pour réduire la fenêtre et fermer le programme avec l'IDE. :?


EDIT: c'est bon j'ai du mettre directx7 en sub systeme :wink:
en effet sympa tout ça.



@++

Re: Course à pied : 18 Km/h

Publié : dim. 08/août/2010 10:59
par TazNormand
Tu sais que ton code pourrait faire partie du PurePunch 2010 !!!

Manque plus que le petit corps, les bras et la tête, tu nous pond tout ça en 200 lignes max (je sais que tu sais faire, au vu de tes précédents codes) et tu as de bonnes chance de gagner sans media :wink:

En tout cas je découvre ce code 1 an après, et je le trouve génial.

Bravo

Re: Course à pied : 18 Km/h

Publié : jeu. 26/août/2010 15:36
par Ollivier

Code : Tout sélectionner

Global Dim T.F(6)
Procedure.F Sum(n.I)
  For I = 1 To n
    Result.F + T(I)
  Next I
  ProcedureReturn Result
EndProcedure  
      InitSprite()
      InitKeyboard()
      InitMouse()
      OpenScreen(800, 600, 32, "")
      BackFrame.I = CreateSprite(#PB_Any, 800, 600)
      StartDrawing(SpriteOutput(BackFrame) )
         Box(0, 0, 800, 600, RGB(1, 1, 1) )
      StopDrawing()
      T0V.F = 0.1
      Dim X.F(6)
      Dim Y.F(6)
      Dim W.F(6)
      Dim H.F(6)
      Dim L.F(6)
      L(1) = 100.0
      L(2) = 100.0
      L(3) = 10.0
      L(4) = 5.0
      L(5) = 25.0
      L(6) = 10.0
         Repeat
            Delay(1)
            DisplaySprite(BackFrame, 0, 0)
            StartDrawing(ScreenOutput() )
            TB0.F + T0V
            For I = 0 To 1
              T(0) = TB0 + #PI * I
              T(1) = Sin(T(0) ) * 0.4 + #PI / 2.0
              T(2) = Sin(T(0) - #PI / 2.0) * 1.0 + 1.0
              T(3) = Sin(T(0) ) * 0.5 + 0.5
              T(4) = #PI / 2.0
              T(5) = #PI
              T(6) = Sin(T(0) - #PI / 2.0) * 1.0
              W(0) = Cos(T(0) + #PI / 4.0) * 10
              H(0) = Sin(T(0) + #PI / 4.0) * 10
              For J = 1 To 6
                X(J) = X(J - 1) + W(J - 1)
                Y(J) = Y(J - 1) + H(J - 1)
                S.F = Sum(J) - (J > 4) * T(4)
                W(J) = Cos(Sum(J) ) * L(J)
                H(J) = Sin(Sum(J) ) * L(J)
                Line(X(J), Y(J), W(J), H(J), #White)
              Next J
            Next
            StopDrawing()
            FlipBuffers()
            ExamineKeyboard()   
            ExamineMouse()
            X(0) = MouseX()
            Y(0) = MouseY()
            T0V + MouseWheel() / 100.0
         Until KeyboardPushed(#PB_Key_Escape)
      CloseScreen()

Re: Course à pied : 18 Km/h

Publié : jeu. 26/août/2010 15:44
par Ollivier
Je serai franchement plus heureux dans ma vie si ce code pouvait servir à des amputés. Et comme tu le dis, ben ça fait déjà un an. Voilà...

Ollivier