#author("2019-05-22T00:13:13+09:00","default:qua","qua") #author("2019-05-22T00:14:36+09:00","default:qua","qua") #navi(Processing/2.ちょっと発展) * 2-5 座標変換 [#k5c8a46c] 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); とした結果は下の図の右下となる。このように変換を組み合わせる場合には、その順序も重要である。 #ref(http://www.ist.aichi-pu.ac.jp/lab/qua/~qua/pbl/processing/img/2-5-1.png) #ref(http://www.ist.aichi-pu.ac.jp/lab/qua/~qua/pbl/processing/img/2-5-1.png,721x430) 長方形をその中心の周りに回転させてみよう。 それには、長方形の中心に原点を移動して、座標を回転させ、原点を中心とする長方形を描けばよい。次のスケッチは、幅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); #ref(http://www.ist.aichi-pu.ac.jp/lab/qua/~qua/pbl/processing/img/2-5-2.png) 次のスケッチでは、画面中央の四角形が回転する。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; }