Code archives/Graphics/Bezier Curves v1.2
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Well.. erm.. this draws a bezier curve :) v1.2: fixed small memory leak | |||||
; ; Recursive Bezier Curve Demo (v1.2) ; by Jamie "Entity" van den Berge <entity@vapor.com> ; Type Bezier Field sx#, sy# ; startpoint Field ex#, ey# ; endpoint Field csx#, csy# ; startpoint's controlpoint Field cex#, cey# ; endpoint's controlpoint End Type Function DrawBezier( depth, b.Bezier ) Local acsx#, acsy# If depth > 0 Local l.Bezier = New Bezier, r.Bezier = New Bezier ; we haven't reached desired precision level yet, ; so we subdivide into two smaller curves. l\sx = b\sx: l\sy = b\sy r\ex = b\ex: r\ey = b\ey l\csx = (b\sx + b\csx) / 2.0: r\cex = (b\ex + b\cex) / 2.0 l\csy = (b\sy + b\csy) / 2.0: r\cey = (b\ey + b\cey) / 2.0 acsx = (b\csx + b\cex) / 2.0 ; X control point average acsy = (b\csy + b\cey) / 2.0 ; Y control point average l\cex = ( l\csx + acsx ) / 2.0 : r\csx = ( r\cex + acsx ) / 2.0 l\cey = ( l\csy + acsy ) / 2.0 : r\csy = ( r\cey + acsy ) / 2.0 l\ex = ( l\cex + r\csx ) / 2.0: r\sx = l\ex l\ey = ( l\cey + r\csy ) / 2.0: r\sy = l\ey depth = depth - 1 DrawBezier( depth, l ): Delete l ; subdivide left DrawBezier( depth, r ): Delete r ; subdivide right Else Line b\sx, b\sy, b\ex, b\ey EndIf End Function ;--------- ; EXAMPLE ;--------- b.Bezier = New Bezier SeedRnd MilliSecs() While Not KeyHit( 1 ) ; set startpoint to previous end point b\sx = b\ex: b\sy = b\ey ; set startpoint's controlpoint to previous end point's inverse control point b\csx = b\sx+(b\sx-b\cex) b\csy = b\sy+(b\sy-b\cey) ; pick a new endpoint b\ex = Rand( 0, GraphicsWidth()-1 ): b\ey = Rand( 0, GraphicsHeight()-1 ) ; pick a random control point for the new end point. b\cex = Rand( 0, GraphicsWidth()-1 ): b\cey = Rand( 0, GraphicsHeight()-1 ) ; and draw the curve DrawBezier( 5, b ) Delay 400 Wend Delete b End |
Comments
None.
Code Archives Forum