p5.jsで図形を描き、色を付ける
p5.jsを使って図形を描いてみよう
この記事では、JavaScriptライブラリp5.jsを使って、画面(HTML Canvas)に図形を描く方法を紹介します。
完成するのは、下の絵です。シンプルな絵ですが、直線(地平線の部分)、四角形、三角形、円と、基本的な図形を含んでいます。
記事の最後では、描いた図形に色を付けるプログラムに仕上げます。
p5.jsとは
p5.js( https://p5js.org/ )は、無料で使える、オープンソースのJavaScriptライブラリです。先にProcessingという、ビジュアルアートを作成するためのプログラム言語・環境があり、それをWebブラウザで実行できるように、JavaScriptライブラリにしたものです。
p5.jsを使うことで、JavaScriptプログラムから簡単に絵や図を描くことができます。画像や動画、音声データを扱うこともできます。
Monaca Educationでは、p5.jsのプロジェクトテンプレートを用意しています。新しくプロジェクトを作成する際に、テンプレートとして「Processing(p5.js)」を選ぶだけで、p5.jsのプログラミングを始められます。
Monaca Educationでp5.jsを使う方法
新規プロジェクト作成でp5.jsを選択して下さい。
p5.jsのEditorページを使う方法
本記事ではMonaca Educationを使いますが、p5.jsの公式サイトにある「Editor」( https://editor.p5js.org/ )を使って、この記事で紹介するp5.jsプログラムを試すこともできます。
p5.js Editorページは、p5.jsの図形描画の関数を簡単に試し、調べることができ、とても便利です。なお、このページは、メニュー表示の言語に日本語も選べます。
p5.jsによる図形描画の考え方
p5.jsを使って図形を描くプログラムの手続きの基本は、次の通りです。
(1)関数setup()の中で、キャンバスを作る
関数setup()は、プログラムが開始した時に最初に実行される関数です。その関数の中に、キャンバスを作る記述をします。
キャンバスは、図形を描く場所で、下の図のような左上を(0,0)とする座標系になっています。
縦・横のサイズを指定して作ることができます。
(2)関数draw()の中に、図形を描くプログラムを描く
関数draw()は、自動的に、定期的に繰り返し実行される関数です。この中に、図形を描くプログラムを書きます。
p5.js自身が、直線を描く関数、長方形を描く関数、三角形を描く関数、円を描く関数…などを用意しています。これらの関数の引数として、座標の情報を渡すことで、図形が描けます。
たとえば、直線なら、関数line()を使います。第1引数に線の開始点、第2引数に線の終点を指定します。
// 点(50,100)から、点(150,200)に線を引く
line(50,100, 150,200);
プログラミングする前に
「とりあえずプログラムを描いてみる」でも、もちろんよいのですが、少し準備すると、よりスムーズに進められます。
今回は、方眼紙に、手書きで、これから描く図形の設計図を描いてみました。
キャンバスの大きさを、横300、縦300にすることにしました。上の設計図では、1マスを25×25としました。
もっと大きなキャンバスを使う場合や、もっと細かな図形を描くなら、もっと広く方眼紙を使ってください。
p5.jsによる図形描画 キャンバスを作る
関数setup()は、プログラムが始まったときに1回だけ実行される関数です。p5.jsの仕組みにより、自動的に呼び出され、実行されるので、関数setup()を呼び出すプログラムを描く必要はありません。
この関数setup()の中に、関数createCanvas()を書きます。引数に数字を2つ渡すと、幅・高さを指定してキャンバスを作ることができます。
サンプルでは、createCanvas(300,300)とし、縦・横300ピクセルのキャンバスとしました。
function setup() {
createCanvas(300, 300);
}
これで図形を描くためのキャンバスが出来ます。
p5.jsによる図形描画(1)直線を引く
次に、図形を描画するため、関数draw()の中に描画のための関数呼び出しを書いていきます。
まずは、直線です。設計図の中では、地平線を表す線です。直線は関数line()で描けます。4つ引数を取ります。順に、第1・第2引数が直線の始点のX座標・Y座標で、第3・第4引数は直線の終点のX座標・Y座標です。
function draw() {
// 直線を描く 点(0,250)から点(300,250)まで
line(0,250, 300,250);
( … 関数draw()の内容が続く …)
p5.jsによる図形描画(2)四角形を描く
絵の中の家の、四角形の部分を描くには、関数rect()を使います。関数draw()の中に書きます。
引数として指定する値が特徴的なので気をつけてください。第1・第2引数が、四角形の左上の頂点のX座標・Y座標です。
// 四角形を描く 左上の頂点が(100,150)で、横が100,縦が100
rect(100,150, 100, 100);
p5.jsによる図形描画(3)三角形を描く
絵の中の家の、屋根の三角形の部分を描くには、関数triangle()を使います。関数draw()の中に書きます。
引数には、三角形の三つの頂点それぞれの座標(X,Y)を渡します。3つの頂点それぞれにX,Yがあるので、6つの引数を渡す必要があります。
// 三角形を描く 三つの頂点の座標
// ( (150, 75), (75,100), (225,150) )を指定する
triangle( 150,75, 75,150, 225,150 );
p5.jsによる図形描画(4)円を描く
絵の右上にある、太陽の円の部分を描くには、関数circle()を使います。関数draw()の中に書きます。
引数には、円の中心になる座標と、円の直径を指定します(※半径ではありません!)。引数は3つになります。
// 円を描く 円の中心の座標(250,50)と、円の直径(50)を指定する
circle(250,50,50);
ここまでのプログラムの全体
ここまでのプログラムの全体は、次の通りです。関数setup()の内容と、関数draw()の内容を見てきました。関数setup()と関数draw()の呼び出しは、p5.jsが自動的に行うので、呼び出し処理を描く必要はありません。
// setup関数
// アプリケーション起動時に実行される。
// 画面を初期化する関数
function setup() {
// キャンバスの作成
createCanvas(300,300);
}
// draw関数
// 定期的に実行される。
// 画面の描画を行う関数
function draw() {
// 直線を描く 点(0,250)から点(300,250)まで
line(0,250, 300,250);
// 四角形を描く 左上の頂点が(100,150)で、横が100,縦が100
rect(100,150, 100, 100);
// 三角形を描く 三つの頂点の座標( (150, 75), (75,100), (225,150) )を指定する
triangle( 150,75, 75,150, 225,150 );
// 円を描く 円の中心の座標(250,50)と、円の直径(50)を指定する
circle(250,50,50);
}
保存して、実行すると、次のような絵が描画されます。
家と太陽の絵が出来ました。
p5.jsによる図形描画(5)図形の内側を塗りつぶす
p5.jsで、図形に色を塗るには、塗りつぶしの色を指定する関数を呼び出してから、図形を描画する関数(line()、rect()、triangle()、circle()など)を呼び出すようにします。
図形を描く前に使う、塗りつぶしの色を指定する関数は、fill()です。引数として、色の名前や、RGB値を指定することができます。
次のプログラムは、関数fill()に茶色(’brown’)を指定して呼び出したあと、地面を表す長方形を描いています。
// 次に描く図形の塗りつぶしの色を決める
fill('brown');
// 四角形を描く 左上の頂点が(0,250)で、横が300,縦が50
rect(0,250, 300, 50);
次は、屋根を表す三角形を描く前に、関数fill()に赤(’red’)を指定する例です。
// 次に描く図形の塗りつぶしの色を決める
fill('red');
// 三角形を描く 三つの頂点の座標
// ( (150, 75), (75,100), (225,150) )を指定する
triangle( 150,75, 75,150, 225,150 );
完成
出来上がりのイメージがこちらです。
プログラムの関数draw()は、次のようになります。
最初に、関数background()を使って、キャンバス全体の色をskyblueに決めています。それから一つずつ図形を順に描いています。
なお、地平線より下の地面の部分は、関数lineではなく、四角形rect()で描いています。
一つ一つの図形を描く前に、その図形を塗りつぶす色を、関数fill()で指定していることに注意してください。
// draw関数
// 定期的に実行される。
// 画面の描画を行う関数
function draw() {
// 背景色を決める
background('skyblue');
// 直線を描く 点(0,250)から点(300,250)まで
line(0,250, 300,250);
// 次に描く図形の塗りつぶしの色を決める
fill('brown');
// 四角形を描く 左上の頂点が(0,250)で、横が300,縦が50
rect(0,250, 300, 50);
// 次に描く図形の塗りつぶしの色を決める
fill('white');
// 四角形を描く 左上の頂点が(100,150)で、横が100,縦が100
rect(100,150, 100, 100);
// 次に描く図形の塗りつぶしの色を決める
fill('red');
// 三角形を描く 三つの頂点の座標
// ( (150, 75), (75,100), (225,150) )を指定する
triangle( 150,75, 75,150, 225,150 );
// 次に描く図形の塗りつぶしの色を決める
fill('yellow');
// 円を描く 円の中心の座標(250,50)と、円の直径(50)を指定する
circle(250,50,50);
}
まとめ
p5.jsは、JavaScriptライブラリです。p5.jsを使うことで、簡単に図形描画を行うプログラムを作成できます。図形を描く関数を使い分けること、引数にどんな値を指定するか確認することがポイントになります。
ぜひ、Monaca EducationでProcessing(p5.js)テンプレートを使ってプロジェクトを作り、描画プログラムを作ってみてください。
練習問題
サンプルプロジェクトを改変して、次のような表示をするようにしてみましょう。
家の壁に、窓を表す長方形を描いています。