Code Vonc

Courbes de Bézier

CommentairesComments
Mix

function mix(a, b, t) {
	
	return a + (b - a) * t;
}

a =

b =


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;
}


Courbe de Bézier de degré n




Spline linéaire

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



Spline de Bézier quadratique

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);
			[...]
		}
	}
}

Ctrl + clic : ajouter ou supprimer des points



Spline de Bézier cubique



Ctrl + clic : ajouter ou supprimer des points