躁动小球--鼠标圆形绘制

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>躁动的小球</title>
    <style media="screen">
      *{
        margin: 0px;
        padding: 0px;
      }
      #canvas{
        box-shadow: 0px 0px 10px black;
        display: block;
        margin: 50px auto;
        background: black;
      }
    </style>
  </head>
  <body>
    <canvas id="canvas" width="800" height="800"></canvas>

  </body>
  <script type="text/javascript">
    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext("2d");

    //随机函数
    function randomSize(min,max){
      return Math.floor(Math.random()*(max -min)+min);
    }
    // function randomColor(){
    //   var r = randomSize(0,255);
    //   var g = randomSize(0,255);
    //   var b = randomSize(0,255);
    //    return "rgb(" + r +"," + g + "," + b +")";
    // }

    //创建小球对象
    function Ball(){
      var speedX,speedY;
      //速度
      speedX = randomSize(1,3);
      speedY = randomSize(1,3);

      //半径
      this.r = randomSize(5,8);
      //圆心
      this.x = randomSize(this.r,canvas.width-this.r);
      this.y = randomSize(this.r,canvas.height -this.r);
      //方向
      this.speedX = randomSize(1,3) == 1 ? speedX : -speedX;
      this.speedY = randomSize(1,3) == 1 ? speedY : -speedY;
      //颜色
      this.color = "green";
    }
    //定义方法绘制小球
    Ball.prototype.draw = function(){
      ctx.beginPath();
      ctx.arc(this.x,this.y,this.r,0,360);
      ctx.closePath();
      ctx.fillStyle = this.color;
      ctx.fill();
    }
    //定义方法完成小球的移动
    Ball.prototype.move = function (){
      //改变中心的的x,y
      this.x+=this.speedX;
      this.y +=this.speedY;
    //进行边界判断
    if (this.x >=canvas.width-this.r) {
      this.speedX *=-1;
    } else if (this.x <=this.r) {
      this.speedX *=-1;
    }
    if (this.y >=canvas.height-this.r) {
      this.speedY *=-1;
    } else if (this.y <=this.r) {
      this.speedY *=-1;
    }
  }
  //生成小球对象
  var balls = [];
  for (var i = 0; i < 500; i++) {
    var ball = new Ball();
    balls.push(ball);
  }
//定义以鼠标点为圆心的圆
  //球形两两碰撞检测
  function ArcCollision(e1,e2){
    var lx = e1.x -e2.x;
    var ly = e1.y -e2.y;
    //球心距
    var dis = Math.sqrt(Math.pow(lx,2)+Math.pow(ly,2));
    //如果两个圆心距dis<50  就返回true
    if (dis <= 50 ) {
      return true;
    }else {
      return false;
    }
  }
  //定义一个空数组存储当前满足条件的点
  var circle = [];
  //定义一个圆规定小球在此范围(以鼠标为中心的圆)内方可连线
  var rs =150;
  //画圆检测函数
  function drawCircle(){
    //每次调用之前清空数组;
    circle = [];
    for (var i = 0; i < balls.length; i++) {
      var lx = balls[i].x -mousePoint.x;
      var ly = balls[i].y -mousePoint.y;
      //球心距
      var dis = Math.sqrt(Math.pow(lx,2)+Math.pow(ly,2));
      //如果两个圆心距dis<rs  就把该点放到数组中
      if (dis <= rs ) {
        circle.push(balls[i])
      }
    }
  }
  //检测划线函数
  function collisionLine(balls){
    for (var i = 0; i < balls.length; i++) {
      for (var j = i+1; j < balls.length; j++) {
        //进行距离检测
        var result = ArcCollision(balls[i],balls[j]);
        if (result) {
          //画线函数
          drawLine(balls[i],balls[j]);
        }
      }
    }
  };
    //画线函数
    function drawLine(startPoint,endPoint){
      ctx.beginPath();
      ctx.moveTo(startPoint.x,startPoint.y);
      ctx.lineTo(endPoint.x,endPoint.y);
      ctx.closePath();
      ctx.strokeStyle = "white";
      ctx.lineWidth = 1;
      ctx.stroke();
    }
  //创建鼠标点的对象
  function Point(x,y){
    this.x = x;
    this.y = y;
  }
  //创建鼠标的点对象  初始化
  var mousePoint = new Point(canvas.width/2,canvas.height/2);
  //事件处理函数
  canvas.onmousemove = function(e){
    var even = e || event;
    mousePoint.x = even.clientX - canvas.offsetLeft;
    mousePoint.y = even.clientY - canvas.offsetTop;
  }
  canvas.onmouseleave = function(){
    mousePoint.x =canvas.width/2;
    mousePoint.y =canvas.height/2;
  }
  //让小球躁动起来
  function animation(){
    //每次动起来之前,清除画布
    ctx.clearRect(0,0,canvas.width,canvas.height);

    //遍历小球数组,让每一个小球动起来
    for (var i = 0; i < balls.length; i++) {
      balls[i].move();
      balls[i].draw();
    };
    drawCircle();
    collisionLine(circle);
      window.requestAnimationFrame(animation);
      //调用检测画线函数

  }
  animation();


  </script>
</html>


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值