1 ! Copyright (C) 2010 Erik Charlebois
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors combinators kernel locals math math.combinatorics
4 math.polynomials opengl.gl sequences ui.gadgets ui.gadgets.panes
5 ui.render arrays grouping math.vectors assocs
10 :: bernstein-polynomial-ith ( n i -- p )
11 n i nCk { 0 1 } i p^ { 1 -1 } n i - p^ p* n*p ;
13 :: hermite-polynomial ( p0 m0 p1 m1 -- poly )
16 -3 p0 * -2 m0 * + 3 p1 * + m1 neg +
17 2 p0 * m0 + -2 p1 * + m1 +
20 :: kochanek-bartels-coefficients ( tension bias continuity -- s1 d1 s2 d2 )
24 [ 1 continuity + * * 2 / ]
25 [ 1 continuity - * * 2 / ] 2bi
29 [ 1 continuity - * * 2 / ]
30 [ 1 continuity + * * 2 / ] 2bi
33 :: kochanek-bartels-tangents ( points m0 mn c1 c2 -- tangents )
35 first3 :> ( pi-1 pi pi+1 )
43 :: <bezier-curve> ( control-points -- polynomials )
46 [ first length [ { 0 } ] replicate ]
49 control-points [| pt i |
50 n i bernstein-polynomial-ith :> poly
52 j acc [ v poly n*p p+ ] change-nth
57 :: <cubic-hermite-curve> ( p0 m0 p1 m1 -- polynomials )
67 : (cubic-hermite-spline) ( point-in-out-triplets -- polynomials-sequence )
69 first2 [ first2 ] [ [ first ] [ third ] bi ] bi* <cubic-hermite-curve>
73 : <cubic-hermite-spline> ( point-tangent-pairs -- polynomials-sequence )
74 2 clump [ first2 [ first2 ] bi@ <cubic-hermite-curve> ] map ;
76 :: <kochanek-bartels-curve> ( points m0 mn tension bias continuity -- polynomials-sequence )
77 tension bias continuity kochanek-bartels-coefficients :> ( s1 d1 s2 d2 )
79 [ s1 s2 kochanek-bartels-tangents ]
80 [ d1 d2 kochanek-bartels-tangents ] 3bi :> ( in out )
81 points in out [ 3array ] 3map (cubic-hermite-spline) ;
83 : <catmull-rom-spline> ( points m0 mn -- polynomials-sequence )
84 0 0 0 <kochanek-bartels-curve> ;