]> gitweb.factorcode.org Git - factor.git/blob - extra/math/splines/splines.factor
factor: trim using lists
[factor.git] / extra / math / splines / splines.factor
1 ! Copyright (C) 2010 Erik Charlebois
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: arrays combinators grouping kernel math
4 math.combinatorics math.polynomials math.vectors sequences ;
5 IN: math.splines
6
7 <PRIVATE
8 :: bernstein-polynomial-ith ( n i -- p )
9     n i nCk { 0 1 } i p^ { 1 -1 } n i - p^ p* n*p ;
10
11 :: hermite-polynomial ( p0 m0 p1 m1 -- poly )
12     p0
13     m0
14     -3 p0 * -2 m0 * + 3 p1 * + m1 neg +
15     2 p0 * m0 + -2 p1 * + m1 +
16     4array ;
17
18 :: kochanek-bartels-coefficients ( tension bias continuity -- s1 d1 s2 d2 )
19     1 tension -
20     [
21         1 bias +
22         [ 1 continuity + * * 2 / ]
23         [ 1 continuity - * * 2 / ] 2bi
24     ]
25     [
26         1 bias -
27         [ 1 continuity - * * 2 / ]
28         [ 1 continuity + * * 2 / ] 2bi
29     ] bi ;
30
31 :: kochanek-bartels-tangents ( points m0 mn c1 c2 -- tangents )
32     points 3 clump [
33         first3 :> ( pi-1 pi pi+1 )
34         pi pi-1 v- c1 v*n
35         pi+1 pi v- c2 v*n v+
36     ] map
37     m0 prefix
38     mn suffix ;
39 PRIVATE>
40
41 :: <bezier-curve> ( control-points -- polynomials )
42     control-points
43     [ length 1 - ]
44     [ first length [ { 0 } ] replicate ]
45     bi :> ( n acc )
46
47     control-points [| pt i |
48         n i bernstein-polynomial-ith :> poly
49         pt [| v j |
50             j acc [ v poly n*p p+ ] change-nth
51         ] each-index
52     ] each-index
53     acc ;
54
55 :: <cubic-hermite-curve> ( p0 m0 p1 m1 -- polynomials )
56     p0 length <iota> [
57         {
58             [ p0 nth ] [ m0 nth ]
59             [ p1 nth ] [ m1 nth ]
60         } cleave
61         hermite-polynomial
62     ] map ;
63
64 <PRIVATE
65 : (cubic-hermite-spline) ( point-in-out-triplets -- polynomials-sequence )
66     2 clump [
67         first2 [ first2 ] [ [ first ] [ third ] bi ] bi* <cubic-hermite-curve>
68     ] map ;
69 PRIVATE>
70
71 : <cubic-hermite-spline> ( point-tangent-pairs -- polynomials-sequence )
72     2 clump [ first2 [ first2 ] bi@ <cubic-hermite-curve> ] map ;
73
74 :: <kochanek-bartels-curve> ( points m0 mn tension bias continuity -- polynomials-sequence )
75     tension bias continuity kochanek-bartels-coefficients :> ( s1 d1 s2 d2 )
76     points m0 mn
77     [ s1 s2 kochanek-bartels-tangents ]
78     [ d1 d2 kochanek-bartels-tangents ] 3bi :> ( in out )
79     points in out [ 3array ] 3map (cubic-hermite-spline) ;
80
81 : <catmull-rom-spline> ( points m0 mn -- polynomials-sequence )
82     0 0 0 <kochanek-bartels-curve> ;