Cardiogramme

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Cardiogramme

Message par Thyphoon »

je cherche une idée pour tracer un cardiogramme de façon la plus economique en CPU, vu que c'est un paramètre purement décoratif dans mon jeu, mais que ce Cardiogramme puisse défiler et varier en fonction d'une variable donnant le Battement part seconde
Voici a quoi ressemble une courbe de cardiogramme
Image

Voilà si vous avez des idées sur la manière de procédé.

Merci d'avance
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

un "scrooling" sur un sprite ....
plusieurs sprite battement rapide, lent, normal
les enchainer en fonction de la variable que tu dis...

pat
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Patrick88 a écrit :un "scrooling" sur un sprite ....
plusieurs sprite battement rapide, lent, normal
les enchainer en fonction de la variable que tu dis...

pat
Moui mais c'est pas aussi facile que ça...

voilà mon premier essais mais je ne sais pas comment faire pour que la courbe y ressemble et que ça soit jolie, et tout ça économique CPU

Code : Tout sélectionner

BPM=80

;-Main
If InitSprite() = 0 Or InitKeyboard()=0 Or InitMouse()=0 Or InitSprite3D()=0 
  MessageRequester("Error","DirectX 7+ is needed.",0) 
EndIf 


OpenScreen(800, 600, 32, "Games") 
CreateSprite(1,200,80)
CreateSprite(2,200,80)
  UsePNGImageDecoder() 
  TransparentSpriteColor(#PB_Default,RGB(255,0,255))
  
  Dim Boom(10)
  Boom(1)=50
  Boom(2)=-10
Repeat
ExamineKeyboard() 

ClearScreen(RGB(255,255,255))
If ElapsedMilliseconds()>Refresh
  Refresh=ElapsedMilliseconds()+100
  i=Random(10)-5
  If ElapsedMilliseconds()>NextBoom
    NextBoom=ElapsedMilliseconds()+(BPM/60)*1000
    i=50
  EndIf
  StartDrawing(SpriteOutput(1))
    LineXY(190,40-old_i,200,40-i,RGB(255,0,0))
  StopDrawing()
  old_i=i
  UseBuffer(1)
  GrabSprite(3,10,0,190,80)
  ClearScreen(0)
  DisplaySprite(3,0,0)
  
EndIf
UseBuffer(-1)
DisplaySprite(1,50,50)
  FlipBuffers(0) 
Until KeyboardPushed(#PB_Key_Escape)  
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

aaaahhh non, c'est pas à ça que je pensais... quand je disais sprite , c'était à un bitmap que je pensais ... ( l'habitude du bbcbasic )

donc 3 bitmaps, un lent un normal un rapide, de la taille de ta zone, tu les dessine avec le paint de ouinouin de façon à ce que les fins des images = les débuts, tu les "loadsprite", tu les affiches en les faisant "défiler" (je sais pas comment) , lorsque ta variable change, tu changes de bitmap....

voilivoilou

pat
Dorian
Messages : 489
Inscription : mar. 15/mars/2005 15:33

Message par Dorian »

Une autre solution : une transformée de Fourrier (ou Laplace euh ... j'ai un trou de mémoire :lol: ) 8O

Enfin plus sérieusement, en électronique, on apprend que tout signal (signal carré, triangle, ..., bizarre ^^, ...) peuvent être décomposé en une somme de signaux sinusoïdaux.

Donc ta courbe cardiaque pourrait très certainement être traîté de la même manière et avoir une courbe en fonction du temp pour laquelle tu modifie 4~5 valeurs pour changer la forme :D .

Oki je retourne à mon wrapping au lieu de proposer des trucs de tarrés ^^
Dorian
Messages : 489
Inscription : mar. 15/mars/2005 15:33

Message par Dorian »

Bon c'est une très mais alors très mauvaise idée :(

J'ai fais quelques test sous MathCAD et le résultat n'est pas bon.

Avec une somme de 50 (An*Cos(n*w*t) + Bn*Sin(n*w*t)), le pic n'est toujours pas pointu alors que le reste resemble de moins en moins à quelque chose :cry: . Je m'y suis peut-être mal pris mais le résultat n'est pas aussi bon que je ne l'espérais, domage
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Dorian a écrit :Bon c'est une très mais alors très mauvaise idée :(

J'ai fais quelques test sous MathCAD et le résultat n'est pas bon.

Avec une somme de 50 (An*Cos(n*w*t) + Bn*Sin(n*w*t)), le pic n'est toujours pas pointu alors que le reste resemble de moins en moins à quelque chose :cry: . Je m'y suis peut-être mal pris mais le résultat n'est pas aussi bon que je ne l'espérais, domage
C'est pas grave c'est l'intention qui compte ! :p Merci de t'être penché sur le problème en tout cas. Si tu as une autre idée.

Patrick88 a écrit :aaaahhh non, c'est pas à ça que je pensais... quand je disais sprite , c'était à un bitmap que je pensais ... ( l'habitude du bbcbasic )

donc 3 bitmaps, un lent un normal un rapide, de la taille de ta zone, tu les dessine avec le paint de ouinouin de façon à ce que les fins des images = les débuts, tu les "loadsprite", tu les affiches en les faisant "défiler" (je sais pas comment) , lorsque ta variable change, tu changes de bitmap....

voilivoilou

pat
A ok je comprends mieux, j'aurais préféré resté dans le type vectoriel pour pouvoir nuancer les couleurs en fonction des batements du coeur.
Mais si je n'y arrive pas je suivrais ta methode
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Patrick88 a écrit :comme ça :

http://mobile.jeuxvideo.com/screenshots ... finale.htm

pat
Oui comme ça mais en plus jolie :P
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

tu peux aussi regarder du côté de la méthode des moindres carrés , ou interpolation polynomiale

C'est un sujet qui m'intéresse, ça fait plusieurs fois que je remets, il serait temps que je fasse un essai :)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

comtois a écrit :tu peux aussi regarder du côté de la méthode des moindres carrés , ou interpolation polynomiale

C'est un sujet qui m'intéresse, ça fait plusieurs fois que je remets, il serait temps que je fasse un essai :)
Merci beaucoup comtois !
Tu fais partit de ses personnes qui me font regreter de ne pas être plus callé en Math. A chaqu'une de tes reponses un Eldorado a la porté de la main, mais il me manque quelques centimètres pour l'ateindre lollllllll
Un grand merci pour le temps que tu passes a repondre a mes questions.

Edit: Elles sont dans quel langue les formules ? :P
Avatar de l’utilisateur
Polux
Messages : 440
Inscription : mer. 21/janv./2004 11:17
Localisation : france
Contact :

Message par Polux »

un petit essai avec une simple sinusoide ( utilise espace pour varier )

Code : Tout sélectionner

InitSprite()
InitKeyboard()


Global varie.f,varie3.f

varie=50

OpenScreen(800,600,32,"cardio")

Repeat

ClearScreen(0)

StartDrawing(ScreenOutput())

For i=1 To 799
Plot(i,500+(varie3*Sin(25*i+varie)),RGB(255,255,255))
Next i

StopDrawing()

If varie<360:varie+0.5:EndIf
If varie>=360:varie=0:EndIf

FlipBuffers()
ExamineKeyboard()

If KeyboardPushed(#PB_Key_Space):varie3+1:EndIf
Until KeyboardPushed(#PB_Key_Escape)
une piste peut-être...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

mon collègue vient de me dire qu' Excel permet de calculer l'équation d'une fonction avec quelques points, mais il ne sait plus comment il avait fait.

En faisant une recherche dans l'aide j'ai vu ça, mais j'ai pas encore trouvé l'onglet type pour choisir Polynomiale.
Si quelqu'un sait comment faire en attendant que ça revienne à l'esprit de mon collègue, je suis preneur :)

L'idée serait de relever des points sur ton graphique et de demander à Excel de calculer l'équation correspondante.
Ajout d'une courbe de tendance à une série de données

1 Cliquez sur la série de données à laquelle vous voulez ajouter une courbe de tendance ou une moyenne mobile.
2 Dans le menu Graphique, cliquez sur Ajouter une courbe de tendance.
3 Sous l'onglet Type, cliquez sur le type de courbe de régression ou de moyenne mobile souhaité.

Si vous avez sélectionné Polynomiale, tapez dans la zone Ordre la puissance la plus élevée pour la variable indépendante.

Si vous avez sélectionné Moyenne mobile, tapez dans la zone Période le nombre de périodes à utiliser pour calculer la moyenne mobile.

Remarques

· La zone Série de base répertorie toutes les séries de données du graphique qui prennent en charge les courbes de tendance. Pour ajouter une courbe de tendance à une autre série, cliquez dans la zone de liste sur le nom correspondant, puis sélectionnez les options souhaitées.
· Si vous ajoutez une moyenne mobile à un graphique en nuages de points, elle est basée sur l'ordre des valeurs X tracées dans le graphique. Pour obtenir le résultat souhaité, il est possible que vous deviez trier les valeurs X avant d'ajouter une moyenne mobile.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Merci beaucoup ! Là aussi je continue mes recherches :P
Des que j'ai quelques choses qui marche et qui ressemble a quelques choses je posterais le code.
Répondre