金剛界曼荼羅

Processingで金剛界曼荼羅を塗り絵してみた。

20100710035045

float sqrt2 = sqrt(2);

void setup() {
  size(720, 720);
  smooth();

  fill(0,0,120); rect(10,10,230,230);
  fill(0,0,120); rect(245,10,230,230); fill(0,120,0); rect(265,30,190,190);
  fill(0,0,120); rect(480,10,230,230); fill(0,120,0);  rect(500,30,190,190);

  fill(240,240,0); rect(10,245,230,230); fill(0,120,0); rect(30, 265, 190, 190);
  fill(240,240,0); rect(245,245,230,230); fill(0,120,0); rect(265, 265, 190, 190);
  fill(240,240,0); rect(480,245,230,230); fill(0,120,0); rect(500, 265, 190, 190);
  fill(240,240,0); rect(10,480,230,230); fill(0,120,0); rect(30, 500, 190, 190);
  fill(240,240,0); rect(245,480,230,230); fill(0,120,0); rect(265, 500, 190, 190);
  fill(240,240,0); rect(480,480,230,230); fill(0,120,0); rect(500, 500, 190, 190);
  
  world(125, 125, 190);

  fill(20);
  rect(280, 45, 160, 160);
  fill(240,240,200);
  ellipse(360, 125, 160, 160);

  risyu(595, 125, 160);
  
  world(125, 360, 160);
  world(360, 360, 160);
  world(595, 360, 160);

  world(125, 595, 160);
  world(365, 595, 160);
  world(595, 595, 160);
}

void world(float x, float y, float w) {
  fill(0, 0, 40);
  rect(x - w / 2, y - w / 2, w, w);

  fill(0, 100, 40);
  ellipse(x, y, w, w);

  float innerW = w / 3;
  fill(240,240,200);
  ellipse(x, y, innerW, innerW);
  fill(240,240,200);
  ellipse(x, y - innerW, innerW, innerW);
  ellipse(x, y + innerW, innerW, innerW);
  ellipse(x - innerW, y, innerW, innerW);
  ellipse(x + innerW, y, innerW, innerW);
  
  float a = (sqrt2 - 1) / (sqrt2 + 1);
  float w2 = a * w;
  fill(240, 0, 0);
  ellipse(x - (w - w2) /2, y - (w - w2) / 2, w2, w2);
  ellipse(x + (w - w2) /2, y - (w - w2) / 2, w2, w2);
  ellipse(x - (w - w2) /2, y + (w - w2) / 2, w2, w2);
  ellipse(x + (w - w2) /2, y + (w - w2) / 2, w2, w2);
  
  float b = (3 - sqrt2) / 6 / (sqrt2 + 1);
  float w3 = b * w;
  fill(240,240,200);
  ellipse(x - w / 6 - w3 , y - w / 6 - w3 , w3 * 2, w3 * 2);
  ellipse(x + w / 6 + w3 , y - w / 6 - w3 , w3 * 2, w3 * 2);
  ellipse(x - w / 6 - w3 , y + w / 6 + w3 , w3 * 2, w3 * 2);
  ellipse(x + w / 6 + w3 , y + w / 6 + w3 , w3 * 2, w3 * 2);
  
}

void risyu(float x, float y, float w) {
  fill(0, 0, 40);
  rect(x - w / 2, y - w / 2, w, w);

  float innerW = w / 3;

  fill(240,240,200);
  ellipse(x - innerW, y - innerW, innerW, innerW);
  ellipse(x, y - innerW, innerW, innerW);
  ellipse(x + innerW, y - innerW, innerW, innerW);
  ellipse(x - innerW, y, innerW, innerW);
  ellipse(x, y, innerW, innerW);
  ellipse(x + innerW, y, innerW, innerW);
  ellipse(x - innerW, y + innerW, innerW, innerW);
  ellipse(x, y + innerW, innerW, innerW);
  ellipse(x + innerW, y + innerW, innerW, innerW);
}