6template<
typename Po
intT,
typename ParamT =
float>
7static PointT interpolate_linear(
const PointT& p0,
const PointT& p1, ParamT t) {
8 PointT v0 = (ParamT(1) - t) * p0;
13template<
typename Po
intT,
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;
22template<
typename Po
intT,
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;
32template<
typename Po
intT,
typename ParamT =
float>
33static PointT interpolate_cubic_hermite(
const PointT& p0,
const PointT& m0,
const PointT& p1,
const PointT& m1, ParamT 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;
40 return w0 * p0 + w1 * m0 + w2 * p1 + w3 * m1;
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);