Contenu mis en avant
Dépliage

Plugin Cinema 4D

Alvéole

Plugin Cinema 4D

Projecteur UV

Plugin Cinema 4D

Courbes de bézier

 

Fonctions sur les courbes de bézier.
Mix
a =
b =
function mix(a, b, t) {
	return a + (b - a) * t;
}
Courbe linéaire
function courbeLineaire(pa, pb, t) {
	return mix(pa, pb, t);
}
Courbe de Bézier quadratique
// 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;
}
Courbe de Bézier cubique
// Cubique : cube : ³ : degré 3
function courbeBezierCubique(pa, pb, pc, 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, t) {
	t1 = 1.0 - t;
	return t1**3 * pa + 3.0 * t1**2 * t * pb + 3.0 * t1 * t**2 * pc + t**3 * pd;
}
Spline linéaire

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);
}
Spline de Bézier quadratique

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);
			[...]
		}
	}
}
person
create
Les plus récents
keyboard_arrow_down
lustutu WOW! c'est super pour vulgariser et démontrer la physique de base, dans le codage. Merci! 10 Décembre 2020 01:37
Vincent (wipix) Quel talent !
Quel Cadeau !
15 Août 2019 15:19
César Vonc Merci :-) 19 Juillet 2019 00:52
Clemz merci beaucoup chef ! :) 11 Juillet 2019 15:49