Code : Tout sélectionner
Procedure epicychoide(cx,cy,rayon,ang.f,q,div=1,k.f=1,col=$ffffff)
If rayon<1:ProcedureReturn:EndIf
If q<1:q=1:EndIf
If div<1:div=1:EndIf
If div>5:div=5:EndIf
k=Abs(k)
If div=1:q=q+1:Else:q=q+div:EndIf
q1.f=q
d1.f=div
nq.f=q1/d1
d=rayon/((nq+k))
t=0
z1.f=(t)
z2.f=(nq*t)
x1=d*(nq*Cos(Radian(z1+ang))-k*(Cos(Radian(z2+ang))))+cx
y1=d*(nq*Sin(Radian(z1+ang))-k*(Sin(Radian(z2+ang))))+cy
mx=x1
my=y1
compt.f=(360/(rayon*2)) ; rayon/2 rayon/3 rayon/4 rayon/5
If compt<0.6:compt=0.6:EndIf
While t<(360*div)
z1.f=(t)
z2.f=(nq*t)
x2.f=Cos(Radian(z1+ang))
y2.f=Sin(Radian(z1+ang))
r.f=(nq*x2-k*Cos(Radian(z2+ang)))
s.f=(nq*y2-k*Sin(Radian(z2+ang)))
x=(d*r)+cx
y=(d*s)+cy
LineXY(x,y,x1,y1)
x1=x
y1=y
t=t+compt
Wend
LineXY(mx,my,x1,y1,col)
EndProcedure
Global lg = 800
Global ht = 600
If OpenWindow(0, 0, 0, lg, ht, "epicycloide", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
Image = CreateImage(#PB_Any, lg, ht)
ii=0
Repeat
Event = WindowEvent()
StartDrawing(ImageOutput(Image))
Box(0,0,lg,ht,0)
a.f=ii/10
opt.f=1
nb=1
div=1
opt=1
For y=15 To ht Step 70
For x=15 To lg Step 70
epicychoide(x,y,30,a,nb,div,opt)
nb=nb+1
If nb>5
nb=1
div=div+1
If div>5
div=1
opt=opt+1
EndIf
EndIf
Next
Next
StopDrawing()
StartDrawing(WindowOutput(0))
DrawImage(ImageID(Image), 0, 0)
StopDrawing()
ii=ii+1
ii=Mod(ii,3600)
Until Event = #PB_Event_CloseWindow Or quit=1
FreeImage(#PB_All)
CloseWindow(0)
EndIf