Processingの図形は座標を元にして描いている。何も指定しなければ、座標は原点が左上隅、x軸が右方向、y軸が下方向であった。また、座標の単位は1ピクセルであった。 それを元にして、例えば、
rect(100,150,20,20);
は、点(100,150)と(120,170)を対角線とする長方形を描く。
Processingでは座標を任意に指定することができる。 原点を点(x0,y0)に移動するには、translate(x0,y0)を用いる。 原点を中心として座標軸をthラジアンだけ回転させるには、rotate(th)を用いる。 座標の単位をsピクセルにするには、scale(s)を用いる。
次の2つのスケッチは同じ結果を与える。
size(200,200); rect(100,150,20,20);
size(200,200); translate(100,150); rect(0,0,20,20);
座標変換は組み合わせて使うことができる。次の例は、原点を点(100,100)に移動し、さらに移動した後の原点を中心にして30度だけ座標を回転させる(結果は下の図の右上)。
translate(100,100); rotate(radians(30));
また、変換の順序を逆にして
rotate(radians(30)); translate(100,100);
とした結果は下の図の右下となる。このように変換を組み合わせる場合には、その順序も重要である。
長方形をその中心の周りに回転させてみよう。 それには、長方形の中心に原点を移動して、座標を回転させ、原点を中心とする長方形を描けばよい。次のスケッチは、幅40、高さ20の長方形を点(200,300)を中心に30度回転させて描く。
translate(200,300); rotate(radians(30)); rect(-20,-10,40,20);
幅30、高さ50の長方形を点(100,200)を中心に45度回転させて描くには次のようにする。
translate(100,200); rotate(radians(45)); rect(-15,-25,30,50);
それぞれを別々のスケッチで実行させればうまくいくが、2つともを描こうとすると、座標変換は累積されて実行されるので、これらを両方並べて書いただけではうまくいかない。そこで、今の座標を記憶させておくpushMatrix()と、記憶した座標に戻すpopMatrix()を用いる。
size(400,400); line(100,200,200,300); noFill(); pushMatrix(); translate(200,300); rotate(radians(30)); rect(-20,-10,40,20); popMatrix(); translate(100,200); rotate(radians(45)); rect(-15,-25,30,50);
次のスケッチでは、画面中央の四角形が回転する。drawが実行されるたびに座標はデフォルトにリセットされるので、回転角度を変数thに覚えさせている。
float th=0; void setup(){ size(400,400); } void draw(){ background( 128 ); translate( width/2, height/2 ); rotate( th ); rect( -100, -100, 200, 200 ); th = th + 0.01; }
以前実施した以下のスケッチでは座標を指定して〇を描いていた。
float x, y, dx; void setup(){ size(400,400); x = 0; y = height / 2; dx = 2; } void draw(){ background(64); circle(x, y, 20); if( x < 0 || x > width ) { dx = -dx; } x = x + dx; }
これは座標変換を用いて、次のようにも書くことができる。
float x, y, dx; void setup(){ size(400,400); x = 0; y = height / 2; dx = 2; } void draw(){ background(64); translate(x, y); circle(0, 0, 20); if( x < 0 || x > width ) { dx = -dx; } x = x + dx; }