指向运动的方向

书名:代码本色:用编程模拟自然系统
作者: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;
    }
  }
}

3、运行结果

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容