Ellipse bounce from window

Hello,
I’m trying to get the ellipse bounce from the edge of the window but two sides aren’t working. The right vertical side and the bottom horizontal side. Could someone help me out?

float damping = 0.97;
float gravityX = 0.0;
float gravityY = 0.0;
Particle p;
void setup() {
  size(600, 400);
  p = new Particle(200, 200);
  smooth();
  surface.setTitle("Billard mit der Maus");
}

void draw() {
  background(0);
  p.verlet();
  p.collision();
  p.draw();
  if (mousePressed) {
    p.getVector(mouseX, mouseY);
    p.xPrev -= p.dx;
    p.yPrev -= p.dy;
  }
}

class Particle {
  
  float xNow, yNow, xPrev, yPrev;
  
  float dx, dy, vx, vy, len;
  // Constructor
  Particle(float x, float y) {
    xNow = xPrev = x;
    yNow = yPrev = y;
  }
  void draw() {


    ellipse(xNow, yNow, 20, 20);
//problem here with the if condition
    if (xNow > width || xNow < 0) {
      xNow = -xNow;
    }

   if (yNow > height ||yNow< 0) {
      yNow = -yNow;
    }
  }
  // velocity free movement calculation - plus calculates the direction of motion
  void verlet() {
    float tempX = xNow;
    float tempY = yNow;
    xNow += damping * (xNow - xPrev) + gravityX;
    yNow += damping * (yNow - yPrev) + gravityY;
    xPrev = tempX;
    yPrev = tempY;
  }
  void collision() {

  }
 
  void getVector(float x, float y) {
    vx = x - xNow;
    vy = y - yNow;
    len = dist(x, y, xNow, yNow);
  
    dx = vx / len;
    dy = vy / len;
  }
}

Hi @Ellie98,

So, I played a bit with your code. The problem is the condition and where you place it.
In your code, the if condition in the draw method changes the value of xNow and yNow, but then you calculate the verlet() and the vector stays in the same direction despite subtracting the value (I added some getters to print the position of the particle at all times).
Instead, what I did was changing the vector direction when the walls are hit. This way when hitting the wall, the particle changes to opposite direction

float damping = 0.97;
float gravityX = 0.0;
float gravityY = 0.0;
Particle p;
void setup() {
  size(600, 400);
  p = new Particle(200, 200);
  smooth();
  surface.setTitle("Billard mit der Maus");
}

void draw() {
  background(0);
  p.verlet();
  p.collision();
  p.draw();
  if (mousePressed) {
    p.getVector(mouseX, mouseY);
    p.xPrev -= p.dx;
    p.yPrev -= p.dy;
  }
  println("X = " + p.getXpos() + "\tY = " + p.getYpos());
}

class Particle {
  
  float xNow, yNow, xPrev, yPrev;
  
  float dx, dy, vx, vy, len;
  // Constructor
  Particle(float x, float y) {
    xNow = xPrev = x;
    yNow = yPrev = y;
  }
  void draw() {
    ellipse(xNow, yNow, 20, 20);
  }
    
  // velocity free movement calculation - plus calculates the direction of motion
  void verlet() {
    float tempX = xNow;
    float tempY = yNow;
    //Check the boundary conditions. If hit the walls then change direction, else keep adding to the 
    //direction. The same applies to the Y direction
    if(xNow < 0 || xNow > width) xNow -= damping * (xNow - xPrev) + gravityX;
    else xNow += damping * (xNow - xPrev) + gravityX;
    if(yNow < 0 || yNow > height) yNow-= damping * (yNow - yPrev) + gravityY;
    else yNow+= damping * (yNow - yPrev) + gravityY;
    xPrev = tempX;
    yPrev = tempY;
  }

//GETTERS
  float getXpos(){
    return xNow; 
  }
  
  float getYpos(){
    return yNow; 
  }
 
  void getVector(float x, float y) {
    vx = x - xNow;
    vy = y - yNow;
    len = dist(x, y, xNow, yNow);
  
    dx = vx / len;
    dy = vy / len;
  }
}

Hope it helps,
Best regards

1 Like

Awesome, thank you so much!

1 Like