Cercle, sinusoïdes, ellipses...sans pi, sans fonctions,..etc

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Cercle, sinusoïdes, ellipses...sans pi, sans fonctions,..etc

Message par Huitbit »

Well, I’m standing next to a mountain...

Je crois qu’un ordinateur ne sait faire que des additions( je suis pas sûr de ça mais je tente le coup !).
Les jeux avec un processeur Z80 étaient capables d’animer parfois un nombre impressionnant d’objets (par contre mon MSX ne pouvait pas afficher plus de 4 sprites sur la même ligne !), je les soupçonne d’être coupables d’additions à répétition.
Donc dans mes futurs superméga jeux je calculerai mes trajectoires en faisant des additions pour que mon processeur tienne le coup avec 1002.57 sprites animés simultanément (jusque là tout va bien).

Exemple « le cercle » :

Une équation de cercle en coordonnées polaires ça donne

x = R.cos(a)
y = R.sin(a)

Si on dérive tout ça

dx = -R.sin(a).da
dy = R.cos(a).da

Que je peux aussi écrire

dx = -y.da
dy = x.da

Et même mieux, en posant dx = x (après) – x(avant) et en mettant un grand coup de canif aux maths on obtient :

x(après) = x(avant) –y(avant)*da
y(après) = y(avant) + x(avant)*da

Ben là y a plus d’angles, plus de sinus, plus rien quoi ! COOOOL!
A partir de n’importe quel point courant, je peux tracer un cercle sans me poser la moindre question (idéal pour un jeu).
Ca donne ça :

Code : Tout sélectionner

 ;cercle, ellipes, sinus, cosinus...
 OpenWindow(0, 0, 0, 360,240, 1, "3 secondes, ça vient!")
 StartDrawing(WindowOutput())
 x = 40                              ;valeur initiale de x égale au rayon du cercle
 y = 0                               ;valeur initiale de y
 #pas=0.1
  For i = 1 To 240
     x = x - y * #pas                ;calcul de x 
   y = y + x * #pas                  ;calcul de y 
   Plot(x+60,y+160,$0000FF)          ;tracé du cercle
   Plot(1.5 * x+270,y+160,0)         ;tracé d'une ellipse horizontale 
   Plot(x+160,1.5 * y+160,$F0000F)   ;tracé d'une ellipse verticale
   Plot (i+50,y+50,$0000FF)          ;tracé du sinus 
   Plot (i+50, x+50,$00FF00)         ;tracé du cosinus 
  Next i
 StopDrawing()    
 Delay(3000)                         ;affichage de l'image durant trois secondes
Et maintenant ça va plus !
En théorie, si on diminue le pas (c’est à dire « da ») la courbe est de plus en plus fidèle à ce qu’on cherche.
Hé bé là ... ça foire royalement !
Dès qu’on change le pas on a de mauvaises surprises !
Où est mon erreur ???
Si quelqu’un à une idée !

P.S : je sais pas encore afficher un sprite, si vous savez, remplacez le plot par un sprite, vous verrez ça marche très bien !
P.S : ça marche également très bien avec les paraboles, les rebonds avec amortissement, les trajectoires où on tient compte des frottements de l’air....., toutes les courbes de la galaxie (à part peut-être celle des sexygirls)

Merci d'avance (vous avez vu j'essaye de suis les conseils, mais j'ai parfois du mal!)
Elevé au MSX !
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Magnifique, un vrai matheux! Ca manque!

Ton prog est parfait, mais par défaut les variables en pure sont des entiers (.l). Il faut que tu les changes en flottants (.f) pour pouvoir diminuer le pas.

A noter qu'il existe des algo plus rapides que le tien pour le cercle, et surtout qui suivent les pixels sans faire de trous. On en parle sur l'un des forums. Voir les algos de Lucas et Bresenham.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

En ce moment je joue a megaman sur NES (les 6 premiers) et je me pose la question suivante :

comment émuler une parabole avec uniquement des entiers ?

C'est ce qui est fait sur nintendo pour les lancers de projectiles... Je n'ai pas encore réfléchi à un algo mais si je me met à coder de la 2D c'est là dessus que je bosserai... En attendant tu peux aussi y réfléchir. Le résultat dans des jeux comme megaman ou sonic est (ultra) satisfaisant donc ca laisse à réfléchir sur l'utilisation des réels ^^

Dri ;)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Ca me fait toujours rire cette histoire de parabole! C'est tellement simple que je ne dirai rien, tu vas trouver tout seul sans problème!

Huitbit> Voici le lien pour quelques algos (en anglais mais très facile à comprendre car il y a du code commenté)
http://www.gamedev.net/reference/articl ... cle767.asp
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

djes a écrit :Ca me fait toujours rire cette histoire de parabole! C'est tellement simple que je ne dirai rien, tu vas trouver tout seul sans problème!
Bah je chercherais quand j'aurais fini tous les megaman de la nes ^^ j'ai déjà les 4 premiers à mon actif donc ca devrait pas trop tarder lol. Si je trouve pas je saurais ves qui me tourner :P

Dri :mrgreen:
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

;)
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Il y a tous ces trucs de base dans le merveilleux
CAO sans peine Format PDF en Open Source :)
en plus vous pouvez faire de la 3D :)
Parfait pour les lycéens pour voir l'application de la trigonométrie!
http://www.jp-petit.com/TELECHARGEABLES ... _peine.htm
Dernière modification par Frenchy Pilou le sam. 10/déc./2005 11:15, modifié 1 fois.
Est beau ce qui plaît sans concept :)
Speedy Galerie
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

parabole et rebonds

Message par Huitbit »

Merci pour les infos, j'ai commencé à regarder les sites proposés
C'est vrai que dans un cercle il y a un tout PETIT peu BEAUCOUP de symétrie et forcément quand on l'utilise, on fait beaucoup moins de calculs!

Les pointillés pour la trajectoire des sprites c'est pas grave mais avec plot c'est vrai que ça fait pas joli joli(j'ai vu qu'on peut arranger ça en traçant la courbe avec des bouts de lignes, j'essaierai)!

Pour travailler avec des entiers ça doit être possible, en attendant voila pour la parabole avec des rebonds..

Pour les paraboles, on part du principe que la position c'est la dérivée par rapport au temps de la vitesse ; et la vitesse, c'est la dérivée de l'accélération.

vx = dx/dt
vy = dy/dt

ax = dvx/dt
ay = dvy/dt

Si on s'en tient à la chute libre on ax=0 et ay= g ~10 m.s-2
Avec le même raisonnement qu'avec les cercles on trouve:

x(après)=x(avant) + vx(avant)*dt
y(après)=y(avant)+vy(avant)*dt
vx(après)=vxinitial
vy(après)=vy(avant)+10*dt

Voilà le code:

Code : Tout sélectionner

;parabole
 OpenWindow(0, 0, 0, 860,180, 1, "3 secondes, ça vient!")
 StartDrawing(WindowOutput())
 
;coord de départ
 x.f = 10                             
 y.f = 110 
 
 ;vitesses de départ
 vx.f = 10
 vy.f = -45 
                              
 pas.f=0.05
 
  For i = 1 To 1520
   vy = vy+10*pas  
   x=x+vx*pas
   y=y+vy*pas
   Plot(x+10,y,0)
   
   If y>120     ; gestion des rebonds en fonction de la valeur de y
    vy=-vy*0.95 ; chgt de signe de la compo verticale de la vitesse
   EndIf             ;+ amortissement de 5% à chaque rebond

  Next i

 StopDrawing()    
 Delay(3000)                         ;affichage de l'image durant trois secondes
[/code]


A+
Elevé au MSX !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

voici un exemple commenter pour les sprites

meme pour plot , il vaut mieux reprendre le squelette que je te donne car tu vas utiliser une fenetre avec un ecran dedans !! :D

ON QUITTE AVEC LE BOUTON DROIT DE LA SOURIS :D


; *********** initialisation *********
;coord de départ
X.f = 10
Y.f = 110

;vitesses de départ
vx.f = 10
vy.f = -45

pas.f=0.05
; ******************************


InitMouse ()


; ******** ** pour le sprite *****************
InitSprite ()
; ***************************************



OpenWindow (1, 1,1, 800, 600, #PB_Window_SystemMenu , "test" ) ; on ouvre une fenetre
OpenWindowedScreen ( WindowID (1) , 0, 0, 800, 600, 1, 1, 1) ; on met un ecran dedans !!

; *********** on va creer le sprite !! *****************
CreateSprite (1,16,16) ; on cree un sprite de 16*16
StartDrawing ( SpriteOutput (1)) ; on va dessiner dedans un rond jaune !
Circle (8,8, 8, RGB ($F1,$F8,$C)) ; le voila le beau rond jaune
StopDrawing ()
; ********* le sprite est terminer on va jouer avec !! ******






Repeat ; boucle principale

Event= WaitWindowEvent () ; on regarde si quelqu'un a cliqué sur la croix pour quitter

; ************************** ton prog ici ****************

For i = 1 To 1520
ExamineMouse ()
If MouseButton (2) ; le bouton de souris droit fait quitter !
End
EndIf

vy = vy+10*pas
X=X+vx*pas
Y=Y+vy*pas
;StartDrawing ( ScreenOutput ()) ; activer pour le plot
;FrontColor(255, 255, 255) ; activer pour le plot
; Plot(X+10,Y+150) ; a la place du plot on met notre sprite !
;StopDrawing() ; activer pour le plot
DisplaySprite (1, X+10,Y+150) ; et voila !
FlipBuffers () ; <---- ceci pour voir le dessin se faire +Lent !!
ClearScreen (0, 0, 0) ; <--- ceci efface l'ecran !!

If Y>120 ; gestion des rebonds en fonction de la valeur de y
vy=-vy*0.95 ; chgt de signe de la compo verticale de la vitesse
EndIf ;+ amortissement de 5% à chaque rebond

Next i
; ***************************************************

;FlipBuffers() <--- c'est la place normale pour le flipbuffer
; ClearScreen(0, 0, 0); <--- c'est la place normale pour le clearscreen !!
Until Event= #PB_Event_CloseWindow
Return


:D
Dernière modification par Backup le sam. 10/déc./2005 14:20, modifié 1 fois.
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

Merci M'sieur Dobro,
Là je crois que j'ai du boulot!
Bien sûr comme je suis un snorky boy, j'ai pas lu "cliquer du droit pour sortir"!
Whoua la honte! d'où (ctrl+alt+supp)*21 au moins!!!

Y a un startdrawing qui me gène(message d'erreur) alors je l'ai enlevé


Avant de poser la question, je vais me renseigner sur le forum sur flipbuffers (avantages et inconvénients)

See You

P.S à propos de guitare j'ai une classique et depuis peu une électrique guitare lag (modèle roxanne floyd)
Elevé au MSX !
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

C'est sympa ces codes avec explications à l'appui , j'aime bien .
On en redemande :)
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
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

No problemo,
Là je vais chez Mère-Grand mais dès mon retour j'en enverrai un autre.
Y a pas de pb pour les droits d'auteurs car Newton, Leibniz, Euler, Huyguens, Boole...etc sont un tout petit peu décédés (ha s'ils avaient eu un MSX...).

A+
Elevé au MSX !
AWEAR
Messages : 264
Inscription : ven. 28/oct./2005 8:20
Localisation : Mayotte ( 976 ), Océan Indien, France

Message par AWEAR »

Newton, Leibniz, Euler, Huyguens, Boole...
C'était pas un philosophe Leibniz ?? 8O
La vie est une rose dont il faut accepter les épines, mais la mienne est fannée, arrosée par le goût de mes larmes. (Soprano)
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

AWEAR a écrit :
Newton, Leibniz, Euler, Huyguens, Boole...
C'était pas un philosophe Leibniz ?? 8O
Leibnitz à l'époque, était scientifique, comme la majorité des philosophes, et il a inventé le calcul infinitésimal !
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

Hé bé oui,
Mais il faut savoir qu'à l'époque de ces grands Hommes, faire de la physique et des maths était un loisir bien vu dans les salons, pas un métier!

Leibniz était un TRES TRES grand mathématicien qui a travaillé particulièrement sur le calcul différentiel.

La liste des philosophes qui ont fait des sciences est très longue( Decartes, Archimède..., en fait quasiment tous).

Au fait, pour le prog, c'est plus fluide avec un pas de 0,125.
Ca serait encore mieux si on pouvait contrôler tout ça avec un timer, (mais je sais pas le faire) car en changeant le pas on change la qualité de la courbe.

Ciao
Elevé au MSX !
Répondre