Spiral drawing

Share your advanced PureBasic knowledge/code with the community.
User avatar
Psychophanta
Always Here
Always Here
Posts: 5153
Joined: Wed Jun 11, 2003 9:33 pm
Location: Anare
Contact:

Spiral drawing

Post by Psychophanta »

Comments are in spanish, sorry.

Code: Select all

;Dibuja una linea espiral en la pantalla.
;La espiral puede ser arquimediana o logaritmica.
;Enero 2008 (Psychophanta)
Macro exp(x)
  Pow(2,x#/Log(2))
EndMacro
Procedure.f Spiral(x.f,y.f,R0.f,R.f,b.f,color.f,angle.f=0.0,Archimedean.b=1,res.l=30)
;x.f e y.f son las coordenadas cartesianas del centro de la espiral.
;R0.f y R.f son las longitudes del radio inicial y final respectivamente a dibujar (no deben tener valor 0 o negativo).
;b.f es el ratio con el que crece la espiral.
;color.f es el color de la linea espiral que se dibuja.
;angle.f es el angulo inicial desde donde se empieza a dibujar a una distancia R0.f del centro de la espiral (x.f,y.f)
;Archimedean.b decide si se dibuja una espiral de arquimedes o una logaritmica.
;res.l es el parametro de resolucion con la que se dibuja la linea espiral. Debe ser un valor positivo. A mayor res.l mayor resolucion.
;NOTA: la ecuacion en forma polar de una linea espiral arquimediana es: R=R0+b*F . La de una logaritmica es: R=R0*e^(b*F) , siendo R el radio, R0 el radio inicial, b el ratio de separacion del centro, y F el argumento o angulo.
  Protected arclength.f,lstep.f,DeltaAngle.f,arcresolute.l,anglestep.f
  Protected NextR0.f,nextangle.f
  If Archimedean
    DeltaAngle=(R-R0)/b
    arcresolute.l=Abs(DeltaAngle)*res
    anglestep.f=DeltaAngle/arcresolute
    lstep.f=b*anglestep
    nextangle.f=angle+anglestep:NextR0.f=R0+lstep
    While arcresolute>0:arcresolute-1
      LineXY(x+R0*Cos(angle),y+R0*Sin(angle),x+NextR0*Cos(nextangle),y+NextR0*Sin(nextangle),color)
      angle=nextangle:R0=NextR0
      nextangle+anglestep:NextR0+lstep
    Wend
  Else; logarithmic:
    DeltaAngle=(Log(R)-Log(R0))/b
    arcresolute.l=Abs(DeltaAngle)*res
    anglestep.f=DeltaAngle/arcresolute
    lstep.f=exp(b*anglestep)
    nextangle.f=angle+anglestep:NextR0.f=R0*lstep
    While arcresolute>0:arcresolute-1
      LineXY(x+R0*Cos(angle),y+R0*Sin(angle),x+NextR0*Cos(nextangle),y+NextR0*Sin(nextangle),color)
      angle=nextangle:R0=NextR0
      nextangle+anglestep:NextR0*lstep
    Wend
  EndIf
  ProcedureReturn angle
EndProcedure
To test:

Code: Select all

;TEST IT:
InitSprite():InitKeyboard()
OpenScreen(1024,768,32,"spiral")
Repeat 
  ClearScreen(0):ExamineKeyboard()
  StartDrawing(ScreenOutput())
  Spiral(512,384,1,650,4,$ee33ee,t.f,1,10)
  StopDrawing()
  t.f-0.5:If t.f<=-2*#PI:t.f=0:EndIf
  FlipBuffers():Delay(1)
Until KeyboardPushed(#PB_Key_Escape)
or:

Code: Select all

;TEST IT:
InitSprite():InitKeyboard()
OpenScreen(1024,768,32,"spiral")
Repeat 
  ClearScreen(0):ExamineKeyboard()
  StartDrawing(ScreenOutput())
  Spiral(512,384,1,650,0.114,$ee33ee,t.f,0,10)
  StopDrawing()
  t.f-0.15:If t.f<=-2*#PI:t.f=0:EndIf
  FlipBuffers():Delay(5)
Until KeyboardPushed(#PB_Key_Escape)
http://www.zeitgeistmovie.com

while (world==business) world+=mafia;