Curvas cúbicas de Bézier

facebook-svg gplus-svg twitter-svg

Para dibujar una curva de Bézier en el <canvas> utilizamos, además de otros métodos() y propiedades ya conocidas, un método especifico: bezierCurveTo()

  JavaScript Descripción Defecto
lineWidth context.lineWidth = numero; Determina (sets) o devuelve (returns) la grosor de la línea. 1
strokeStyle context.strokeStyle = color | gradient | patrón; Determina (sets) o devuelve (returns) el color, gradiente o patrón de la línea. negro
fillStyle context.fillStyle = color | gradient | patrón; Determina o devuelve el color, gradiente o patrón del relleno. negro
beginPath() context.beginPath(); Empezamos a dibujar  
bezierCurveTo() context.bezierCurveTo(cx1,cy1,cx2,cy2,x,y); Define una curva de Bézier.
cx1,cy1,cx2,cy2= coordenadas puntos de anclaje P1 y P2 (control points)
x,y = coordenadas punto final P3 (el punto de partida siendo determinado previamente).
 
fill() context.fill(); Rellena una forma geométrica. black
stroke() context.stroke(); Dibuja una línea ya definida.  

Vea la chuleta con las propiedades y metodos() de canvas.

Arcos y círculos en el canvas de HTML5

Repaso de Geometría

Cuatro puntos del plano: P0, P1, P2 y P3 definen una curva cúbica de Bézier. La curva empieza en el punto P0, se dirige hacia P1 y llega a P3 viniendo de la dirección del punto P2. Usualmente, no pasará ni por P1 ni por P2. Estos puntos sólo están ahí para proporcionar información direccional.

See the Pen 53f7f0ff953dbb5799be66c887102663 by Gabi (@enxaneta) on CodePen.

Lea más sobre las curvas de Bézier en Wikipedia

Veamos un ejemplo. A continuación dibujamos una curva de Bézier en el <canvas>. Utilizamos ctx.moveTo(x0,y0) para mover el "lapiz" en el punto P0. Para esbozar la curva utilizamos ctx.bezierCurveTo(x1,y1,x2,y2,x3,y3), donde x1, y1 son las coordenadas del punto P1, etc...
Para dar estilo a la curva utilizamos como siempre las propiedades lineWidth y strokeStyle. Al final dibujamos la curva con stroke().

ctx.beginPath();
ctx.moveTo(x0,y0);
ctx.bezierCurveTo(x1,y1,x2,y2,x3,y3);
ctx.stroke()

Visite cubic-bezier.com (Made by Lea Verou with care). Verá un maravilloso ejemplo de curvas de Bézier, realizado con <canvas>.

Su navegador no soporta canvas :( 

	var canvas = document.getElementById("lienzo");
		if (canvas && canvas.getContext) {
		var ctx = canvas.getContext("2d");
			if (ctx) {
					var x0 = 20; var y0 = 160;
					var x1 = 50; var y1 = 50;
					var x2 = 230; var y2 = 0;
					var x3 = 220; var y3 = 180;
																
					ctx.lineWidth = 5;
					ctx.strokeStyle = "#00f";
					ctx.beginPath();
					ctx.moveTo(x0,y0);
					ctx.bezierCurveTo(x1,y1,x2,y2,x3,y3);
					ctx.stroke();
				}
		}
Su navegador no soporta canvas :(

Calcular las coordenadas de un punto en la curva

Para calcular las coordenadas de un punto en la curva de Bézier utilizamos una fórmula encontrada en Wikipedia

var x = (1 - t) * (1 - t) *(1 - t) * x0 
  + 3 * (1 - t) * (1 - t) * t * x1
  + 3 * (1 - t) * t * t * x2 
            + t  * t * t * x3; 
var y = (1 - t) * (1 - t) *(1 - t) * y0 
  + 3 * (1 - t) * (1 - t) * t * y1
  + 3 * (1 - t) * t * t * y2 
           + t  * t * t * y3;

El paámetro t ( var t ) es muy importante. Puede tomar valores entre 0 y 1 y representa la posición del punto en la curva.
Si t == 0, el punto se encuentra al inicio de la curva, coincidiendo con x0, y0.
Si t == .5 el punto cuyas coordenadas queremos calcular se encuentra justo en el medio de la curva.
Si t == 1 el punto se encuentra al final de la curva, coincidiendo con x3, y3.

Su navegador no soporta canvas :( 

	var canvas1 = document.getElementById("lienzo1");
		if (canvas1 && canvas1.getContext) {
		var ctx1 = canvas1.getContext("2d");
			if (ctx1) {
					var x0 = 20; var y0 = 160;
					var x1 = 50; var y1 = 50;
					var x2 = 230; var y2 = 0;
					var x3 = 220; var y3 = 180;
																																																					
					ctx1.lineWidth = 5;
					ctx1.strokeStyle = "#00f";
					ctx1.beginPath();
					ctx1.moveTo(x0,y0);
					ctx1.bezierCurveTo(x1,y1,x2,y2,x3,y3);
					ctx1.stroke();
					
					//calculamos las coordenadas del punto									
					var t = .7; // toma valores entre 0 - 1 
					var x = (1 - t) * (1 - t) *(1 - t) * x0 
					  + 3 * (1 - t) * (1 - t) * t * x1
					  + 3 * (1 - t) * t * t * x2 
								+ t * t * t * x3; 
					var y = (1 - t) * (1 - t) *(1 - t) * y0 
					  + 3 * (1 - t) * (1 - t) * t * y1
					  + 3 * (1 - t) * t * t * y2 
							   + t * t * t * y3;
																							
					// dibujamos un punto rojo																		
					ctx1.beginPath();
					ctx1.fillStyle = "red";
					ctx1.arc(x,y,10,0,2*Math.PI);
					ctx1.fill();
				}
		}
Su navegador no soporta canvas :(