Semilla de la vida con "xor"

facebook-svg gplus-svg twitter-svg

La Semilla de la Vida es el nombre que se da a una figura geométrica compuesta de 6 círculos completes, todos del mismo diámetro, que para algunos tiene un significado místico y esotérico. Aquí nos interesa solo como dibujarla, ya que nos permite practicar con la propiedad globalCompositeOperation de <canvas>.

Empezamos esbozando un circulo imaginario con el centro en la esquina superior izquierda del <canvas>  (var cX = 0, cY = 0) con un radio de 60px ( var r  = 60;). No hay que trazarlo. Solo servirá de guía.

Trasladamos el contexto en el centro del canvas: ctx.translate(ctx.canvas.width/2,ctx.canvas.height/2);

Para dibujar la "semilla de la vida" necesitamos 6 círculos cuyos centros están dispuestos equidistantemente en la circunferencia del circulo guía, o sea formando un ángulo "a" de 60° entre ellos. Recordemos que en radianes 60° = Math.PI/3.

Observamos que podemos escribir un bucle for para construir los 6 circulos.

Para el centro del primer circulo el ángulo a = (Math.PI/3)*0 radianes.
Para el centro del segundo circulo el ángulo a = (Math.PI/3)*1 radianes.
Para el centro del tercer circulo el ángulo a = (Math.PI/3)*2 radianes.
etc...

Falta encontrar las coordenadas de los centros, y la fórmula ya la conocemos:
X = cX+r*cos(a);
Y = cY+r*sin(a);
donde:
- "a" es el ángulo calculado anteriormente,
- "r" es el radio y
- "cX" e "cY" son las coordenadas del centro del circulo guía.

Al final dibujamos los círculos utilizando el método arc(), y combinamos cada circulo con el circulo anterior utilizando ctx.globalCompositeOperation = "xor";

for( var i=0; i < 6; i++ ){
	var a	= ( Math.PI/3 )*i
	var X = cX+r * Math.cos(a);
	var Y = cY+r * Math.sin(a);
	// dibujamos los circulos
	ctx.beginPath();
	ctx.arc(X, Y, r, 0, 2 * Math.PI);
	ctx.fill();
	//combinamos trazados con xor
	ctx.globalCompositeOperation = "xor";
}
Su navegador no soporta canvas :( 

var canvas = document.getElementById("lienzo");
if (canvas && canvas.getContext) {
  var ctx = canvas.getContext("2d");
  if (ctx) {
    var cX = 0;
    var cY = 0;
    var r = 60;
    // definimos el estilo de relleno
    ctx.fillStyle = "blue";
    // trasladamos el contexto en el centro del canvas
    ctx.translate(ctx.canvas.width / 2, ctx.canvas.height / 2);
    // girar 90°
    ctx.rotate(Math.PI / 2);

    // utilizamos un bucle for para construir los 6 circulos
    for (var i = 0; i < 6; i++) {

      var a = (Math.PI / 3) * i
      var X = cX + r * Math.cos(a);
      var Y = cY + r * Math.sin(a);
      // dibujamos los circulos
      ctx.beginPath();
      ctx.arc(X, Y, r, 0, 2 * Math.PI);
      ctx.fill();
      //combinamos trazados con xor
      ctx.globalCompositeOperation = "xor";
    }
  }
}
Su navegador no soporta canvas :(