Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.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_Physics_Game Physics_Paperjs - Fatal编程技术网

Javascript 模拟两个相互反弹的圆

Javascript 模拟两个相互反弹的圆,javascript,physics,game-physics,paperjs,Javascript,Physics,Game Physics,Paperjs,我有很多粒子在四处移动,当它们接触时,我会通过检测来观察它们。如果两个粒子接触,它们将以相反方向反弹 particle.moveSelf = function() { var radians = this.angle * Math.PI / 180; var moveX = this.velocity * Math.sin(radians); var moveY = this.velocity *

我有很多粒子在四处移动,当它们接触时,我会通过检测来观察它们。如果两个粒子接触,它们将以相反方向反弹

            particle.moveSelf = function() {
            var radians = this.angle * Math.PI / 180;

            var moveX = this.velocity * Math.sin(radians);
            var moveY = this.velocity * Math.cos(radians);

            for (var i = 0; i < particles.length; i++) {
                var distance = this.position.getDistance(new Point(particles[i].position.x, particles[i].position.y));
                //if distance < radius 1 + radius 2, bounce this circle away
                if (distance < (this.radius + particles[i].radius) && this.id !== particles[i].id) {
                    this.velocity = -this.velocity;

                }
            }

            this.position.x += moveX;
            this.position.y += moveY;
        };
particle.moveSelf=函数(){
var弧度=this.angle*Math.PI/180;
var moveX=this.velocity*Math.sin(弧度);
var moveY=this.velocity*Math.cos(弧度);
对于(var i=0;i
当我运行这段代码时,这些圆彼此卡住,每帧以1*的速度来回移动


关于如何计算弹跳的速度或角度有很多问题,但我的问题是它会陷入无限振荡。

我以前做过这件事,所以这里有一些见解:

  • 最安全的方法是添加每个粒子的碰撞列表

    • 在第一个过程中,您只需检测碰撞
    • 并使用相互碰撞的所有粒子的索引清除/填充碰撞列表

      for (i=0;i<particles;i++) particle[i].collide.clear();
      for (i=0;i<particles;i++) 
       for (j=i+1;j<particles;j++)
        if (colide(particle[i],particle[j]))
         {
         particle[i].collide.add(j);
         particle[j].collide.add(i);
         }
      

      for(i=0;我无法提供答案,因为我们无法测试它,但是,这里有一些建议。首先执行for,然后计算位置。在for中,首先检查您的id(现在您最后检查),如果(this.id==particles[i].id)继续,请使用
      
      
      for (i=0;i<particles;i++) 
       for (j=0;j<particle[i].collides;j++)
         {
         // here compute reflected direction ,speed whatever of the bounce to vector dir
         particle[                       i].reflect+=dir;
         particle[particle[i].collide[j]].reflect+=dir;
         }
      
      for (i=0;i<particles;i++) 
         {
         particle[i].speed=compute_speed_from(particle[i].reflect);
         }