书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
目录
3.4 指向运动的方向
1、atan 函数与atan2()函数
图3-7上面的两个向量看起来很相似,但是它们的方向是完全相反的。如果我们用反正切函数分别求解这两个向量的角度:
- 对上面两个向量,我们用反正切函数计算得到的角度是相等的。
- 这个计算结果肯定是不对的,因为两个向量的方向完全相反!
- 这是在计算机图形学中很常见的问题。
- 为了解决这个问题,Processing提供了一个现成的函数。这个函数就是atan2()。
- 为了进一步简化这个问题,PVector类提供了heading2D()函数(这个函数会在内部调用atan2()函数),可以用来直接获取任何向量的弧度。
2、示例代码3-3
示例代码3-3 指向运动的方向
Mover mover;
void setup() {
size(640,360);
mover = new Mover();
}
void draw() {
// background(255);
mover.update();
mover.checkEdges();
mover.display();
}
Mover.pde
class Mover {
PVector position;
PVector velocity;
PVector acceleration;
float topspeed;
float xoff, yoff;
float r = 16;
Mover() {
position = new PVector(width/2, height/2);
velocity = new PVector(0, 0);
topspeed = 4;
xoff = 1000;
yoff = 0;
}
void update() {
PVector mouse = new PVector(mouseX, mouseY);
PVector dir = PVector.sub(mouse, position);
dir.normalize();
dir.mult(0.5);
acceleration = dir;
velocity.add(acceleration);
velocity.limit(topspeed);
position.add(velocity);
}
void display() {
float theta = velocity.heading(); //获取弧度值
stroke(0);
strokeWeight(2);
fill(0,127,0);
pushMatrix();
rectMode(CENTER);
translate(position.x, position.y);
rotate(theta); //旋转角度
rect(0, 0, 30, 10);
popMatrix();
}
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;
}
}
}
网友评论