Page 1 sur 1

Cardiogramme

Publié : mer. 28/févr./2007 18:58
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

Publié : mer. 28/févr./2007 19:33
par Patrick88
un "scrooling" sur un sprite ....
plusieurs sprite battement rapide, lent, normal
les enchainer en fonction de la variable que tu dis...

pat

Publié : mer. 28/févr./2007 19:55
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)  

Publié : mer. 28/févr./2007 23:00
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

Publié : mer. 28/févr./2007 23:15
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 ^^

Publié : jeu. 01/mars/2007 0:41
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

Publié : jeu. 01/mars/2007 9:38
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

Publié : jeu. 01/mars/2007 10:12
par Patrick88

Publié : jeu. 01/mars/2007 10:52
par Thyphoon
Patrick88 a écrit :comme ça :

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

pat
Oui comme ça mais en plus jolie :P

Publié : jeu. 01/mars/2007 11:06
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 :)

Publié : jeu. 01/mars/2007 11:31
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

Publié : jeu. 01/mars/2007 12:39
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...

Publié : jeu. 01/mars/2007 12:40
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.

Publié : ven. 02/mars/2007 7:48
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.