ギンの備忘録

デジタルアートやプログラミングやテクノロジー関連のこと。

角繋ぎ文様を描く【p5.jsで和柄】

角繋ぎ文様をp5.jsを使って描きます。

角繋ぎ文様

角繋ぎ文様は組紐にルーツを持つ文様です。 正方形を交互に連続してつなげた文様です。

作例

f:id:gin_graphic:20210509133919p:plain:w300

f:id:gin_graphic:20210509133912p:plain:w300

ソースコード

const w=720;
const N=12;
const d=w/N;
const setcol=[]
setcol[0]=["#333533", "#f2c6de"];
setcol[1]=["#9ef01a", "#001845"];

function setup() {
   createCanvas(w, w);
   imageMode(CENTER);

   col = random(setcol);
   pat = pattern(d);
   noLoop();
}

function draw() {
   background(col[0]);
   for(let i=0;i<N+1;i++){
      const y = d*(i+0.5);
      const dr = (i%2==1) ? PI/2 : 0 ;
      for(let j=0;j<N+1;j++){
         const x = d*(j+0.5);
         const dy = (j%2==1) ? -d : 0 ;
         push();
         translate(x, y+dy);
         rotate(dr);
         image(pat, 0, 0, d, d);
         pop();
      }
   }
}

function pattern(size){
   gp = createGraphics(size, size);
   gp.fill(col[1]);
   gp.strokeWeight(0);

   const r1 = size/5;
   const r2 = size*2/5;
   const r3 = size*3/5;
   const r4 = size*4/5;
   gp.rect(r1, 0, r1, r4);
   gp.rect(0, r1, r4, r1);
   gp.rect(r3, r1, r1, r4);
   gp.rect(r1, r3, r4, r1);

   const l = d/32
   const l0 = r1 - l/2;
   const l1 = r2 + l/2;
   const l2 = r3 - l/2;
   const l3 = r4 + l/2;
   gp.strokeWeight(l);
   gp.stroke(col[0]);
   gp.line(r1, l0, r2, l0);
   gp.line(r1, l1, r2, l1);
   gp.line(r3, l2, r4, l2);
   gp.line(r3, l3, r4, l3);

   return gp;
}

元になるパターンを生成して、それを並べています。 並べる際は回転させたりすることで、角繋ぎを表現しています。