Given a suitable definition for Vector2 (i.e., a 2D vector with the appropriate classes), it is delightfully trivial to implement de Casteljau's algorithm:

de_Casteljau :: Scalar -> [Vector2] -> [[Vector2]]
de_Casteljau t [p] = [[p]]
de_Casteljau t ps = ps : de_Casteljau t (zipWith (line t) ps (tail ps))

line :: Scalar -> Vector2 -> Vector2 -> Vector2
line t a b = (1-t) *| a + t *| b

Now if you want to compute a given point along a Bezier spline, you can do

bezier :: Scalar -> [Vector2] -> Vector2
bezier t ps = head $ last $ de_Casteljau t ps

You can chop one in half with

split :: Scalar -> [Vector2] -> ([Vector2], [Vector2])
split t ps =
 let pss = de_Casteljau t ps
 in (map head pss, map last pss)

And any other beautiful incantations.


Now, de Boor's algorithm is a generalisation of de Casteljau's algorithm. It draws B-splines instead of Bezier-splines (since B-splines generalise Bezier-splines). But I think I may have ACTUALLY MELTED MY BRAIN attempting to comprehend it. Can anybody supply a straightforward Haskell implementation?

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to