第0章:引言
这一章里我参考了示例0-5和示例0-6,把0-5中Perlin噪声的游走模型用在了0-6的颜色显示代码上,画出了颜色随着时间改变的烟雾效果。主要用到的函数有:
noise()函数
noise()函数返回指定坐标处的Perlin噪声值。Perlin噪声算法能生成符合自然排序(“平滑”)的伪随机数序列。noise()函数有3个参数,分别代表x轴,y轴,z轴的随机数,所以可以生成1维到3维的Perlin噪声。
完整代码:
float increment = 0.02;
float zoff=0.0;
void setup() {
size(720,480);
}
void draw() {
background(0);
loadPixels();
float xoff = 0.0;
for (int x = 0; x < width; x++) {
xoff += increment;
float yoff = 0.0;
for (int y = 0; y < height; y++) {
yoff += increment;
float bright = noise(xoff,yoff,zoff)*255;
pixels[x+y*width] = color(bright*0.5*abs(sin(zoff)),bright*0.3*abs(sin(zoff)),bright*(1-0.8*abs(sin(zoff))));
}
}
updatePixels();
zoff += increment;
}
运行效果:
第1章:向量
这一章我参考了示例1-10和1-11,制作了一个弹力绳拉拽小球的效果,可以通过修改数组大小来改变小球数量(演示GIF中使用了3个小球)。鼠标与小球之间有一根直线连接,小球被连接时会获得一个朝着鼠标方向的加速度,模拟小球被弹力绳拉拽的效果,当鼠标和小球之间的距离过大的时候,直线会消失,模拟绳子被绷断的效果,同时小球失去加速度,以拉断瞬间的速度继续移动,当距离回到正常范围,则会重新生成直线拉拽小球。
实现过程:
Mover类:我在Mover类里更改了实例化对象时候的函数,可以自定义初始化小球的位置,在update函数里面添加了距离限制,只有小球和鼠标距离在规定范围内时加速度才起作用,在display函数里面添加了鼠标和小球之间的连线显示,在规定距离以内会显示鼠标和小球的连线。
class Mover {
PVector position;
PVector velocity;
PVector acceleration;
// The Mover's maximum speed
float topspeed;
Mover(float x,float y) {
// Start in the center
position = new PVector(x,y);
velocity = new PVector(0,0);
topspeed = 5;
}
void update() {
PVector mouse = new PVector(mouseX,mouseY);
PVector acceleration = PVector.sub(mouse,position);
acceleration.setMag(0.2);
if (sq(position.x-mouseX)+sq(position.y-mouseY)<=100000)//当距离在规定范围内时加速度才生效
velocity.add(acceleration);
velocity.limit(topspeed);
position.add(velocity);
}
void display(float c) {
if (sq(position.x-mouseX)+sq(position.y-mouseY)<=100000)//当距离在规定范围内时才显示连线
line(position.x,position.y,mouseX,mouseY);
stroke(0);
strokeWeight(2);
fill(c);
ellipse(position.x,position.y,48,48);
}
void checkEdges() {
if (position.x > width) {
position.x = 0;
}
else if (position.x < 0) {
position.x = width;
}
if (position.y > height) {
position.y = 0;
}
else if (position.y < 0) {
position.y = height;
}