Algorithms,
Flex,
Source Code,
8/20/07
Here’s the code driving the cardinal spline function I mentioned in the post last week on visual prototyping with Flex. ActionScript already has a bezier drawing method called “curveTo,” but it obliges you to specify a control point for every anchor point you add to the curve. This is great for precision, but sometimes you just want to run a smooth curve through a bunch of points without having to figure out where all the control points should be.
That’s what’s great about the cardinal spline—the next and previous points on the curve function as the control points. (This means you need to add an extra point to the beginning and end of the curve, as you can see in the diagram accompanying the Wikipedia entry for c-splines.) You also get a “tension” parameter which allows you to set how taut the curve is between points.
I’ve included my current incarnation of this routine below. Here’s how to use it:
If you’re using the function to set the location of a sprite, then you’ll need to maintain two lists of values (one for x position, one for y position) and call the function once for each list as you’re iterating through each segment of the curve.
Update: Here’s an .fla example that uses the function to draw a curved line through twenty random points.
Here’s the source for the function itself:
var t1:Number; var t2:Number; switch (easing) { case “easeinout”: t1 = endVal - prevVal; t2 = nextVal - startVal; break; case “noease”: t1 = 0; t2 = 0; break; case “easein”: t1 = 0; t2 = nextVal - startVal; break; case “easeout”: t1 = endVal - prevVal; t2 = 0; break; } t1 = tension; t2 = tension; var s:Number = curStep / numSteps; var h1:Number = (2 Math.pow(s,3)) - (3 Math.pow(s,2)) + 1; var h2:Number = -(2 Math.pow(s,3)) + (3 Math.pow(s,2)); var h3:Number = Math.pow(s,3) - (2 Math.pow(s,2)) + s; var h4:Number = Math.pow(s,3) - Math.pow(s,2); var value:Number = (h1 startVal) + (h2 endVal) + (h3 t1) + (h4 * t2); return value; }
Documentary music is something that’s interested me ever since hearing Steve Reich’s Different …
Two of my biggest interests—music and space—collided happily with the opportunity to join the …
Here’s a list of links to works cited in my recent talk “Storytelling in the Age of …
I’m very happy to announce the launch of “Timeframing: The Art of Comics on Screens,” a new website …
To celebrate the launch of Upgrade Soul, here’s a screen shot of an eleven year old prototype …
3d content
Algorithms
Animation
Announcements
Authoring tools
Award winners
Comics
Comics related
Commissioned works
Database driven
Digital humanities
Electronic literature
Essays
Events
Exemplary work
Experiments
Featured
Fiction
Flash
Flex
Fun
Games
Games related
Graphic design
Highlights
Interactive design
Ipad
Iphone
Jquery
La flash
Miscellaneous
Museum collected
Music
Musicals
Non fiction
Non project
Opertoon
Original content
Original music
Poetry
Remembrances
Scalar
Shockwave
Source code
Stepworks
Tactile
Tools
Typography
User experience
Vectors journal
Viewfinder
Virtual landscape
Wii