Curvas cuadráticas de Bézier

facebook-svg gplus-svg twitter-svg

Para dibujar una curva cuadrática 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  
quadraticCurveTo() context.quadraticCurveTo(cx,cy,x,y); Define una curva cuadrática de Bézier.
cx,cy = coordenadas punto de anclaje (control point)
x,y = coordenadas punto final (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

Tres puntos del plano: a, pc y z definen una curva cuadrática de Bézier. La curva empieza en el punto a, se dirige hacia pc ( punto de control ) y llega a z viniendo de la dirección del punto de control. Usualmente, no pasará por pc. Este punto sólo proporciona información direccional.

See the Pen curva cuadrática de Bézier 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 cuadrática de Bézier en el <canvas>. Utilizamos ctx.moveTo(ax,ay) para mover el "lapiz" en el punto a. Para esbozar la curva utilizamos ctx.quadraticCurveTo( pcx,pcy,zx,zy ), donde pcx,pcy son las coordenadas del punto de control pc, y zx, zy son las coordenadas del punto final z.
Para dar estilo a la curva utilizamos como siempre las propiedades lineWidth y strokeStyle. Al final dibujamos la curva ya definida, con stroke().

ctx.beginPath();
ctx.moveTo(ax,ay);// aquí empieza la curva
ctx.quadraticCurveTo(pcx,pcy,zx,zy);
ctx.stroke();
Su navegador no soporta canvas :( 

	var canvas = document.getElementById("lienzo");
		if (canvas && canvas.getContext) {
		var ctx = canvas.getContext("2d");
			if (ctx) {
						var ax = 20, ay = 130;
						var pcx = 40, pcy = 15;
						var zx = 180, zy = 170;
																
						ctx.strokeStyle = "blue";
						ctx.lineWidth = 5;
						ctx.beginPath();
						ctx.moveTo(ax,ay);// aquí empieza la curva
						ctx.quadraticCurveTo(pcx,pcy,zx,zy);
						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 Vikipedia

x = (1 - t) * (1 - t) * ax + 2 * (1 - t) * t * pcx + t * t * zx;
y = (1 - t) * (1 - t) * ay + 2 * (1 - t) * t * pcy + t * t * zy;

El parámetro t ( var t ) es muy importante. Puede tomar valores entre 0 y 1 y representa la posición del punto es la curva.
Si t == 0, el punto se encuentra justo al inicio de la curva, coincidiendo con ax, ay.
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 x2, y2.

Su navegador no soporta canvas :( 

	var canvas1 = document.getElementById("lienzo1");
		if (canvas1 && canvas1.getContext) {
		var ctx1 = canvas1.getContext("2d");
			if (ctx1) {
					var ax = 20,  ay = 130;
					var pcx = 40, pcy = 15;
					var zx = 180, zy = 170;
																																																					
					ctx1.strokeStyle = "blue";
					ctx1.lineWidth = 5;
					ctx1.beginPath();
					ctx1.moveTo(ax,ay);
					ctx1.quadraticCurveTo(pcx,pcy,zx,zy);
					ctx1.stroke();
					
					// calculamos las coordenadas del punto		
					// con una fórmula encontrada en wikipedia																											
					var t = .7; // valor entre 0 - 1 
					x = (1 - t) * (1 - t) * ax + 2 * (1 - t) * t * pcx + t * t * zx;
					y = (1 - t) * (1 - t) * ay + 2 * (1 - t) * t * pcy + t * t * zy;
																							
					ctx1.beginPath();
					ctx1.fillStyle = "red";
					ctx1.arc(x,y,10,0,2*Math.PI);
					ctx1.fill();
				}
		}
Su navegador no soporta canvas :(