Page 1 sur 1

Polynöme de Lagrange / Tracé de courbe

Publié : mer. 15/août/2007 14:31
par comtois
Ce code permet de tracer une courbe passant par des points prédéfinis.

Code : Tout sélectionner

;Comtois 15/08/07
;Polynôme de Lagrange
;http://www-ipst.u-strasbg.fr/pat/program/infogr06.htm
;http://rfv.insa-lyon.fr/~jolion/ANUM/node20.html
;http://ljk.imag.fr/membres/Bernard.Ycart/mel/ev/node20.html
;PB 4.10 beta 3

;Tracé d'une courbe passant par des points prédéfinis

EnableExplicit
InitSprite()
InitKeyboard()
InitMouse()
OpenScreen(800,600,32,"Lagrange")

#PointControle = 5
#Nb_Points=5

Structure PointF
  x.f
  y.f
EndStructure

Global Dim Pf.Pointf(#Nb_Points-1)
Global Dim d.f(#Nb_Points-1)
Global Dim n.f(#Nb_Points-1)
Dim P.Point(800)

Define.f MemX, Memy
Define i, j, s, p, Mx, My, PointControle, Proche

p = 1
For i = 0 To #Nb_Points-1
  Read Pf(i)\x
  Read Pf(i)\y
Next i

;-Sprite
CreateSprite(0,32,32)
StartDrawing(SpriteOutput(0))
  Circle(16,16,15,#Blue)
StopDrawing()
 
Procedure.f Calcul(x.f)
  Define.f y
  Define i, j

  For i=0 To #Nb_Points-1
    ;d(i)=1
    n(i)=1
    For j = 0 To #Nb_Points-1
      If i<>j
        ;d(i) * (Pf(i)\x-Pf(j)\x)
        n(i) * (x-Pf(j)\x)
      EndIf
    Next j 
    y + (n(i) * Pf(i)\y/d(i))
  Next i 
  ProcedureReturn y
EndProcedure

Repeat
  ClearScreen(0)
  ExamineKeyboard()
  ;-Souris
  If ExamineMouse()
    Mx = MouseX()
    My = MouseY()
    ;Test si la souris est proche d'un point de contrôle
    PointControle = -1
    For i=0 To #Nb_Points-1
      If Mx > Pf(i)\x - #PointControle And Mx < Pf(i)\x + #PointControle
        If My > Pf(i)\y - #PointControle And My < Pf(i)\y + #PointControle
          Proche = i
          PointControle = i
          Break
        EndIf
      EndIf
    Next

    ;La souris est proche d'un point de contrôle
    If MouseButton(#PB_MouseButton_Left) And Proche>-1
        Pf(Proche)\x = Mx
        Pf(Proche)\y = My
    Else
      Proche = -1
    EndIf

  EndIf 

 
  StartDrawing(ScreenOutput())
    ;tri des points
    SortStructuredArray(Pf(), 0, OffsetOf(Pointf\x), #PB_Sort_Float)
    ;Précalcule les dénominateurs
    For i=0 To #Nb_Points-1
      d(i)=1
      For j = 0 To #Nb_Points-1
        If i<>j
          d(i) * (Pf(i)\x-Pf(j)\x)
        EndIf
      Next j 
    Next i
    ;Affiche la courbe passant par les points prédéfinis
    For i=Pf(0)\x To Pf(#Nb_Points-1)\x
      p(i)\x=i
      p(i)\y=calcul(i)
    Next i
    For i=Pf(0)\x To Pf(#Nb_Points-1)\x-1
      LineXY(p(i)\x,p(i)\y,p(i+1)\x,p(i+1)\y,#Red)
    Next i
    ;Affiche les points prédéfinis
    For i=0 To #Nb_Points-1 
      Circle(Pf(i)\x,Pf(i)\y,3,#Green)
    Next i   
    ;Affiche la souris
    LineXY(0,My,799,My,#White)
    LineXY(Mx,0,Mx,599,#White)
    ;La souris est proche d'un point de contrôle   
    If PointControle>-1
      DrawingMode(#PB_2DDrawing_Outlined)
      Circle(Mx, My, #PointControle+2, #White)
    EndIf
    ;Affiche positions des points
    DrawingMode(#PB_2DDrawing_Transparent)
    For i=0 To #Nb_Points-1
      DrawText(Pf(i)\x,Pf(i)\y,Str(Pf(i)\x)+"/"+Str(Pf(i)\y),#Yellow,#Black)
    Next 
  StopDrawing()
  s + p
  If s<Pf(0)\x+1
    p=-p
    s=Pf(0)\x
  EndIf
  If s>Pf(#Nb_Points-1)\x-1
    p=-p
    s=Pf(#Nb_Points-1)\x
  EndIf 

  DisplayTransparentSprite(0,p(s)\x-16,p(s)\y-16)
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)

DataSection
Data.f 25,570
Data.f 180,380
Data.f 360,520
Data.f 625,240
Data.f 760,380
EndDataSection

Publié : mer. 15/août/2007 17:07
par Mytic
Rien à Dire :D Bravo...

Publié : mer. 15/août/2007 17:26
par comtois
Je me demandais à quoi ça pourrait servir dans un jeu, alors peut-être à gérer des déplacements de sprites ? on enregistre quelques points seulement , et la trajectoire est calculée ? faut trouver des applications maintenant ...

Nouvelle version, j'ai un peu optimisé le calcul, et je trie les points pour un affichage correct. et je balade un sprite le long de la courbe .

[EDIT]
J'ai mis le code à jour dans le premier post, ça évitera de le chercher :)

Publié : mer. 15/août/2007 18:11
par Guimauve
En 3D, on fait des trajectoires de caméra avec ça lors des scènes où le joueur ne fait que regarder ce qui se passe. Une séquence animé avec les models du jeu par exemple.

Sauf qu'il y a mieux que les polynomes de lagrange pour faire ça, des splines cubiques paramétriques. Elles ont l'avantage d'être plus "STABLE", c'est à dire que lorsque l'on change un point de contrôle, ce n'est pas toute la courbe qui est affecté mais seulement le segment précédent et suivant le point.

A+
Guimauve

Publié : mer. 15/août/2007 18:33
par Anonyme
bien vu comtois, par contre je me suis amusé à foutre le bordel avec les points , et la courbe a complétement disparue :D

en parlant de jeu, peut t'on recupérer les coordonées de la courbe entre 2 points ?
de façon à faire bouger un sprite dessus par exemple.
je n'ai pas réussi avec les courbes de béziers , a vrai dire j'ai pas trop cherché ^^

Publié : mer. 15/août/2007 18:48
par Guimauve
Ça c'est facile, regarde le calcul de positionnement du sprite.

A+
Guimauve

Publié : mer. 15/août/2007 19:03
par comtois
Cpl.Bator a écrit :bien vu comtois, par contre je me suis amusé à foutre le bordel avec les points , et la courbe a complétement disparue :D

en parlant de jeu, peut t'on recupérer les coordonées de la courbe entre 2 points ?
de façon à faire bouger un sprite dessus par exemple.
je n'ai pas réussi avec les courbes de béziers , a vrai dire j'ai pas trop cherché ^^
Si tu regardes le deuxième code, il y a un sprite qui se balade sur la courbe et normalement j'ai corrigé le problème que tu as vu sur le premier code.

Là tu as la fonction Calcul() qui calcule la position y en fonction de la position en x, donc oui tu peux calculer ta position sur la courbe.

Publié : mer. 15/août/2007 19:05
par Anonyme
je suis vraiment miro , merci les gars :D

Publié : jeu. 16/août/2007 8:01
par ATHOW
Comtois, tu viens de me faire gagner une bonne semaine ! Je cherchais un truc du genre pour mon projet, et j'ai commencé hier à me demander si je pouvais pas utiliser Lagrange... et le voila tout codé, donc, plus de problème !

Merci !

Publié : jeu. 16/août/2007 9:08
par Anonyme
Sauf qu'il y a mieux que les polynomes de lagrange pour faire ça, des splines cubiques paramétriques. Elles ont l'avantage d'être plus "STABLE", c'est à dire que lorsque l'on change un point de contrôle, ce n'est pas toute la courbe qui est affecté mais seulement le segment précédent et suivant le point.
Tu parles bien des courbes de beziers ? si c'est le cas , je veux bien un exemple aussi ^^
cela serais bien de pouvoir l'adapté la dessus :

http://www.purebasic.fr/french/viewtopi ... ght=bezier
http://www.purebasic.fr/french/viewtopi ... ght=bezier

++ :D

Publié : jeu. 16/août/2007 11:41
par comtois
ATHOW a écrit :Comtois, tu viens de me faire gagner une bonne semaine ! Je cherchais un truc du genre pour mon projet, et j'ai commencé hier à me demander si je pouvais pas utiliser Lagrange... et le voila tout codé, donc, plus de problème !

Merci !
Content d'apprendre que ça sera utile à quelqu'un.
Peux-tu me dire à quoi ça va te servir ? juste par curiosité :)

Publié : jeu. 16/août/2007 12:51
par beauregard
comtois a écrit :Content d'apprendre que ça sera utile à quelqu'un.
Peux-tu me dire à quoi ça va te servir ? juste par curiosité :)
- pour les tirs ennemis.
- tir façon rayon delta sortant du psychogun de cobra space adventure ( manga), repris dans certain shoot...

Publié : jeu. 16/août/2007 12:55
par ATHOW
Pour avoir l'aperçu d'un mouvement d'un joueur dans un jeu -encore- un peu top secret :)

J'avais pensé utiliser des Sprite3D de moins en moins transparents qui simulent l'aperçu du mouvement, mais cela surchargeait beaucoup trop le visuel (il y a plusieurs joueurs).

J'ai une autre idée, mais si cela me prend trop de temps/énergie, Lagrange me sortira de cette galère :)

Je vous tiendrais bientôt au courant de ce qu'il en est de ce jeu, mais la première version jouable ne sortira pas avant 2008 à mon avis.

Publié : jeu. 16/août/2007 16:20
par Thyphoon
ATHOW a écrit : Je vous tiendrais bientôt au courant de ce qu'il en est de ce jeu, mais la première version jouable ne sortira pas avant 2008 à mon avis.
Et un petit screenshot juste pour les Purebasiens ? c'est pas possible :P

comtois a écrit :Ce code permet de tracer une courbe passant par des points prédéfinis.
Merci pour ton code il est tres interessant. A croisé avec ton pathfinding on doit pouvoir rendre un deplacement de personnage plus réalise :D

Publié : jeu. 16/août/2007 16:43
par ATHOW
Thyphoon a écrit :
ATHOW a écrit : Je vous tiendrais bientôt au courant de ce qu'il en est de ce jeu, mais la première version jouable ne sortira pas avant 2008 à mon avis.
Et un petit screenshot juste pour les Purebasiens ? c'est pas possible :P
Je n'aime pas utiliser le topic de quelqu'un pour parler de moi et faire du hors sujet, mais... voila le logo :)

Image

Ne réagissez pas sur ce topic, ici on parle de Laplace, pathfinding, etc...