[TUTO]-Sinus & Cosinus

Informations pour bien débuter en PureBasic
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

[TUTO]-Sinus & Cosinus

Message par flaith »

Vous trouvez que les sinus et cosinus c'est rebutant ?
C'est pas faux, je passe même mon chemin dès que je vois des calculs à base de sinus et cosinus

Je me suis donc forcé ( :?: ) à créé une approche, j'espère simple et compréhensible, par un code

A quoi sert le sinus et le cosinus ? Pour moi, j'espère ne pas me tromper, cela permet de calculer des amplitudes sur l'axe des ordonnées X grâce au Cosinus, et sur l'axe des ordonnées Y grâce au Sinus (ps : Aux matheux merci de m'informer de mon erreur par mp afin de ne pas trop polluer le tuto :mrgreen: )

Donc voici l'exemple :

Code : Tout sélectionner

Global coef.f = 0.0                             ; permet de calculer les anges Cos et Sin
Global balle_x.i, balle_y.i                     ; Position de notre balle

#Pas       = 0.10                                ; plus vous affinez cette valeur plus le calcul est précis
                                                 ; mais plus cela sera lent à l'écran

#Amplitude = 60                                  ; il nous faut un peu de place pour afficher tout ca
#rayon     = 30                                  ; rayon de notre balle

; Calcul de la coordonnée X de notre balle (Cos)
Procedure Balle_X()
  balle_x = Cos(coef) * #Amplitude
EndProcedure

; Variante, ici pour afficher comme une ellipse
Procedure Balle_X_Ellipse()
  balle_x = Cos(coef) * #Amplitude * 2
EndProcedure

; Calcul de la coordonée Y de la balle (Sin)
Procedure Balle_Y()
  balle_y = Sin(coef) * #Amplitude
EndProcedure

; Variante, on veut afficher un rebond
Procedure Balle_Y_Rebond()
  balle_y = Abs(Sin(coef) * -#Amplitude)
EndProcedure

If InitSprite() = 0
  MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)
  End
EndIf

If OpenWindow(0, 0, 0, 320, 200, "Sinus & Cosinus", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
  If OpenWindowedScreen(WindowID(0), 0, 0, 320, 200, 1, 0, 0)
    ; On créé notre Balle
    ; je rajoute +1 sinon mon cercle n'est pas parfait
    CreateSprite(0, #rayon+1, #rayon+1)
    If StartDrawing(SpriteOutput(0))
      ; le cercle commence par le centre
      Circle(#rayon / 2, #rayon / 2, #rayon / 2, RGB(255, 0, 155))
      StopDrawing()
    EndIf

    Repeat
      Repeat
        Event = WaitWindowEvent(10)
        If Event = #PB_Event_CloseWindow
          End
        EndIf
      Until Event = 0

      ; Affichage
      FlipBuffers()
      ; Efface l'écran
      ClearScreen(RGB(0, 0, 200))

      ; on ajout a chaque fois à coef le pas
      ; pas la peine de revenir à un coef 0 car, de toutes facons,
      ; les valeurs min et max du sinus ou du cosinus se situeront toujours
      ; entre -1 et 1
      coef + #Pas

      ; on calcul les coordonées en x (avec le cosinus)
      ; Mettre/Enlever les remarques pour différents tests
      Balle_X()
      ;Balle_X_Ellipse()

      ; et en y (avec le sinus)
      Balle_Y()
      ;Balle_Y_Rebond()

      ; affiche la baballe :-P
      DisplayTransparentSprite(0, 150+balle_x, 70-balle_y)
    ForEver
  Else
    MessageRequester("Error", "Can't open windowed screen!", 0)
  EndIf
EndIf
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: [TUTO]-Sinus & Cosinus

Message par djes »

Pour avoir bidouillé les sinus et cosinus depuis plus de vingt ans, je peux te dire que c'est plus simple que ça. Je vais le faire de façon à ce que tout le monde comprenne, sans jargon pseudo mathématique/scientifique/khâgne (pour des maths sans charabia, je conseille d'ailleurs à tout le monde le wikipedia anglophone par rapport au wikipedia français).

Sinus et cosinus viennent d'un problème millénaire : mettre en équations le cercle.

Avant tout, pour faire le plus simple possible, on va tout faire avec une valeur de 1. Donc un cercle de rayon 1 (mm, cm, m, pieds, pas ; bref ce qu'on veut). Si on veut faire plus grand ou plus petit, on "multipliera" ! Et puis on va dire que gauche-droite c'est des valeurs en X, et devant/derrière des valeurs en Y.

Alors imaginons qu'on veuille créer une formule pour faire un cercle de 1 de rayon, point par point, en partant du centre.

Si je fais un pas en avant (disons 1 en Y), je suis sur le cercle, je n'ai pas besoin d'aller à gauche ou à droite (disons 0 en X). En tout, je me suis déplacé de 1 (ben oui, c'est le rayon du cercle, et ce sera toujours 1. :)

J'ai donc trois valeurs : 1 (la distance parcourue), 1 (pas en avant Y) et 0 (pas de côté X), que je peux combiner pour faire plein d'équations : 0/1 = 0, 1/0 = infini, 1*0 = 0, 1+0 = 1, etc.

Grâce à ces équations, quand j'ai une valeur inconnue, je peux la retrouver à partir des autres valeurs que j'ai.

Et bien le sinus et le cosinus (et la tangeante), sont tout simplement des résultats de ces équations. Ils permettent de retrouver le X si on a pas le Y, le Y si on a pas le X, ou l'angle entre le X et le Y, ou la distance.

Le périmètre (la longueur) d'un cercle dont le rayon est 1 est environ 6.28. Avec sinus et cosinus, si on parcourt le cercle de 0 à 6.28, on aura avec Sinus le Y et avec Cosinus le X.

La moitié de 6.28 est 3.14, ça ne vous dit rien ?

Pour aller plus loin, si on trace un segment dans une direction quelconque et qu'on lui donne une longueur quelconque, il est possible avec quelques opérations de se retrouver dans la configuration du cercle et d'en utiliser les outils comme le sinus. Pour cela on place le segment dans un repère X/Y avec l'un des points sur le 0 (pour cela on soustrait les coordonnées de ce point). On divise la largeur par la longueur totale du segment, et pareil pour la hauteur. On obtient un nouveau segment de longueur 1, qui a la même orientation, mais qui est comparable au rayon de notre fameux cercle. Grâce à ça, on peut connaître l'angle (la direction), utiliser les nouvelles longueurs X/Y pour faire des déplacements homogènes, etc. Ce qui va être très utile dans la programmation de jeux et la gestion des mouvements !

Beaucoup de bla bla pas trop technique j'espère, qui éclaircira un peu les mystères du sinus et cosinus pour ceux qui ont du mal, et qui aussi fera comprendre aux autres pourquoi les radians sont si importants : ils correspondent à quelque chose de concret, et évitent les conversions ! Un angle en radians est simplement une position sur le périmètre du cercle, de 0 à 3.14 pour le demi-cercle.

Quant aux équations de tout à l'heure, ce sont celles du triangle rectangle, avec une hypoténuse de longueur 1...
Répondre