使用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谢谢,但我希望每次初始化时跳线都是随机的。请看添加它。这只是一个注释,让您了解如何处理一般问题的基本知识。现在您知道了,