15
15
*/
16
16
package curves
17
17
18
+ import kotlin.math.sqrt
19
+
18
20
/* *
19
21
* Provides spline interpolation code.
20
- * Currently not used but it is anticipated that we will be using it in the
22
+ * Currently not used, but it is anticipated that we will be using it in the
21
23
* KeyMotion
22
24
*
23
25
*
@@ -27,134 +29,124 @@ class Spline
27
29
* Spline in N dimensions
28
30
*
29
31
* @param points [mPoints][dimensionality]
30
- */ (points: List <DoubleArray >) {
31
- var mPoints = 0
32
- var mCurve: ArrayList <Array <Cubic ?>> ? = null
33
- var mDimensionality = 0
34
- lateinit var mCurveLength: DoubleArray
35
- var mTotalLength = 0.0
36
- var mCtl: ArrayList <DoubleArray > ? = null
32
+ */ (points: List <FloatArray >) {
33
+ private var mPoints = 0
34
+ private lateinit var mCurve: ArrayList <Array <Cubic >>
35
+ private var mDimensionality = 0
36
+ private lateinit var mCurveLength: FloatArray
37
+ private var mTotalLength = 0.0f
38
+ private lateinit var mCtl: ArrayList <FloatArray >
37
39
38
40
init {
39
41
setup(points)
40
42
}
41
43
42
- // @TODO: add description
43
- fun setup (points : List <DoubleArray >) {
44
+
45
+ private fun setup (points : List <FloatArray >) {
44
46
mDimensionality = points[0 ].size
45
47
mPoints = points.size
46
48
mCtl = ArrayList ()
47
49
mCurve = ArrayList ()
48
50
for (d in 0 until mDimensionality) {
49
- val tmp = DoubleArray (mPoints)
50
- mCtl!! .add(tmp)
51
+ val tmp = FloatArray (mPoints)
52
+ mCtl.add(tmp)
51
53
for (p in 0 until mPoints) {
52
54
tmp[p] = points[p][d]
53
55
}
54
56
}
55
57
for (d in 0 until mDimensionality) {
56
- mCurve!! .add(calcNaturalCubic(mCtl!! [d].size, mCtl!! [d]))
58
+ mCurve.add(calcNaturalCubic(mCtl!! [d].size, mCtl[d]))
57
59
}
58
- mCurveLength = DoubleArray (mPoints - 1 )
59
- mTotalLength = 0.0
60
+ mCurveLength = FloatArray (mPoints - 1 )
61
+ mTotalLength = 0.0f
60
62
val temp = arrayOfNulls<Cubic >(mDimensionality)
61
63
for (p in mCurveLength.indices) {
62
64
for (d in 0 until mDimensionality) {
63
- temp[d] = mCurve!! [d][p]
65
+ temp[d] = mCurve[d][p]
64
66
}
65
67
mCurveLength[p] = approxLength(temp)
66
68
mTotalLength + = mCurveLength[p]
67
69
}
68
70
}
69
71
70
- // @TODO: add description
71
- fun getVelocity (p : Double , v : DoubleArray ) {
72
+ /* *
73
+ * get the velocity
74
+ */
75
+ fun getVelocity (p : Float , v : FloatArray ) {
72
76
var pos = p * mTotalLength
73
77
var k = 0
74
78
while (k < mCurveLength.size - 1 && mCurveLength[k] < pos) {
75
79
pos - = mCurveLength[k]
76
80
k++
77
81
}
78
82
for (i in v.indices) {
79
- v[i] = mCurve!! [i][k]!! .vel(pos / mCurveLength[k])
83
+ v[i] = mCurve[i][k]!! .vel(pos / mCurveLength[k])
80
84
}
81
85
}
82
86
83
- // @TODO: add description
84
- fun getPos (p : Double , x : DoubleArray ) {
85
- var pos = p * mTotalLength
86
- var k = 0
87
- while (k < mCurveLength.size - 1 && mCurveLength[k] < pos) {
88
- pos - = mCurveLength[k]
89
- k++
90
- }
91
- for (i in x.indices) {
92
- x[i] = mCurve!! [i][k]!! .eval(pos / mCurveLength[k])
93
- }
94
- }
95
87
96
88
// @TODO: add description
97
- fun getPos (p : Double , x : FloatArray ) {
89
+ fun getPos (p : Float , x : FloatArray ) {
98
90
var pos = p * mTotalLength
99
91
var k = 0
100
92
while (k < mCurveLength.size - 1 && mCurveLength[k] < pos) {
101
93
pos - = mCurveLength[k]
102
94
k++
103
95
}
104
96
for (i in x.indices) {
105
- x[i] = mCurve!! [i][k]!! .eval(pos / mCurveLength[k]).toFloat( )
97
+ x[i] = mCurve[i][k]!! .eval(pos / mCurveLength[k])
106
98
}
107
99
}
108
100
109
101
// @TODO: add description
110
- fun getPos (p : Double , splineNumber : Int ): Double {
102
+ fun getPos (p : Float , splineNumber : Int ): Float {
111
103
var pos = p * mTotalLength
112
104
var k = 0
113
105
while (k < mCurveLength.size - 1 && mCurveLength[k] < pos) {
114
106
pos - = mCurveLength[k]
115
107
k++
116
108
}
117
- return mCurve!! [splineNumber][k]!! .eval(pos / mCurveLength[k])
109
+ return mCurve[splineNumber][k]!! .eval(pos / mCurveLength[k])
118
110
}
119
111
120
112
// @TODO: add description
121
- fun approxLength (curve : Array <Cubic ?>): Double {
122
- var sum = 0.0
113
+ fun approxLength (curve : Array <Cubic ?>): Float {
114
+ var sum = 0.0f
123
115
val n = curve.size
124
- val old = DoubleArray (n)
125
- var i = 0.0
116
+ val old = FloatArray (n)
117
+ var i = 0.0f
126
118
while (i < 1 ) {
127
- var s = 0.0
119
+ var s = 0.0f
128
120
for (j in 0 until n) {
129
121
var tmp = old[j]
130
122
old[j] = curve[j]!! .eval(i)
131
123
tmp - = old[j]
132
124
s + = tmp * tmp
133
125
}
134
126
if (i > 0 ) {
135
- sum + = Math . sqrt(s)
127
+ sum + = sqrt(s)
136
128
}
137
- i + = .1
129
+ i + = .1f
138
130
}
139
- var s = 0.0
131
+ var s = 0.0f
140
132
for (j in 0 until n) {
141
133
var tmp = old[j]
142
- old[j] = curve[j]!! .eval(1.0 )
134
+ old[j] = curve[j]!! .eval(1.0f )
143
135
tmp - = old[j]
144
136
s + = tmp * tmp
145
137
}
146
- sum + = Math . sqrt(s)
138
+ sum + = sqrt(s)
147
139
return sum
148
140
}
149
141
150
- class Cubic (var mA : Double , var mB : Double , var mC : Double , var mD : Double ) {
142
+ class Cubic (var mA : Float , var mB : Float , var mC : Float , var mD : Float ) {
151
143
// @TODO: add description
152
- fun eval (u : Double ): Double {
144
+ fun eval (u : Float ): Float {
153
145
return ((mD * u + mC) * u + mB) * u + mA
154
146
}
155
147
156
148
// @TODO: add description
157
- fun vel (v : Double ): Double {
149
+ fun vel (v : Float ): Float {
158
150
// (((mD * u) + mC) * u + mB) * u + mA
159
151
// = "mA + u*mB + u*u*mC+u*u*u*mD" a cubic expression
160
152
// diff with respect to u = mB + u*mC/2+ u*u*mD/3
@@ -163,35 +155,32 @@ class Spline
163
155
}
164
156
}
165
157
166
- companion object {
167
- fun calcNaturalCubic (n : Int , x : DoubleArray ): Array <Cubic ?> {
168
- var n = n
169
- val gamma = DoubleArray (n)
170
- val delta = DoubleArray (n)
171
- val d = DoubleArray (n)
172
- n - = 1
173
- gamma[0 ] = (1.0f / 2.0f ).toDouble()
174
- for (i in 1 until n) {
175
- gamma[i] = 1 / (4 - gamma[i - 1 ])
176
- }
177
- gamma[n] = 1 / (2 - gamma[n - 1 ])
178
- delta[0 ] = 3 * (x[1 ] - x[0 ]) * gamma[0 ]
179
- for (i in 1 until n) {
180
- delta[i] = (3 * (x[i + 1 ] - x[i - 1 ]) - delta[i - 1 ]) * gamma[i]
181
- }
182
- delta[n] = (3 * (x[n] - x[n - 1 ]) - delta[n - 1 ]) * gamma[n]
183
- d[n] = delta[n]
184
- for (i in n - 1 downTo 0 ) {
185
- d[i] = delta[i] - gamma[i] * d[i + 1 ]
186
- }
187
- val c = arrayOfNulls<Cubic >(n)
188
- for (i in 0 until n) {
189
- c[i] = Cubic (
190
- x[i].toFloat().toDouble(), d[i], 3 * (x[i + 1 ] - x[i]) - (2
191
- * d[i]) - d[i + 1 ], 2 * (x[i] - x[i + 1 ]) + d[i] + d[i + 1 ]
192
- )
193
- }
194
- return c
158
+
159
+ private fun calcNaturalCubic (cubic : Int , x : FloatArray ): Array <Cubic > {
160
+ var n = cubic
161
+ val gamma = FloatArray (n)
162
+ val delta = FloatArray (n)
163
+ val d = FloatArray (n)
164
+ n - = 1
165
+ gamma[0 ] = (1.0f / 2.0f )
166
+ for (i in 1 until n) {
167
+ gamma[i] = 1 / (4 - gamma[i - 1 ])
168
+ }
169
+ gamma[n] = 1 / (2 - gamma[n - 1 ])
170
+ delta[0 ] = 3 * (x[1 ] - x[0 ]) * gamma[0 ]
171
+ for (i in 1 until n) {
172
+ delta[i] = (3 * (x[i + 1 ] - x[i - 1 ]) - delta[i - 1 ]) * gamma[i]
173
+ }
174
+ delta[n] = (3 * (x[n] - x[n - 1 ]) - delta[n - 1 ]) * gamma[n]
175
+ d[n] = delta[n]
176
+ for (i in n - 1 downTo 0 ) {
177
+ d[i] = delta[i] - gamma[i] * d[i + 1 ]
178
+ }
179
+ return Array (n) {i->
180
+ Cubic (
181
+ x[i], d[i], 3 * (x[i + 1 ] - x[i]) - (2
182
+ * d[i]) - d[i + 1 ], 2 * (x[i] - x[i + 1 ]) + d[i] + d[i + 1 ]
183
+ )
195
184
}
196
185
}
197
- }
186
+ }
0 commit comments