p5jsトップに戻る    印刷する

まずは図形を描く

基本図形のひとつである円を描くプログラムから始めます。どこに描くか、いくつ描くかをプログラムを使って指示します。基本図形を描くには、p5.jsの関数を使います。描画関数のインタフェイス(関数名や引数)は(ほぼ) Processingと同じです。

描画域の大きさ指定

まず、setup()関数内で、Webページ上に描画する領域の幅と高さを指定する必要があります。それにはcreateCanvas(width, height)関数を使います。
つまり、Processingではsize(width, height)と書いていたところがcreateCanvas関数に変わります。

【例】createCanvas(500, 125); // 幅500ピクセル、高さ125ピクセルの大きさ

円の描画と変数の活用

直径が10ピクセルの円を、(10, 60)の位置に描いてみましょう。
【リスト1-1】
function setup() {
   createCanvas(500, 125);   //500×125ピクセルの描画域
   background(200);          //背景をグレーにする
   ellipse(10, 60, 10, 10);  //円の中心の座標が(10, 60)
}
加えて、同じ大きさの円を(30, 60)と(50, 60)の位置に描いてください。
円が3
【リスト1-2】
function setup() {
   createCanvas(500, 125);   //500×125ピクセルの描画域
   background(200);          //背景をグレーにする
   ellipse(10, 60, 10, 10);  //一番左の円
   ellipse(30, 60, 10, 10);  //20ピクセル右に、2つ目の円
   ellipse(50, 60, 10, 10);  //さらに20ピクセル右に、3つ目の円
}

この例では、直接座標の数値を指定して図形を描いています。これが基本ですが、柔軟性がありません。3つ並んだ円の位置を、例えば右に15ピクセル動かしたいとすると、3つの円のx座標の値10, 30, 50をそれぞれ25,45,65に変えなくてはならず、間違いが起こりやすいです。3つの円は、規則的に並んでいるので(間隔が20ピクセル)、次のように書くことができます。
【リスト1-3】
function setup() {
   createCanvas(500, 125);   //500×125ピクセルのの描画域
   background(200);          //背景をグレーにする
   var x = 10;   //変数xは、左端の円のx座標の値
   ellipse(x, 60, 10, 10);  //一番左の円
   ellipse(x+20, 60, 10, 10);  //20ピクセル右に、2つ目の円
   ellipse(x+40, 60, 10, 10);  //さらに20ピクセル右に、3つ目の円
}
xは 変数で、左の円のx座標を保持しておくためのデータ領域です。varは変数を定義するためのJavaScriptのキーワードです。こうしておけば、x = 25;とするだけで、3つの円全体を15ピクセル右に描くことができます。このように変数を活用するとわかりやすく、間違えにくい書き方ができます。
リスト1-3では、xの値は一度値が決まった後は変更されません。つまり、xは定数です。定数を宣言する場合、let x = 10;のように、キーワードletを使います。このスケッチではどちらでも構いませんが、letで宣言しておくと誤って値を変更するというミスを防げます。

たくさんの円を描く

次に円を10個描くことを考えます。リスト1-2の3つの円に続けて、ellipse()を全部で10回実行すると、円が10個描けます。
円が10
【リスト1-4】
function setup() {
   createCanvas(500, 125);   //500×125ピクセルの描画域
   background(200);          //背景をグレーにする
   var x = 10;   //変数xは、左端の円のx座標の値
   ellipse(x, 60, 10, 10);  //一番左の円
   ellipse(x+20, 60, 10, 10);  //20ピクセル右に、2つ目の円
   ellipse(x+40, 60, 10, 10);  //さらに20ピクセル右に、3つ目の円
   ellipse(x+60, 60, 10, 10);
   ellipse(x+80, 60, 10, 10);
   ellipse(x+100, 60, 10, 10);
   ellipse(x+120, 60, 10, 10);
   ellipse(x+140, 60, 10, 10);
   ellipse(x+160, 60, 10, 10);
   ellipse(x+180, 60, 10, 10);
}

しかし、これはやっかいです。10個程度ならなんとかコピーと修正でできなくはありませんが、100個となると別の方法が必要になります。上の例をよく見ると、関数ellipse()が10回実行され、その時の引数が規則的に変わっています(第一引数だけが20ずつ増加)。このように規則的に変化する処理を繰返す時に、役立つのが繰返しを行うfor文です。次のコードは、上のサンプルと同じ処理を行います。
【リスト1-5】
function setup() {
  createCanvas(500, 125);   //500×125ピクセルの描画域
  background(200);          //背景をグレーにする
  var x = 10;               //変数xは、左端の円のx座標の値
  for (var i=0; i<10; i=i+1) {    //iが10未満の間、iに1足しながら繰り返す
    ellipse(x+i*20, 60, 10, 10);  //x座標はiの値に従って増える
  }
  ellipse(x+180, 60, 10, 10);
}
変数iは繰返した回数を覚えておく場所で、その値が10になった時、繰返しを終了します。

演習問題


同心円
【問題1-1】描画領域(250 X 250)の中央を中心として、10個の同心円を描きましょう。
円の中央の座標は(125, 125)で、直径を20ずつ増やします。


円を100個
【問題1-2】10個の円の行を、縦に(y軸方向に)10列(等間隔に10行10列に並ぶ100個の円を)描きましょう。
10個の円を横に並べるfor文を、10回繰返します。


放射線
【問題1-3】画面(250 X 250)の中央を中心として、20度間隔の18本の放射線を描きましょう。
放射線の一方の点は、どれも同じで画面の中心(125, 125)。もう一方の点は円周上の点です。円の半径をlen、x軸正の方向から見たその点の角度をa度とすると、点の座標x、yは次の式で計算できます。

    x = 125 + len*cos(radians(a));
    y = 125 - len*sin(radians(a));

円周上の座標計算



三角関数 sin() cos()を使うと、角度から三角形の辺の長さを計算できます。

arigat アットマーク acm.org / copyright © info