使用JavaScript绘制画布动画。每次启动时的随机坐标和速度

使用JavaScript绘制画布动画。每次启动时的随机坐标和速度,javascript,html,animation,canvas,Javascript,Html,Animation,Canvas,编辑:感谢大家宝贵的时间和努力。最后我做了这个 我只是在玩帆布,做了这个。小提琴链接 。。。这里有一些代码。。。 var=[]; 对于(var i=50;iTL;DR),请查看它是否正在运行 使坐标随机: 这需要向x和y坐标添加一些随机位移。因此,我向坐标添加了一个随机值。但是,小于1的位移是不明显的。因此,您需要将该随机数放大一倍。这就是随机化因子的来源。从那以后,我将其设置为100t是在每次迭代中移动坐标的值,所以这会给动画一个真正随机的外观 使速度随机: 我花了一段时间才弄明白这一点,但理

编辑:感谢大家宝贵的时间和努力。最后我做了这个

我只是在玩帆布,做了这个。小提琴链接

。。。这里有一些代码。。。
var=[];
对于(var i=50;iTL;DR),请查看它是否正在运行

使坐标随机: 这需要向x和y坐标添加一些随机位移。因此,我向坐标添加了一个随机值。但是,小于1的位移是不明显的。因此,您需要将该随机数放大一倍。这就是
随机化因子的来源。从那以后,我将其设置为
100
t是在每次迭代中移动坐标的值,所以这会给动画一个真正随机的外观

使速度随机: 我花了一段时间才弄明白这一点,但理想的方法是将一个速度值放入坐标数组中。这样可以确保在动画持续时间内,速度保持不变,这会给你一种更平滑的感觉。但再次将半径
r
乘以一个介于0和1之间的值会显著降低速度对于一些圆,我在3上加了一个乘数来稍微补偿

理想情况下,我会将a设为2,因为
Math.random()
的平均值为0.5,因此2的乘数足以补偿这一点。但一些实验表明,3的乘数更好。您可以根据自己的喜好选择该值

生成坐标的逻辑更改如下:

for(var i = 50; i <= width;i += 100)  {
  for(var j = 51; j <= height;j += 100) {
    var x = i + (Math.random() - 0.5)*randomizationFactor;
    var y = j + (Math.random() - 0.5)*randomizationFactor;
    cords.push({ cor: x+','+y, speed: Math.random()});
  }
}
function render() {

  ctx.clearRect(0,0,width,height);

  cords.forEach(function(e1) {
    //console.log(e1);
    ctx.fillStyle = e1.rgb;
    ctx.beginPath();
    var r = e1.base + Math.abs(Math.sin(angle)) * offset * e1.speed * 3;
    var v = e1.cor.split(',');
    ctx.arc(v[0],v[1],r,0,Math.PI * 2, false);
    ctx.fill();
  });
  angle += speed ;
  requestAnimationFrame(render);
}
建议:使用颜色更新坐标 我可能还会每5秒更新一次圆圈的位置以及颜色。这也很简单。我刚刚创建了一个函数
resetCoordinates
,它与
setBaseRgb
函数一起每5秒运行一次

var cords = [];
function resetCoordinates() {
  cords = [];

  for(var i = 50; i <= width;i += 100)  {
    for(var j = 51; j <= height;j += 100) {
      var x = i + (Math.random() - 0.5)*randomizationFactor;
      var y = j + (Math.random() - 0.5)*randomizationFactor;
      cords.push({ cor: x+','+y, speed: Math.random()});
    }
  }
}
var-cords=[];
函数resetCoordinates(){
跳线=[];
对于(var i=50;iTL;DR),请查看它是否正在运行

使坐标随机: 这需要向x和y坐标添加一些随机位移。因此,我向坐标添加了一个随机值。但是,小于1的位移是不明显的。因此,您需要将该随机数放大一倍。这就是
随机化因子的来源。从那以后,我将其设置为
100
t是在每次迭代中移动坐标的值,所以这会给动画一个真正随机的外观

使速度随机: 我花了一段时间才弄明白这一点,但理想的方法是将一个速度值放入坐标数组中。这样可以确保在动画持续时间内,速度保持不变,这会给你一种更平滑的感觉。但再次将半径
r
乘以一个介于0和1之间的值会显著降低速度对于一些圆,我在3上加了一个乘数来稍微补偿

理想情况下,我会将a设为2,因为
Math.random()
的平均值为0.5,因此2的乘数足以补偿这一点。但一些实验表明,3的乘数更好。您可以根据自己的喜好选择该值

生成坐标的逻辑更改如下:

for(var i = 50; i <= width;i += 100)  {
  for(var j = 51; j <= height;j += 100) {
    var x = i + (Math.random() - 0.5)*randomizationFactor;
    var y = j + (Math.random() - 0.5)*randomizationFactor;
    cords.push({ cor: x+','+y, speed: Math.random()});
  }
}
function render() {

  ctx.clearRect(0,0,width,height);

  cords.forEach(function(e1) {
    //console.log(e1);
    ctx.fillStyle = e1.rgb;
    ctx.beginPath();
    var r = e1.base + Math.abs(Math.sin(angle)) * offset * e1.speed * 3;
    var v = e1.cor.split(',');
    ctx.arc(v[0],v[1],r,0,Math.PI * 2, false);
    ctx.fill();
  });
  angle += speed ;
  requestAnimationFrame(render);
}
建议:使用颜色更新坐标 我可能还会每5秒更新一次圆圈的位置以及颜色。这也很简单。我刚刚创建了一个函数
resetCoordinates
,它与
setBaseRgb
函数一起每5秒运行一次

var cords = [];
function resetCoordinates() {
  cords = [];

  for(var i = 50; i <= width;i += 100)  {
    for(var j = 51; j <= height;j += 100) {
      var x = i + (Math.random() - 0.5)*randomizationFactor;
      var y = j + (Math.random() - 0.5)*randomizationFactor;
      cords.push({ cor: x+','+y, speed: Math.random()});
    }
  }
}
var-cords=[];
函数resetCoordinates(){
跳线=[];

对于(var i=50;iUPDATE我在您的代码中做了一些修复,可以使您的动画更加动态。完全重写了示例。 (很抱歉更改了变量名,imo现在更好了)

内置的
Math.random
不是真正的随机,当你遇到动画时会变得很明显。尝试使用这个库

每个圆的内部基础属性会更好(更动态)

这就是
setBaseRgb
函数的外观

function setBaseRgb(el){
  el.base = rand(-bouncing, bouncing);
  el.speed = rand(5, 10) * speed;
  el.angle = 0;
  el.rgb = 'rgb('+rand(0, 255)+','+rand(0, 255)+','+rand(0, 255)+')';
}
你所有的动画都有固定的
setInterval
timeout。使用随机超时效果更好

cords.forEach(function(el){
  // random timeout for each circle
  setInterval(setBaseRgb.bind(null,el), rand(3000, 5000));
})
你忘了将你的底数添加到你的圆圈位置

function render() {    

  ctx.clearRect(0,0,width,height);

  circles.forEach(function(el) {
    ctx.fillStyle = el.rgb;
    ctx.beginPath();
    var r = bouncing + el.base + Math.abs(Math.sin(el.angle)) * offset;
    var coords = el.coords;
    ctx.arc(
       coords.x + el.base,
       coords.y + el.base,
       r, 0, Math.PI * 2, false
    );
    ctx.fill();
    el.angle += el.speed;
  });
  requestAnimationFrame(render);
}

render();
效果1

加上这个

if(el.angle > 1)
  el.angle=0;
结果bubling效果

效果2

玩公式会产生这样的结果


效果3

更新我在你的代码中做了一些修复,可以使你的动画更加动态。完全重写了示例。 (很抱歉更改了变量名,imo现在更好了)

内置的
Math.random
不是真正的随机,当你遇到动画时会变得很明显。尝试使用这个库

每个圆的内部基础属性会更好(更动态)

这就是
setBaseRgb
函数的外观

function setBaseRgb(el){
  el.base = rand(-bouncing, bouncing);
  el.speed = rand(5, 10) * speed;
  el.angle = 0;
  el.rgb = 'rgb('+rand(0, 255)+','+rand(0, 255)+','+rand(0, 255)+')';
}
你所有的动画都有固定的
setInterval
timeout。使用随机超时效果更好

cords.forEach(function(el){
  // random timeout for each circle
  setInterval(setBaseRgb.bind(null,el), rand(3000, 5000));
})
你忘了将你的底数添加到你的圆圈位置

function render() {    

  ctx.clearRect(0,0,width,height);

  circles.forEach(function(el) {
    ctx.fillStyle = el.rgb;
    ctx.beginPath();
    var r = bouncing + el.base + Math.abs(Math.sin(el.angle)) * offset;
    var coords = el.coords;
    ctx.arc(
       coords.x + el.base,
       coords.y + el.base,
       r, 0, Math.PI * 2, false
    );
    ctx.fill();
    el.angle += el.speed;
  });
  requestAnimationFrame(render);
}

render();
效果1

加上这个

if(el.angle > 1)
  el.angle=0;
结果bubling效果

效果2

玩公式会产生这样的结果


效果3

定义圆对象自身的速度和角度@kaido谢谢,但我希望每次初始化时跳线都是随机的。请看添加它。这只是一个注释,让您了解如何处理一般问题的基本知识。现在您知道了,您可以为对象添加任何单一属性。定义速度和角度圆圈中的angle对象本身@Kaido谢谢,但我希望每次初始化时跳线都是随机的。请看添加它。这只是一个注释,让您了解如何处理一般问题的基本知识。现在您知道了,