Page 1 sur 1

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

Publié : sam. 20/janv./2007 15:37
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) 

Publié : sam. 20/janv./2007 16:02
par Anonyme2
Excellent la modif avec les points de contrôle :D

Publié : sam. 20/janv./2007 18:58
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" :)

Publié : sam. 20/janv./2007 19:34
par comtois
Frenchy Pilou a écrit :Regarde ce post
Je veux bien mais lequel ?

Publié : sam. 20/janv./2007 23:59
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

Publié : dim. 21/janv./2007 0:12
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

Publié : dim. 21/janv./2007 0:37
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 :)

Publié : dim. 21/janv./2007 12:52
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 ?

Publié : dim. 21/janv./2007 13:57
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 :)

Publié : dim. 21/janv./2007 14:00
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

Publié : dim. 21/janv./2007 16:35
par comtois
un dessin de Bézier à ajouter à ta collection :)

http://www.cs.berkeley.edu/~barsky/gifs/bezier.html

Publié : lun. 22/janv./2007 0:16
par Frenchy Pilou
Merci pour les fleurs :)