美文网首页
指向运动的方向

指向运动的方向

作者: 大龙10 | 来源:发表于2022-04-28 06:18 被阅读0次

    书名:代码本色:用编程模拟自然系统
    作者: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、运行结果

    相关文章

      网友评论

          本文标题:指向运动的方向

          本文链接:https://www.haomeiwen.com/subject/reaiertx.html