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
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)
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)