! Copyright (C) 2010 Erik Charlebois ! See http://factorcode.org/license.txt for BSD license. USING: accessors combinators kernel locals math math.combinatorics math.polynomials opengl.gl sequences ui.gadgets ui.gadgets.panes ui.render arrays grouping math.vectors assocs ui.gestures ; IN: math.splines ( pi-1 pi pi+1 ) pi pi-1 v- c1 v*n pi+1 pi v- c2 v*n v+ ] map m0 prefix mn suffix ; PRIVATE> :: ( control-points -- polynomials ) control-points [ length 1 - ] [ first length [ { 0 } ] replicate ] bi :> ( n acc ) control-points [| pt i | n i bernstein-polynomial-ith :> poly pt [| v j | j acc [ v poly n*p p+ ] change-nth ] each-index ] each-index acc ; :: ( p0 m0 p1 m1 -- polynomials ) p0 length iota [ { [ p0 nth ] [ m0 nth ] [ p1 nth ] [ m1 nth ] } cleave hermite-polynomial ] map ; ] map ; PRIVATE> : ( point-tangent-pairs -- polynomials-sequence ) 2 clump [ first2 [ first2 ] bi@ ] map ; :: ( points m0 mn tension bias continuity -- polynomials-sequence ) tension bias continuity kochanek-bartels-coefficients :> ( s1 d1 s2 d2 ) points m0 mn [ s1 s2 kochanek-bartels-tangents ] [ d1 d2 kochanek-bartels-tangents ] 3bi :> ( in out ) points in out [ 3array ] 3map (cubic-hermite-spline) ; : ( points m0 mn -- polynomials-sequence ) 0 0 0 ;