@@ -112,30 +112,28 @@ fn compute_velocity_importance(velocity: Real, acceleration: Real) -> Real {
112
112
}
113
113
114
114
/// Detect keypoints specific to animation curves
115
- fn detect_level_keypoints (
116
- level : & PyramidLevel ,
117
- existing_keypoints : & [ RankedKeypoint ] ,
115
+ pub fn detect_level_keypoints (
116
+ times : & [ Real ] ,
117
+ values : & [ Real ] ,
118
+ velocity : & [ Real ] ,
119
+ acceleration : & [ Real ] ,
120
+ curvature : & [ Real ] ,
118
121
current_level : usize ,
119
122
) -> Vec < RankedKeypoint > {
120
- debug ! ( "detect_level_keypoints: level.level={:?}" , level. level) ;
121
- debug ! ( "detect_level_keypoints: level.scale={:?}" , level. scale( ) ) ;
123
+ debug ! ( "detect_level_keypoints: times.len()={}" , times. len( ) ) ;
124
+ debug ! ( "detect_level_keypoints: values.len()={}" , values. len( ) ) ;
125
+ debug ! ( "detect_level_keypoints: velocity.len()={}" , velocity. len( ) ) ;
122
126
debug ! (
123
- "detect_level_keypoints: existing_keypoints .len()={:? }" ,
124
- existing_keypoints . len( )
127
+ "detect_level_keypoints: acceleration .len()={}" ,
128
+ acceleration . len( )
125
129
) ;
126
130
debug ! (
127
- "detect_level_keypoints: existing_keypoints={:? }" ,
128
- existing_keypoints
131
+ "detect_level_keypoints: curvature.len()={ }" ,
132
+ curvature . len ( )
129
133
) ;
130
- debug ! ( "detect_level_keypoints: current_level={:?}" , current_level) ;
131
-
132
- let mut keypoints = Vec :: new ( ) ;
133
- let times = & level. times ;
134
- let values = & level. values ;
135
- let velocity = & level. velocity ;
136
- let acceleration = & level. acceleration ;
137
- let curvature = & level. curvature ;
134
+ debug ! ( "detect_level_keypoints: current_level={}" , current_level) ;
138
135
136
+ let mut keypoints = Vec :: with_capacity ( times. len ( ) / 2 ) ;
139
137
for i in 1 ..times. len ( ) - 1 {
140
138
let curr_time = times[ i] ;
141
139
let _prev_time = times[ i - 1 ] ;
@@ -190,24 +188,14 @@ fn detect_level_keypoints(
190
188
keypoint_type = Some ( KeypointType :: VelocityPeak ) ;
191
189
}
192
190
193
- // If point is important and not near existing keypoints
194
191
if let Some ( kp_type) = keypoint_type {
195
- let level_scale = level. scale ( ) ;
196
- // let level_scale = level.inverse_scale();
197
-
198
- if !is_near_existing_keypoint (
199
- curr_time,
200
- level_scale,
201
- existing_keypoints,
202
- ) {
203
- keypoints. push ( RankedKeypoint {
204
- time : curr_time,
205
- value : curr_value,
206
- importance,
207
- level_detected : current_level,
208
- keypoint_type : kp_type,
209
- } ) ;
210
- }
192
+ keypoints. push ( RankedKeypoint {
193
+ time : curr_time,
194
+ value : curr_value,
195
+ importance,
196
+ level_detected : current_level,
197
+ keypoint_type : kp_type,
198
+ } ) ;
211
199
}
212
200
}
213
201
@@ -222,6 +210,67 @@ fn detect_level_keypoints(
222
210
keypoints
223
211
}
224
212
213
+ /// Detect keypoints specific to animation curves
214
+ fn detect_level_and_combine_keypoints (
215
+ level : & PyramidLevel ,
216
+ existing_keypoints : & [ RankedKeypoint ] ,
217
+ current_level : usize ,
218
+ ) -> Vec < RankedKeypoint > {
219
+ debug ! (
220
+ "detect_level_and_combine_keypoints: level.level={:?}" ,
221
+ level. level
222
+ ) ;
223
+ debug ! (
224
+ "detect_level_and_combine_keypoints: level.scale={:?}" ,
225
+ level. scale( )
226
+ ) ;
227
+ debug ! (
228
+ "detect_level_and_combine_keypoints: existing_keypoints.len()={:?}" ,
229
+ existing_keypoints. len( )
230
+ ) ;
231
+ debug ! (
232
+ "detect_level_and_combine_keypoints: existing_keypoints={:?}" ,
233
+ existing_keypoints
234
+ ) ;
235
+ debug ! (
236
+ "detect_level_and_combine_keypoints: current_level={:?}" ,
237
+ current_level
238
+ ) ;
239
+
240
+ let level_keypoints = detect_level_keypoints (
241
+ & level. times ,
242
+ & level. values ,
243
+ & level. velocity ,
244
+ & level. acceleration ,
245
+ & level. curvature ,
246
+ current_level,
247
+ ) ;
248
+
249
+ let mut keypoints = Vec :: new ( ) ;
250
+ for keypoint in level_keypoints {
251
+ if !is_near_existing_keypoint (
252
+ keypoint. time ,
253
+ level. scale ( ) ,
254
+ existing_keypoints,
255
+ ) {
256
+ keypoints. push ( keypoint) ;
257
+ }
258
+ }
259
+
260
+ debug ! (
261
+ "detect_level_and_combine_keypoints: keypoints.len()={:?}" ,
262
+ keypoints. len( )
263
+ ) ;
264
+ for keypoint in & keypoints {
265
+ debug ! (
266
+ "detect_level_and_combine_keypoints: keypoint={:?}" ,
267
+ keypoint
268
+ ) ;
269
+ }
270
+
271
+ keypoints
272
+ }
273
+
225
274
/// Check if point is near any existing keypoint.
226
275
fn is_near_existing_keypoint (
227
276
time : Real ,
@@ -308,8 +357,11 @@ fn process_pyramid_levels(
308
357
// Process levels from coarse to fine.
309
358
let mut max_level = 0 ;
310
359
for pyramid in pyramids. iter ( ) . rev ( ) {
311
- let pyramid_keypoints =
312
- detect_level_keypoints ( pyramid, & all_keypoints, pyramid. level ) ;
360
+ let pyramid_keypoints = detect_level_and_combine_keypoints (
361
+ pyramid,
362
+ & all_keypoints,
363
+ pyramid. level ,
364
+ ) ;
313
365
314
366
for keypoint in pyramid_keypoints {
315
367
all_keypoints. push ( keypoint) ;
@@ -328,7 +380,7 @@ fn process_pyramid_levels(
328
380
Ok ( selected)
329
381
}
330
382
331
- fn filter_keypoints_by_type_and_level (
383
+ pub fn filter_keypoints_by_type_and_level (
332
384
only_keypoint_type : KeypointType ,
333
385
only_level_detected : usize ,
334
386
min_spacing : Real ,
0 commit comments