Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 弹跳球的加工仿真(弹性碰撞)_Javascript_Processing.js - Fatal编程技术网

Javascript 弹跳球的加工仿真(弹性碰撞)

Javascript 弹跳球的加工仿真(弹性碰撞),javascript,processing.js,Javascript,Processing.js,我写了一个程序,显示了一个球落下,然后在落地后反弹。有时,当它反弹时,它没有达到初始高度。这里有一把JS小提琴来展示我的意思: 我想让球表现得像是完全有弹性的。也就是说,我希望它从某个初始高度开始,在反弹时,再次达到该初始高度,以此类推,直到永远 2017年5月25日编辑: 我从draw函数中删除了一些方法。只有4个正在运行:绘图、重力和反弹决定图形。ballArray.heightStamp触发一条新线添加到数组lineArray,以绘制球每次反弹时达到的高度 我换了小提琴来反映这一点。我删

我写了一个程序,显示了一个球落下,然后在落地后反弹。有时,当它反弹时,它没有达到初始高度。这里有一把JS小提琴来展示我的意思:

我想让球表现得像是完全有弹性的。也就是说,我希望它从某个初始高度开始,在反弹时,再次达到该初始高度,以此类推,直到永远

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日编辑:我更仔细地检查了向报告类似问题的其他人提供的解决方案,但他们没有解决我的问题。上面的代码与小提琴中的代码不同,但我认为它们在本质上大致相同。

一个简单的“修复”方法是使你的弹跳更加“对称”:

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

为了获得更稳健的方法,您应该使用a根据速度和力的速度更新您的位置。

一个简单的“修复”方法是使您的反弹更加“对称”:

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


为了获得更可靠的方法,您应该使用a根据速度和力的速度更新您的位置。

如果您发布一个较小的示例,您的运气会更好。只是一组简单的变量,显示一个弹跳球,而不是所有那些处理每种力的函数。谢谢。我猜其他的东西让我们很难看到什么是相关的。我也换了小提琴。你的问题是什么,@Jozurcrunch?我希望球每次反弹时都能达到初始高度。如果你举一个较小的例子,你的运气会更好。只是一组简单的变量,显示一个弹跳球,而不是所有那些处理每种力的函数。谢谢。我猜其他的东西让我们很难看到什么是相关的。我也换了小提琴。你的问题是什么,@Jozurcrunch?我希望球每次反弹时都能达到初始高度。据我所知,这一半很有效。球确实达到了相同的高度,但从它的外观来看,球没有击中地面;这是惊人的只是害羞。给我一个非常相似的结果的东西是替换'this.y=高度-this.r;'使用'this.y=高度-this.d;'但我一点也不知道为什么。我还要看一看你链接的帖子。@Jozurcrunch这是因为你只在固定的时间步长上计算位置。地面碰撞通常发生在这些台阶之间,而不是在这些台阶上。实际上,您可以使用非常简单(但在大多数情况下足够)的迭代近似来近似抛物线(恒定加速度->线速度->二次距离)。使用其中一个链接的积分器以获得更好的结果,或者-当你真的只想模拟具有恒定重力的球-地碰撞时-用精确解替换近似值(让球沿着已知的抛物线轨迹)。我很清楚碰撞发生在步之间,而不是在步之间。但我想的更多的是你写的那句话。以下听起来正确吗?假设t=0时,位置为y0,正好高于高度。其流速为vy0。然后假设在t=1时,y1=y0-vy0>高度,因此满足反弹条件,因此在t=2时,y2=y1+vy0=y0-vy0+vy0=y0,速度为vy0。因此,球处于与满足反弹条件之前完全相同的位置,速度正好相反。我真的只是在抓救命稻草here@Jozurcrunch确切地说,这就是我所说的“对称”的意思,我只想澄清数学上的一点:在t=1,y1=y0+vy0>高度,在t=2(反弹满足),y2=y1+(-vyo)=y0+vy0-vy0=y0,因为反弹条件反转了速度的方向。无论如何,正如你所提到的和我在这个例子中所经历的那样,虽然有一些缺点,但我认为你的答案就如何计算这些值而言是非常可靠的,我认为这给了我一些工作,比如装配一些算法,将这种近似的最缺点的部分转移到动画中不太明显的特征上。据我所知,这一半是可行的。球确实达到了相同的高度,但从它的外观来看,球没有击中地面;这是惊人的只是害羞。给我一个非常相似的结果的东西是替换'this.y=高度-this.r;'使用'this.y=高度-this.d;'但我一点也不知道为什么。我还要看一看你链接的帖子。@Jozurcrunch这是因为你只在固定的时间步长上计算位置。地面碰撞通常发生在这些台阶之间,而不是在这些台阶上。实际上,您可以使用非常简单(但在大多数情况下足够)的迭代近似来近似抛物线(恒定加速度->线速度->二次距离)。使用其中一个链接的积分器以获得更好的结果,或者-当你真的只想模拟具有恒定重力的球-地碰撞时-用精确解替换近似值(让球沿着已知的抛物线轨迹)。我很清楚碰撞发生在步之间,而不是在步之间。但我想的更多的是你写的那句话。以下听起来正确吗?假设t=0时,位置为y0,正好高于高度。其流速为vy0。然后假设在t=1时,y1=y0-vy0>高度,因此满足反弹条件,因此在t=2时,y2=y1+vy0=y0-vy0+vy0=y0,速度为vy0。因此,球处于与反弹条件w之前完全相同的位置