[Haskell-cafe] Wildly off-topic: de Boor's algorithm
Andrew Coppin
andrewcoppin at btinternet.com
Thu Jul 15 13:29:34 EDT 2010
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?
More information about the Haskell-Cafe
mailing list