账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    canvas小球碰撞运动
    43
    0

    问题描述

    网上找了一段canvas小球碰撞运动的代码,代码很棒,但是有个问题就是当两个小球一开始就是交叉的时候,它们的运动轨迹是一样的,按理说运动轨迹是随机的,不知道为什么会出现一起跑的情况?

    相关代码

    window.onload = function () {
      var canvas = document.getElementById("ball");
      var cxt = canvas.getContext("2d");
      var r = 20;
      var maxNum = 5;
      var ballArray = new Array();
      var maxX = canvas.width;
      var maxY = canvas.height;
      for (var n = 0; n < maxNum; n++) {
        var x = {
          x: getRandomNumber(r, maxX - r),
          y: getRandomNumber(r, maxY - r),
          r: r,
          vX: getRandomNumber(0.5, 1),
          vY: getRandomNumber(0.5, 1),
          color: getRandomColor(),
        }
        ballArray.push(x);
      }
    
      function getRandomColor() {
        return (function (m, s, c) {
          return (c ? arguments.callee(m, s, c - 1) : '#') +
            s[m.floor(m.random() * 16)]
        })(Math, '0123456789abcdef', 5)
      }
    
      draw();
    
      function draw() {
        cxt.fillStyle = "#000";
        cxt.fillRect(0, 0, canvas.width, canvas.height);
        for (i in ballArray) {
          var x = i;
    
          ballArray[i].x += ballArray[i].vX /2;
          ballArray[i].y += ballArray[i].vY/2;
    
          if (ballArray[i].x >= maxX - r) {
            ballArray[i].x = maxX - r;
            ballArray[i].vX = -ballArray[i].vX;
          }
          if (ballArray[i].x <= r) {
            ballArray[i].x = r;
            ballArray[i].vX = -ballArray[i].vX;
          }
          if (ballArray[i].y >= maxY - r) {
            ballArray[i].y = maxY - r;
            ballArray[i].vY = -ballArray[i].vY;
          }
          if (ballArray[i].y <= r) {
            ballArray[i].y = r;
            ballArray[i].vY = -ballArray[i].vY;
          }
    
          for (var j = 0; j < maxNum; j++)
            if (j !== x) {
              if (Math.round(Math.pow(ballArray[x].x - ballArray[j].x, 2) +
                  Math.pow(ballArray[x].y - ballArray[j].y, 2)) <=
                Math.round(Math.pow(r + r, 2))) {
    
                var tempX = ballArray[x].vX;
                var tempY = ballArray[x].vY;
                ballArray[x].vX = ballArray[j].vX;
                ballArray[j].vX = tempX;
                ballArray[x].vY = ballArray[j].vY;
                ballArray[j].vY = tempY;
              }
            }
          cxt.beginPath();
    
          cxt.fillStyle = ballArray[i].color;
          cxt.arc(ballArray[i].x, ballArray[i].y, ballArray[i].r, 0, Math.PI * 2, true);
          cxt.closePath();
          cxt.fill();
        }
        setTimeout(function () {
          draw();
        }, 10);
      }
    
      function getRandomNumber(min, max) {
        return (min + Math.floor(Math.random() * (max - min + 1)))
      }
    }

    你期待的结果是什么?实际看到的错误信息又是什么?

    按理说运动轨迹是随机的,互不影响的。

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 乱世狂刀 普通会员 1楼
      502 Bad Gateway

      502 Bad Gateway


      nginx
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部