function mix(a, b, t) {
return a + (b - a) * t;
}
function courbeLineaire(pa, pb, t) {
return mix(pa, pb, t);
}
// Quadratique : carré : ² : degré 2
function courbeBezierQuadratique(pa, pb, pc, t) {
return mix(
mix(pa, pb, t),
mix(pb, pc, t),
t
);
}
// Équivaut à :
function courbeBezierQuadratique(pa, pb, pc, t) {
t1 = 1.0 - t;
return t1**2 * pa + 2.0 * t * t1 * pb + t**2 * pc;
}
// Cubique : cube : ³ : degré 3
function courbeBezierCubique(pa, pb, pc, pd, t) {
return mix(
mix(
mix(pa, pb, t),
mix(pb, pc, t),
t
),
mix(
mix(pb, pc, t),
mix(pc, pd, t),
t
),
t
);
}
// Équivaut à :
function courbeBezierCubique(pa, pb, pc, pd, t) {
t1 = 1.0 - t;
return t1**3 * pa + 3.0 * t1**2 * t * pb + 3.0 * t1 * t**2 * pc + t**3 * pd;
}
Ctrl + clic : ajouter ou supprimer des points
points = [
{ x : 100, y : 200 },
{ x : 250, y : 150 },
{ x : 200, y : 50 },
{ x : 400, y : 160 },
{ x : 600, y : 100 },
{ x : 650, y : 200 }
];
ferme = false;
function courbeLineaire(pa, pb, t) {
return pa + (pb - pa) * t;
}
function parametriqueLineaire(points, ferme, t) {
nb = points.length;
imax = nb - 1;
if (ferme) {
imax = nb;
t = t % 1.0;
if (t < 0) t += 1.0;
}
tf = imax * t;
a = (int)tf;
if (!ferme) {
if (a < 0) a = 0;
else if (a >= imax) a = imax - 1;
}
b = a + 1;
if (ferme && b >= nb) b = 0;
pa = points[a];
pb = points[b];
f = (t - a / imax) * imax;
return courbeLineaire(pa, pb, f);
}
Ctrl + clic : ajouter ou supprimer des points
points = [
{ x : 100, y : 200 },
{ x : 250, y : 150 },
{ x : 200, y : 50 },
{ x : 400, y : 160 },
{ x : 600, y : 100 },
{ x : 650, y : 200 }
];
ferme = false;
function courbeBezierQuadratique(pa, pb, pc, t) {
t1 = 1.0 - t;
return t1 * t1 * pa + 2.0 * t * t1 * pb + t * t * pc;
}
function parametriqueBezierQuadratique(points, ferme, t) {
nb = points.length;
if (nb < 3) {
return parametriqueLineaire(points, ferme, t);
}
imax = nb - 1;
if (!ferme) tf = (t - 1. / (imax * 2)) * imax;
else {
tf = (t % 1.0) * nb;
if (tf < 0) tf += nb;
}
a = (int)tf;
if (!ferme) {
if (a < 0) a = 0;
if (a > imax - 2) a = imax - 2;
}
b = a + 1;
c = b + 1;
if (ferme && c > imax) {
b = b % nb;
c = c % nb;
}
f = tf - a;
pb = points[b];
if (a === 0 && !ferme) {
f = (tf + 0.5) / 1.5;
pa = points[a];
}
else pa = (points[a] + points[b]) * 0.5;
if (c === imax && !ferme) {
f = f / 1.5;
pc = points[c];
}
else pc = (points[b] + points[c]) * 0.5;
return courbeBezierQuadratique(pa, pb, pc, f);
}
function subdivisionBezierQuadratique(points, ferme, subdivisions) {
nb = points.length;
if (nb < 3) {
return subdivisionLineaire(points, ferme, subdivisions);
}
boucles = nb;
imax = nb - 1;
if (ferme) boucles += 2;
for (i = 2 ; i < boucles ; i++) {
a = i - 2;
b = i - 1;
c = i;
if (ferme && c > imax) {
b = b % nb;
c = c % nb;
}
pb = points[b];
if (a === 0 && !ferme) pa = points[a];
else pa = (points[a] + points[b]) * .5;
if (c === imax && !ferme) pc = points[c];
else pc = (points[b] + points[c]) * .5;
for (j = 0 ; j <= subdivisions ; j++) {
p = courbeBezierQuadratique(pa, pb, pc, j / subdivisions);
[...]
}
}
}
keyboard_arrow_down
Quel Cadeau !