はんざき技研

プログラミングや3DCGの記録

円を作る高度なやり方

円を描画するときに基本的なコマンドとしてcircle()がある。
しかしあくまで描画を目的としているコマンドなので応用が利きづらい側面がある。
例えば角の数を定めたカクカクの円を描きたいとか、描画ではなく位置の取得が目的な場合には使えない。
そこで三角関数を使って数式を利用して円を利用できるようにしたい。

f:id:salmander:20220401211114p:plain

function setup() {
  createCanvas(400, 400);
  background(220);
  
  //角の数と直径を決める
  const num = 12;
  const rad = 100;
  
  //キャンバスの中心を移動
  translate(width / 2, height / 2);
  
  //
  beginShape();[f:id:salmander:20220401211114p:plain]
  
  for(let i = 0; i < num; i ++){
    //角度と位置を求める
    let angle = TAU / num * i;
    let x = rad * cos(angle);
    let y = rad * sin(angle);
    
    vertex(x,y);
  }
  endShape(CLOSE);
}

この書き方を覚えておくと次のように円周上に図形を配置することも出来る。
f:id:salmander:20220401211853p:plain

function setup() {
  createCanvas(400, 400);
  background(220);
  
  //角の数と直径、円の大きさを決める
  const num = 8;
  const posRad = 100;
  const circleRad = 50;
  
  //キャンバスの中心を移動
  translate(width / 2, height / 2);
  
  //
  for(let i = 0; i < num; i ++){
    //角度と位置を求める
    let angle = TAU / num * i;
    let x = posRad * cos(angle);
    let y = posRad * sin(angle);
    
    circle(x,y,circleRad);
  }
}

カラーパレットを作る方法

配列を使うことによって事前に用意した色の中から選択することができる。

//配列に色を格納
const colorPallet = ['#38b48b','#9d5b8b','#ffea00'];

function setup(){
  createCanvas(400,400);
  background(240);
  
  //色を取得
  let colorPick = Math.round(random(0,2));
  fill(colorPallet[colorPick]);
  
  //四角を描画
  noStroke();
  rect(100,100,200,200);
}

p5.jsでアニメーションをしたいときにfor文を使わない方法

p5.jsでアニメーションを描画したい場合、for文を使うのは都合が悪いときがある。

for(let i = 0 ; i <= 10 ; i++){
}

draw関数はwhile文と同じなのでwhile文をfor文に変換することを考えて次のように考えればいい。

let i = 0;
function draw(){
  i++;

  if(i >= 10){
    noLoop();
  }
}

二重ループにしたい場合は次のように書くことができる。

for(let i = 0 ; i <= 10 ; i++){
  for(let j = 0 ; j <= 10 ; j++){
  }
}

これを

let i = 0;
let j = 0;
function draw(){
  j++;

  if(i >= 10 && j >= 10){
    noLoop();
  }
  if(j >= 10){
    j = 0;
    i++;
  }
}