HTML 5 na prática, Canvas – Parte 2

8 de junho de 2010, 21:59 | Postado em html5

Fala galera, tudo certo? Primeiro quero pedir desculpas pela demora na publicação da parte 2 da série falando sobre o elemento canvas, estou com bastante projetos em desenvolvimento, mas aqui estamos. Se você ainda não leu a primeira parte, clique aqui.

Nesse post vou falar sobre os métodos bezierCurveTo, quadraticCurveTo, arc e como aplicar tudo isso no elemento canvas, vamos lá?

arc

Para desenhar arcos e círculos, usamos o método arc. Esse método tem cinco parâmetros: X e Y são as coordenadas central do nosso desenho, radius é a metade do diâmetro da nossa circunferência (nem preciso explicar :) ), startAngle e o endAngle são os parâmetros que define o ponto inicial e final a partir do eixo X e finalmente o parâmetro anticlockwise que recebe um valor booleano, se esse valor for true define o sentido anti-horário para iniciar o nosso desenho, caso contrário, inicia o desenho no sentido horário.

arc(x, y, radius, startAngle, endAngle, anticlockwise)

Observação: Os ângulos no método arc são calculados em radiano, não em graus. Para converter graus em radiano, use:

var radiano = (Math.PI/180)*graus


Vamos aos exemplos de como usar o arc. Nesse primeiro exemplo, colocaremos o endAngle com intervalos de 90 graus e o anticlockwise definido como false, ou seja, está criando o nosso círculo no sentido horário.

window.addEventListener('load', function () {
	var canvas = document.getElementById('tutorial');

	if (canvas.getContext){
		var context = canvas.getContext('2d');

		for(var i=1; i<5; i++){

			var x              = i*50;
			var y              = 50;
			var radius         = 20;
			var startAngle     = 0;
			var endAngle       = (Math.PI*i)/2;
			var anticlockwise  = false;

			context.beginPath();
			context.arc(x, y, radius, startAngle, endAngle, anticlockwise);
			context.stroke();
		}
	} else {
		alert('You need a modern browser : )');
	}

}, false);

Veja esse exemplo funcionando, clique aqui.
Resultado:

Agora vamos definir o anticlockwise como true e gerar nossos círculos no sentido anti-horário.

var anticlockwise  = true;

Veja esse exemplo funcionando, clique aqui.
Resultado:


Formas Orgânicas

Já vimos como criar formas primitivas e agora o que acha de trabalhar um pouco com desenhos orgânicos? Vamos ver um pouco sobre Curva de Bézier, se você ainda não sabe ou nunca ouviu falar, dá uma conferida nesse link: Curva de Bézier.

Resumindo, uma curva Bézier quadrática tem apenas um ponto de controle, enquanto que uma curva de Bézier cúbica usa dois pontos de controle.


quadraticCurveTo

Vamos começar com o método quadraticCurveTo. Esse método possúi quatro parâmetros: cp1x e cp1y são a refência do ponto de controle e os parâmetros x e y são as coordenadas do ponto final.

quadraticCurveTo(cp1x, cp1y, x, y)

Vamos ver como fica uma curva de Bézier quadrática:

window.addEventListener('load', function () {

	var canvas = document.getElementById('tutorial');

	if (canvas.getContext){
		var context = canvas.getContext('2d');

			context.lineWidth =  3; //Define o tamanho da linha do stroke.

			var x     = 240; // Define o eixo X do ponto final
			var y     = 60; // Define o eixo Y do ponto final
			var cp1x  = 30; // Define o eixo X do ponto de controle
			var cp1y  = 20; // Define o eixo Y do ponto de controle

			context.beginPath();
			context.moveTo(30, 90); // Define o ponto inicial do desenho, se você tiver dúvidas de como usar moveTo, veja a parte 1 desse tutorial.
			context.quadraticCurveTo(cp1x, cp1y, x, y);
			context.stroke();

	} else {
		alert('You need a modern browser : )');
	}

}, false);

Veja esse exemplo funcionando, clique aqui.
Resultado:

O ponto vermelho na imagem representa o ponto de controle e os pontos azuis representam o ponto inicial e final do meu desenho.


bezierCurveTo

O método bezierCurveTo não é muito diferente do anterior, possui um ponto de controle a mais, então agora teremos os seguintes parâmetros:

bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)

Onde cp2x e cp2y são a refêrencia do nosso segundo ponto de controle. Vamos ao exemplo:

window.addEventListener('load', function () {

	var canvas = document.getElementById('tutorial');

	if (canvas.getContext){
		var context = canvas.getContext('2d');

			context.lineWidth =  3; //Define o tamanho da linha do stroke.

			var x     = 240; // Define o eixo X do ponto final
			var y     = 60;  // Define o eixo Y do ponto final
			var cp1x  = 60;  // Define o eixo X do PRIMEIRO ponto de controle
			var cp1y  = 10;  // Define o eixo Y do PRIMEIRO ponto de controle
			var cp2x  = 210; // Define o eixo X do SEGUNDO ponto de controle
			var cp2y  = 20;  // Define o eixo Y do SEGUNDO ponto de controle

			context.beginPath();
			context.moveTo(30, 90); // Define o ponto inicial do desenho, se você tiver dúvidas de como usar moveTo, veja a parte 1 desse tutorial.
			context.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);
			context.stroke();

	} else {
		alert('You need a modern browser : )');
	}

}, false);

Veja esse exemplo funcionando, clique aqui.
Resultado:

Os pontos vermelhos na imagem representam os pontos de controle e os pontos azuis representam o ponto inicial e final do meu desenho.


Conclusão

Trabalhar com formas orgânicas não é fácil, pois não temos uma ferramenta para visualizar o que estamos fazendo como o Adobe® Photoshop® ou Adobe® Illustrator®, mas com um pouco de paciência é possível gerar resultados bem legais.

Na parte 3 da série “HTML 5 na prática, Canvas” vou falar sobre imagens, como usar e manipular uma imagem com HTML5.

Até a próxima :D

Comentários

Cristiano Luminati,

8 de junho de 2010, 22:23

Ficou bacana o artigo, eu gostei mesmo.

Tive até uma ideia louca de, quem sabe, desenvolver um aplicativo para facilitar a criação de curvas de bézier, pois como vc disse, é complicado trabalhar com elas sem poder ver o que está sendo feito.

Danilo Miranda,

5 de agosto de 2010, 17:26

Muito bom o post! Já estou ansioso pelo próximo da série!
Grande abraço!

Escreva seu Comentário