Polynöme de Lagrange / Tracé de courbe

Partagez votre expérience de PureBasic avec les autres utilisateurs.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Polynöme de Lagrange / Tracé de courbe

Message 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
Dernière modification par comtois le mer. 15/août/2007 20:26, modifié 1 fois.
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.
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Rien à Dire :D Bravo...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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 :)
Dernière modification par comtois le mer. 15/août/2007 20:27, modifié 1 fois.
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.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message 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
Anonyme

Message 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é ^^
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Ça c'est facile, regarde le calcul de positionnement du sprite.

A+
Guimauve
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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.
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.
Anonyme

Message par Anonyme »

je suis vraiment miro , merci les gars :D
ATHOW
Messages : 226
Inscription : mer. 29/déc./2004 16:54

Message 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 !
Anonyme

Message 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
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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é :)
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.
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message 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...
ATHOW
Messages : 226
Inscription : mer. 29/déc./2004 16:54

Message 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.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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
ATHOW
Messages : 226
Inscription : mer. 29/déc./2004 16:54

Message 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...
Répondre