85 lines
2.4 KiB
Factor
85 lines
2.4 KiB
Factor
! 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
|
|
|
|
<PRIVATE
|
|
:: bernstein-polynomial-ith ( n i -- p )
|
|
n i nCk { 0 1 } i p^ { 1 -1 } n i - p^ p* n*p ;
|
|
|
|
:: hermite-polynomial ( p0 m0 p1 m1 -- poly )
|
|
p0
|
|
m0
|
|
-3 p0 * -2 m0 * + 3 p1 * + m1 neg +
|
|
2 p0 * m0 + -2 p1 * + m1 +
|
|
4array ;
|
|
|
|
:: kochanek-bartels-coefficients ( tension bias continuity -- s1 d1 s2 d2 )
|
|
1 tension -
|
|
[
|
|
1 bias +
|
|
[ 1 continuity + * * 2 / ]
|
|
[ 1 continuity - * * 2 / ] 2bi
|
|
]
|
|
[
|
|
1 bias -
|
|
[ 1 continuity - * * 2 / ]
|
|
[ 1 continuity + * * 2 / ] 2bi
|
|
] bi ;
|
|
|
|
:: kochanek-bartels-tangents ( points m0 mn c1 c2 -- tangents )
|
|
points 3 clump [
|
|
first3 :> ( 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>
|
|
|
|
:: <bezier-curve> ( 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 ;
|
|
|
|
:: <cubic-hermite-curve> ( p0 m0 p1 m1 -- polynomials )
|
|
p0 length <iota> [
|
|
{
|
|
[ p0 nth ] [ m0 nth ]
|
|
[ p1 nth ] [ m1 nth ]
|
|
} cleave
|
|
hermite-polynomial
|
|
] map ;
|
|
|
|
<PRIVATE
|
|
: (cubic-hermite-spline) ( point-in-out-triplets -- polynomials-sequence )
|
|
2 clump [
|
|
first2 [ first2 ] [ [ first ] [ third ] bi ] bi* <cubic-hermite-curve>
|
|
] map ;
|
|
PRIVATE>
|
|
|
|
: <cubic-hermite-spline> ( point-tangent-pairs -- polynomials-sequence )
|
|
2 clump [ first2 [ first2 ] bi@ <cubic-hermite-curve> ] map ;
|
|
|
|
:: <kochanek-bartels-curve> ( 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) ;
|
|
|
|
: <catmull-rom-spline> ( points m0 mn -- polynomials-sequence )
|
|
0 0 0 <kochanek-bartels-curve> ;
|