You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

31 lines
967 B

use <../sum.scad>
function _combi(n, k) =
let(
bi_coef = [
[1], // n = 0: for padding
[1,1], // n = 1: for Linear curves, how about drawing a line directly?
[1,2,1], // n = 2: for Quadratic curves
[1,3,3,1] // n = 3: for Cubic Bézier curves
]
)
n < 4 ? bi_coef[n][k] :
k == 0 ? 1 : (_combi(n, k - 1) * (n - k + 1) / k);
function _component(t, points, n, i) =
let(one_t = 1 - t)
sum([for(j = [0:n]) _combi(n, j) * points[j][i] * one_t ^ (n - j) * t ^ j]);
function _coordinate(range, t, points, n) =
[for(i = range) _component(t, points, n, i)];
function _bezier_curve_impl(t_step, points) =
let(
t_end = ceil(1 / t_step),
n = len(points) - 1,
range = [0:len(points[0]) - 1]
)
[
each [for(t = 0; t < t_end; t = t + 1) _coordinate(range, t * t_step, points, n)],
_coordinate(range, 1, points, n)
];