Code : Tout sélectionner
; Real BSpline code by Crisot / SPH
sph_nb=2000
Dim x.f(sph_nb)
Dim y.f(sph_nb)
InitSprite()
InitKeyboard()
InitMouse()
ExamineDesktops()
ddw = DesktopWidth(0)
ddh = DesktopHeight(0)
OpenScreen(ddw,ddh,32,"Bezier")
cw = RGB(255,255,255)
cr = RGB(255,0,0)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Exemple=Random(12)+1
nombre=4+Random(10)
synchro=Random(1)
For i=0 To sph_nb
x(i)=Random(ddw-1)
y(i)=Random(ddh-1)
Next
;Exemple 1: 4 points de base (comme le mec), qui tracent une vrai bspline
;Exemple 2: Pareil que le 1, mais la courbe passe par les points début et fin
; grace au triplage des points début et fin
;Exemple 3: 4 points en carré, qui tracent un quart de cercle
;Exemple 4: 7 points en carré, qui tracent cercle complet
;Exemple 5: Plein de points au pif
;Exemple 6: Plein de points au pif, courbe qui passe par les points début et fin
;synchro = 1: sert juste aux courbes qui passent par les points début et fin, car
; pour ces courbes, les points sont répétés 3 fois, et il faut pouvoir déplacer les 3
; en même temps, sinon ça nique tout :)
Procedure bspline(x0,y0,x1,y1,x2,y2,x3,y3,color)
For i = 0 To 100
t1.f = i/100
t2.f = t1*t1
t3.f = t1*t1*t1
k1.f = 1 - 3*t1 + 3*t2 - t3
k2.f = 4 - 6*t2 + 3*t3
k3.f = 1 + 3*t1 + 3*t2 - 3*t3
xfinal.f = (x0 * k1 + x1 * k2 + x2 * k3 + x3 * t3) / 6
yfinal.f = (y0 * k1 + y1 * k2 + y2 * k3 + y3 * t3) / 6
Plot (xfinal,yfinal,color)
Next I
EndProcedure
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Repeat
ClearScreen(0)
ExamineKeyboard()
ExamineMouse()
If MouseButton(1) And mousepush=0
key=key+1 : key=key%nombre
MouseLocate(x(key),y(key))
EndIf
mousepush=MouseButton(1)
x(key)=MouseX() : y(key)=MouseY() ; Déplacement du point
If synchro=1 ; Juste une gruge pour bouger les points, rien à voir avec la courbe.
x(1)=x(0) : y(1)=y(0)
x(2)=x(0) : y(2)=y(0)
x(nombre-1)=x(nombre-3) : y(nombre-1)=y(nombre-3)
x(nombre-2)=x(nombre-3) : y(nombre-2)=y(nombre-3)
EndIf
StartDrawing(ScreenOutput())
DrawingMode(4)
For n=0 To nombre-1 ; On trace les cercles...
If n=key : Circle(x(n),y(n),5,cr) : Else : Circle(x(n),y(n),5,cw) : EndIf
Next
For n=0 To nombre-4 ; On trace la bspline
bspline(x(n),y(n),x(n+1),y(n+1),x(n+2),y(n+2),x(n+3),y(n+3),cw)
Next
StopDrawing()
FlipBuffers()
Until KeyboardPushed(1)