diff options
Diffstat (limited to 'ink_stroke_modeler/internal/wobble_smoother.h')
-rw-r--r-- | ink_stroke_modeler/internal/wobble_smoother.h | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/ink_stroke_modeler/internal/wobble_smoother.h b/ink_stroke_modeler/internal/wobble_smoother.h new file mode 100644 index 0000000..7eb85b8 --- /dev/null +++ b/ink_stroke_modeler/internal/wobble_smoother.h @@ -0,0 +1,57 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef INK_STROKE_MODELER_INTERNAL_WOBBLE_SMOOTHER_H_ +#define INK_STROKE_MODELER_INTERNAL_WOBBLE_SMOOTHER_H_ + +#include <deque> + +#include "ink_stroke_modeler/params.h" +#include "ink_stroke_modeler/types.h" + +namespace ink { +namespace stroke_model { + +// This class smooths "wobble" in input positions from high-frequency noise. It +// does so by maintaining a moving average of the positions, and interpolating +// between the given input and the moving average based on how quickly it's +// moving. When moving at a speed above the ceiling in the WobbleSmootherParams, +// the result will be the unmodified input; when moving at a speed below the +// floor, the result will be the moving average. +class WobbleSmoother { + public: + void Reset(const WobbleSmootherParams ¶ms, Vec2 position, Time time); + + // Updates the average position and speed, and returns the smoothed position. + Vec2 Update(Vec2 position, Time time); + + private: + struct Sample { + Vec2 position{0}; + float speed{0}; + Time time{0}; + }; + std::deque<Sample> samples_; + Vec2 position_sum_{0}; + float speed_sum_{0}; + + WobbleSmootherParams params_; +}; + +} // namespace stroke_model +} // namespace ink + +#endif // INK_STROKE_MODELER_INTERNAL_WOBBLE_SMOOTHER_H_ |