cgv
Loading...
Searching...
No Matches
interpolate.h
1#pragma once
2
3namespace cgv {
4namespace math {
5
6template<typename PointT, typename ParamT = float>
7static PointT interpolate_linear(const PointT& p0, const PointT& p1, ParamT t) {
8 PointT v0 = (ParamT(1) - t) * p0;
9 PointT v1 = t * p1;
10 return v0 + v1;
11}
12
13template<typename PointT, typename ParamT = float>
14static PointT interpolate_quadratic_bezier(const PointT& p0, const PointT& p1, const PointT& p2, ParamT t) {
15 ParamT mt = ParamT(1) - t;
16 PointT v0 = mt * mt * p0;
17 PointT v1 = ParamT(2) * mt * t * p1;
18 PointT v2 = t * t * p2;
19 return v0 + v1 + v2;
20}
21
22template<typename PointT, typename ParamT = float>
23static PointT interpolate_cubic_bezier(const PointT& p0, const PointT& p1, const PointT& p2, const PointT& p3, ParamT t) {
24 ParamT mt = ParamT(1) - t;
25 PointT v0 = mt * mt * mt * p0;
26 PointT v1 = ParamT(3) * mt * mt * t * p1;
27 PointT v2 = ParamT(3) * mt * t * t * p2;
28 PointT v3 = t * t * t * p3;
29 return v0 + v1 + v2 + v3;
30}
31
32template<typename PointT, typename ParamT = float>
33static PointT interpolate_cubic_hermite(const PointT& p0, const PointT& m0, const PointT& p1, const PointT& m1, ParamT t) {
34 ParamT t2 = t * t;
35 ParamT t3 = t * t * t;
36 PointT w0 = ParamT(2) * t3 - ParamT(3) * t2 + ParamT(1);
37 PointT w1 = t3 - ParamT(2) * t2 + t;
38 PointT w2 = ParamT(-2) * t3 + ParamT(3) * t2;
39 PointT w3 = t3 - t2;
40 return w0 * p0 + w1 * m0 + w2 * p1 + w3 * m1;
41}
42
43template<typename ParamT = float, typename OutputIt, typename UnaryOp>
44static void sample_steps_transform(OutputIt output_first, UnaryOp operation, size_t num_segments) {
45 num_segments = std::max(num_segments, size_t(1));
46 ParamT step = ParamT(1) / static_cast<ParamT>(num_segments);
47 for(size_t i = 0; i <= num_segments; ++i) {
48 ParamT t = step * static_cast<ParamT>(i);
49 *output_first = operation(t);
50 ++output_first;
51 }
52}
53
54} // namespace math
55} // namespace cgv
the cgv namespace
Definition print.h:11