Courbe bézier (reprise d'un code en C sur wikipédia)

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

Courbe bézier (reprise d'un code en C sur wikipédia)

Message par comtois »

Tout est dans le titre

Code : Tout sélectionner

;Comtois 21/01/07
;Reprise d'un code en C vite fait, faudra l'améliorer à l'occasion ! 
; http://fr.wikipedia.org/wiki/Courbe_de_B%C3%A9zier_en_C

InitSprite()
InitKeyboard()
InitMouse()

OpenScreen(800, 600, 32, "Bezier")

Structure Pointf
  x.f
  y.f
EndStructure

Structure Bezier
  P.Pointf[4]
EndStructure

#PointControle = 4 

 ;-Variables globales
Global Global_Bezier.Bezier
Global level, Proche, PointControle

Global_Bezier\P[0]\x = 10
Global_Bezier\P[0]\y = 510
Global_Bezier\P[1]\x = 260
Global_Bezier\P[1]\y = 20
Global_Bezier\P[2]\x = 380
Global_Bezier\P[2]\y = 300
Global_Bezier\P[3]\x = 748
Global_Bezier\P[3]\y = 400
level = 5

;-Dessine une ligne de couleur (r,v,b)
Procedure DrawLine( x1.l, y1.l, x2.l, y2.l, r.l, v.l, b.l)
  If StartDrawing(ScreenOutput())
    LineXY(x1,y1,x2,y2,RGB(r,v,b))
    StopDrawing()
  EndIf
EndProcedure

Procedure DrawBezierBase(*p.Bezier, r.l, v.l, b.l)
  DrawLine(*p\P[0]\x,*p\P[0]\y,*p\P[1]\x,*p\P[1]\y,r,v,b)
  DrawLine(*p\P[1]\x,*p\P[1]\y,*p\P[2]\x,*p\P[2]\y,r,v,b)
  DrawLine(*p\P[2]\x,*p\P[2]\y,*p\P[3]\x,*p\P[3]\y,r,v,b)
EndProcedure

Procedure DrawBezierRecursive ( *b.Bezier, level.l)
  Define.Bezier left, right 
  If level <= 0
    ;Dessine un segment
    DrawLine(*b\P[0]\x + 0.5, *b\P[0]\y + 0.5, *b\P[3]\x + 0.5, *b\P[3]\y + 0.5, 255, 255, 255)
  Else
    ;subdivide into 2 Bezier segments
    left\P[0]\x = *b\P[0]\x
    left\P[0]\y = *b\P[0]\y
    left\P[1]\x = (*b\P[0]\x + *b\P[1]\x) / 2
    left\P[1]\y = (*b\P[0]\y + *b\P[1]\y) / 2
    left\P[2]\x = (*b\P[0]\x + 2**b\P[1]\x + *b\P[2]\x) / 4
    left\P[2]\y = (*b\P[0]\y + 2**b\P[1]\y + *b\P[2]\y) / 4
    left\P[3]\x = (*b\P[0]\x + 3**b\P[1]\x + 3**b\P[2]\x + *b\P[3]\x) / 8
    left\P[3]\y = (*b\P[0]\y + 3**b\P[1]\y + 3**b\P[2]\y + *b\P[3]\y) / 8
    ;DrawBezierBase(@left,0,255,0);
    right\P[0]\x = left\P[3]\x;
    right\P[0]\y = left\P[3]\y;
    right\P[1]\x = (*b\P[1]\x + 2**b\P[2]\x + *b\P[3]\x) / 4
    right\P[1]\y = (*b\P[1]\y + 2**b\P[2]\y + *b\P[3]\y) / 4
    right\P[2]\x = (*b\P[2]\x + *b\P[3]\x) / 2
    right\P[2]\y = (*b\P[2]\y + *b\P[3]\y) / 2
    right\P[3]\x = *b\P[3]\x
    right\P[3]\y = *b\P[3]\y
    ;DrawBezierBase(@right,0,0,255)
    ;draw the 2 segments recursively
    DrawBezierRecursive (@left,level -1)
    DrawBezierRecursive (@right,level -1)
  EndIf
EndProcedure

 Procedure DrawBezier()
  DrawBezierBase(@Global_Bezier,255,0,0)
  DrawBezierRecursive(@Global_Bezier,level)
 EndProcedure

Repeat
  ClearScreen(#Black)
 
  ;-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 3
      If Mx > Global_Bezier\P[i]\x - #PointControle And Mx < Global_Bezier\P[i]\x + #PointControle
        If My > Global_Bezier\P[i]\y - #PointControle And My < Global_Bezier\P[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
        Global_Bezier\P[Proche]\x = Mx
        Global_Bezier\P[Proche]\y = My
    Else
      Proche = -1
    EndIf

  EndIf
  ;Calcule et trace la courbe de bézier
  DrawBezier() 

  If StartDrawing(ScreenOutput())
    ;Affiche les points de contrôle
    Circle(Global_Bezier\P[0]\x, Global_Bezier\P[0]\y,3,#Red)
    Circle(Global_Bezier\P[1]\x, Global_Bezier\P[1]\y,3,#Red)
    Circle(Global_Bezier\P[2]\x, Global_Bezier\P[2]\y,3,#Red)
    Circle(Global_Bezier\P[3]\x, Global_Bezier\P[3]\y,3,#Red)   
    ;Croix représentant la souris
    LineXY(0, My, 799, My, #Green)
    LineXY(Mx, 0, Mx, 599, #Green) 
    ;La souris est proche d'un point de contrôle   
    If PointControle>-1
      DrawingMode(#PB_2DDrawing_Outlined)
      Circle(Mx, My, #PointControle+2, #Green)
    EndIf 
    StopDrawing() 
  EndIf
  ExamineKeyboard()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) 
Dernière modification par comtois le dim. 21/janv./2007 13:14, 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.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Excellent la modif avec les points de contrôle :D
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Regarde ce post, Mr Pierre Bezier fût l'inventeur des premiers programmes pour le dessin de l'industrie automobile! (Unisurf)
Son combat contre la bureaucratie crasse est innénarable (de lapin) :)
Le premier lien est un bon résumé!

Les autres ont l'air de ne point marcher car c'est le week-end sans doute, on ferme!
Ne pas hésitez à y revenir pour voir le combat d'un homme contre la "machine infernale" :)
Est beau ce qui plaît sans concept :)
Speedy Galerie
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Frenchy Pilou a écrit :Regarde ce post
Je veux bien mais lequel ?
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.
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Oui évidemment çà manque :)
Le voici :D (je ferai signe quand les autres liens remarcheront, car cela vaut vraîment le coup !
http://forums.polyloop.net/2d-3d-chez-a ... 999-a.html
Est beau ce qui plaît sans concept :)
Speedy Galerie
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Mais je suis un âne, je les ai ces fichiers ! :oops:
http://download.yousendit.com/D6B395647767C342 (valable 7 jours)


C'est'y pas lumineux pour comprendre une courbe de bézier? :) (imaginatique)
Image
Dernière modification par Frenchy Pilou le dim. 21/janv./2007 0:44, modifié 1 fois.
Est beau ce qui plaît sans concept :)
Speedy Galerie
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Par contre regarde dans ce thread pourquoi un logiciel comme moi (moment of inspiration)
n'utilise pas les courbes de beziers "normales" :)
http://moi3d.com/forum/messages.php?web ... &msg=290.1

Tu peux aussi regarder comment sont dessinées les courbes dans ce logiciel, elles sont "onctueuses" sous la souris :D
Beta version gratos jusqu'au 11 avril
http://moi3d.com/download.htm
Version française de la Version Beta du 18 janvier 2007
Juste remplacer l'ancien fichier "FrenchStrings" dans le dossier
/MoI beta Jan-18-2007/ui par celui-ci
Facile non?
http://moi3d.com/forum/get_attachment.p ... 7507abbb9b

Ps ton prog de Bezier marche aux petits oignons itou :)
Est beau ce qui plaît sans concept :)
Speedy Galerie
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Intéressant tes liens, les courbes de Bézier racontées par Bézier lui même :)
Et tu as la même chose sur de Casteljau ? :)

Avant d'en arriver aux NURBS j'ai encore pas mal de boulot pour comprendre et apprendre à me servir des surfaces de bézier , mais c'est un sujet intéressant , faut juste que je trouve des cours à mon niveau pour démarrer doucement :)

Ou si quelqu'un connait un bon bouquin de math ?
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.
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Non pas spécialement
Voici les bouquins de De Casteljau, mais c'est un peu "trappu" :)
et indisponible sauf en biblio!
http://www.eyrolles.com/Accueil/Recherc ... +Casteljau

Il était tenu "au secret" par Citroën alors ses mémoires c'est peut-être plus difficile à trouver :)
Dernière modification par Frenchy Pilou le dim. 21/janv./2007 14:02, modifié 1 fois.
Est beau ce qui plaît sans concept :)
Speedy Galerie
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Ou si quelqu'un connait un bon bouquin de math ?
Celui-ci a l'air bien :)
http://www.eyrolles.com/Informatique/Li ... -nurbs.php
Est beau ce qui plaît sans concept :)
Speedy Galerie
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

un dessin de Bézier à ajouter à ta collection :)

http://www.cs.berkeley.edu/~barsky/gifs/bezier.html
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.
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Merci pour les fleurs :)
Est beau ce qui plaît sans concept :)
Speedy Galerie
Répondre