forme géométrique : epicycloîde

Programmation d'applications complexes
manababel
Messages : 135
Inscription : jeu. 14/mai/2020 7:40

forme géométrique : epicycloîde

Message par manababel »

ref : https://mathcurve.com/courbes2d/epicycl ... loid.shtml

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