DAY1 的课程中有介绍了Processing 默认的二维绘制的坐标系。这里再提一下,左上角为(0,0) 位置,越往右,x值越大,这点与笛卡尔坐标系相同。而不同的是,越往下,y值越大,这点与笛卡尔坐标系正好相反。
如下图。

而后,DAY1 作业中布置的Stan Marsh 绘制,由于其眼睛的两个椭圆略有一定角度的旋转倾斜。所以很多童鞋想知道如何用Processing 中的命令来实现这个效果。
这里就来介绍一下两个函数,translate(); & rotate();
先讲一下translate(),在二维绘制的情况下,我们可以给这个函数加入两个参数,即坐标系在x 方向与y 方向上的偏移值。translate(x 方向的偏移值,y 方向的偏移值);
执行完translate 之后,默认的坐标系就发生了一定程度的偏移。如下图。

执行了translate(250,250); 之后原来的坐标系的位置(蓝色)被平移到了红色位置。若在该translate 命令之前绘制一个半径为50 的正圆 ellipse(0,0,100,100); 正圆将被绘制在场景的左上角,而若在该translate 命令之后同样执行ellipse(0,0,100,100); 正圆则将被绘制在场景的正中央(由于坐标系发生了偏移)。
各位童鞋可以复制以下的代码到Processing 中运行观看效果。
void setup(){
size(500,500);
smooth();
}
void draw(){
background(255);
fill(100);
noStroke();
ellipse(0,0,100,100);
translate(250,250);
ellipse(0,0,100,100);
}
平移之后,接着讲一下rotate() 旋转。
与translate() 一样,rotate() 也是作用于坐标系(而非绘制的图形)。他能使得坐标系进行旋转偏移。rotate(需要旋转的弧度); 注意!是弧度而非角度。当然我们也可以用radians() 函数来完成角度到弧度的转化。
譬如,当执行了rotate(PI/4); 命令后,原来的坐标系的位置(蓝色),以(0,0) 为旋转中心,被旋转到了红色位置。如下图。

需要注意的是若translate() 与rotate() 执行的先后顺序不同,最终效果是完全不同的,这里上图例说明。
translate(250,0);
rotate(PI/4);
//先在x轴方向平移250个像素,然后整体坐标系顺时针旋转45度。

而若改变执行顺序,效果则完全不同。
rotate(PI/4);
translate(250,0);
//整体坐标系先顺时针旋转45度,然后在旋转后的x轴方向平移250个像素。
