处理弹跳球的JS模拟(弹性碰撞)

时间:2017-05-25 00:25:14

标签: javascript processing.js

我写了一个程序,显示一个球掉落然后在它撞到地面时反弹。有时当它反弹时,它不会达到其初始高度。这是一个JS小提琴,以显示我的意思:

https://jsfiddle.net/abq4zvsx/

我希望球能够表现得非常有弹性。也就是说,我希望它从一些初始高度开始,一旦弹跳,再次达到初始高度,依此类推,永远。

2017年5月25日编辑: 我从draw函数中删除了一些方法。只有4个正在运行:绘制,重力和反弹确定图形。 ballArray.heightStamp触发一个新线添加到数组lineArray中,以绘制每次弹跳时球到达的高度。

我改变了小提琴以反映这一点。我删除了一些可能掩盖了最相关代码的方法。

2017年5月30日编辑:我的写法不同。我不太熟悉这样写它所以这个例子更简单。整个代码如下:

void setup() {  
  size(800, 400);
}

class Ball {

  float x = 400;
  float y = 50;
  float d = 14;
  float r = 7;
  float vy = 0;
  float ay = 0.2;

  void display() {
    ellipse(x, y, d, d);
  }
  void gravity() {
    vy += ay;
    y += vy;
  }
  void bounce() {
    if ((y+r)>height) {
      vy *= -1;
      y = height - r;
    }
  }

} //closing ball class

Ball ball = new Ball();

void draw() {
  background(235, 245, 255);
  ball.display();
  ball.gravity();
  ball.bounce();
}

2017年6月2日编辑:我更仔细地检查了报告类似问题的其他人提供的解决方案,但他们还没有解决我的问题。上面的代码与小提琴中的代码不同,但我认为它们的内心基本相同。

1 个答案:

答案 0 :(得分:2)

一个简单的修复'是让你的弹跳更加对称':

ball.prototype.bounce = function() {
  if ((this.y+this.r)>=height) {
    this.vy *= -1;
    this.y += this.vy; // Add this line
  }
};

对于更强大的方法,你应该使用more sophisticated integrator从力量的速度和速度来更新你的位置。

相关问题