Search code examples
oopprocessing

Why does the origin of the second ball not attached to the first ball?


I was reading the book The Nature of Code, where Exercise 3.12 asked me to implement a double pendulum.

class Pendulum {

  PVector origin, location;

  float r; // arm length
  float angle;
  float aVelocity;
  float aAcceleration;
  float damping;

  Pendulum(PVector origin_, float r_) {
    origin = origin_.get();
    location = new PVector();
    r = r_;
    angle = PI/3;
    aVelocity = 0;
    aAcceleration = 0;
    damping = 0.995;
  }

  void go() {
    update();
    display();
  }

  void update() {
    float gravity = 0.4;
    aAcceleration = (-1 * gravity / r) * sin(angle);
    aVelocity += aAcceleration;
    angle += aVelocity;
    aVelocity *= damping;
    location.set(r*sin(angle), r*cos(angle));
    location.add(origin);
  }

  void display() {
    stroke(0);
    line(origin.x, origin.y, location.x, location.y);
    fill(150);
    ellipse(location.x, location.y, 20, 20);
  }
}

Pendulum p, p2;

void setup() {
  size(640, 360);
  p = new Pendulum(new PVector(width/2, 0), 150);
  p2 = new Pendulum(p.location, 100);
}

void draw() {
  background(255);
  p.go();
  p2.go();
}

So in the setup function, I set the origin of p2 to be the location of p1. However, the origin of p2 appeared on the position (0, 0). How should I fix this? I have tried to set a temporary variable for p2 but that's not convenient.


Solution

  • I'm not exactly sure what you are trying to do, but in the constructor:

    Pendulum(PVector origin_, float r_) {
        origin = origin_.get();
        location = new PVector(); <-- here you set the location to a new vector
        ...
    }
    

    And you directly use the location in here:

    void setup() {
      size(640, 360);
      p = new Pendulum(new PVector(width/2, 0), 150);
      p2 = new Pendulum(p.location, 100); <-- here
    }
    

    which is the new location created. i suppose that's your problem you should be looking into.