这是我想要达到的效果:link
我已经得到了四个波浪,它们确实具有动画效果,但是我一直坚持给它们每个动画稍有不同。在当前点,所有曲线都以相同的速度,相同的方向移动并在相同的位置切换。在所有这些方面,它们应该略有不同。我正在寻找的最终结果非常类似于我发布的链接,不同之处在于每个波最多只能有一个周期,即上升一次和下降一次。谢谢您的意见。
下面是我的代码:
function start() {
var canvas = $("canvas");
console.log(canvas);
canvas.each(function(index, canvas) {
var context = canvas.getContext("2d");
canvas.width = $(".box").eq(index).width();
canvas.height = $(".box").eq(index).height();
context.clearRect(0, 0, canvas.width, canvas.height);
drawCurves(context, step);
step += 1;
});
requestAnimationFrame(start);
}
var step = -1;
function drawCurves(ctx, step) {
var width = ctx.canvas.width;
var height = ctx.canvas.height;
ctx.lineWidth = 2;
for (i = 0; i < 4 ; i++) {
var x = 0;
var y = 0;
ctx.beginPath();
if (i === 0 ) {
ctx.strokeStyle = "red";
var amplitude = 20;
var frequency = height / (2 * Math.PI) ;
console.log(i, frequency);
} if ( i === 1) {
ctx.strokeStyle = "blue";
var amplitude = 30;
var frequency = (height / (2 * Math.PI));
console.log(i, frequency);
} if ( i === 2) {
ctx.strokeStyle = "green";
var amplitude = 40;
var frequency = height / (2 * Math.PI) ;
console.log(i, frequency);
} if (i === 3) {
ctx.strokeStyle = "yellow";
var amplitude = 50;
var frequency = height / (2 * Math.PI) ;
console.log(i, frequency);
}
ctx.save();
ctx.translate(-amplitude * Math.sin(step / frequency), 0);
while (y < height) {
x = (width / 2) + (amplitude * Math.sin((y + step) / frequency)) ;
ctx.lineTo(x, y);
y++;
}
ctx.closePath();
ctx.stroke();
ctx.restore();
}
}
$(document).ready(function() {
start();
})
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<div class="box">
<canvas id="canvas"></canvas>
</div>
<div class="box">
<canvas id="canvas"></canvas>
</div>
</body>
</html>
这里是Code Pen
答案 0 :(得分:0)
您的代码仅绘制一个窦波。 我会为您提供这些建议:
_如果要使用不同的(同时)波,则必须在绘制点使用不同的x / y值。
_您使用$(document).ready(function()作为动画循环,这并不是更好的方法。对于动画,您应该设置setInterval或更好地使用用于创建动画的requestAnimationFrame。动画循环绘制4条窦性线,我会忘记使用对象的步骤,我认为更好,但这并不重要,我没有时间尝试您的代码,但是使用requestAnimationFrame(start()时,它在做什么),而不是$ document.ready? 显然,在每个动画中,都使用clearRect(width,height);来清除绘图位置。例如。
_这4个步骤在相同的笛卡尔方程式中将y +1到+4。在人眼不会真正看到的鼻窦曲线中,这是一个很小的变化。您可以对每个步骤/对象使用不同的正弦方程式来表示不同的方程式,即Math.sin(y)+10或Math.sin(y)* 10等...甚至每个不同对象的增量值都不同。 _i将避免平移并使用for循环使用sin(x)和所需的任何方程式来增加x值并获得y值,这是个人选择,但可以避免编写.translate()行并使用法线坐标而不是移动的坐标,因此您可以轻松地在console.log中看到画布区域中的实际坐标。
_A如前所述,如果在数组中使用objets(并对其进行循环)并设置styleColor和4个objets的权重,则可以在程序开始时丢弃校验IF。
希望有帮助,没有时间编写清晰的代码。
答案 1 :(得分:0)
@enxaneta谢谢您的输入!按照我想要的方式进行操作,以下是我的解决方案:
var step = 0;
function start(timestamp) {
var canvas = $("canvas");
canvas.each(function(index, canvas) {
var context = canvas.getContext("2d");
canvas.width = $(".box").eq(index).width();
canvas.height = $(".box").eq(index).height();
context.clearRect(0, 0, canvas.width, canvas.height);
if (canvas.height > 1000 ) {
drawWave(context, 20,"sin");
drawWave(context, 60,"cos");
drawWave(context, 40,"sin");
drawWave(context, 80,"cos");
}
if (canvas.height < 1000 ) {
drawWave(context, 10,"sin");
drawWave(context, 30,"cos");
drawWave(context, 20,"sin");
drawWave(context, 40,"cos");
}
step = timestamp / 7;
});
window.requestAnimationFrame(start);
}
function drawWave(ctx,amplitude,trig){
var width = ctx.canvas.width;
var height = ctx.canvas.height;
ctx.beginPath();
ctx.lineWidth = 2;
ctx.strokeStyle = "blue";
var x = 0;
var y = 0;
var frequency = height / (2 * Math.PI);
ctx.save();
ctx.translate(-amplitude * Math[trig](step / frequency), 0);
while (y < height) {
x = width / 2 + amplitude * Math[trig]((y + step) / frequency);
ctx.lineTo(x, y);
y++;
}
// ctx.closePath();
ctx.stroke();
ctx.restore();
}
$(document).ready(function() {
start();
});
canvas {
background-color: wheat;
position: absolute;
}
.box {
width: 500px;
height: 2000px;
border: solid;
}
.box.t {
width: 500px;
height: 200px;
border: solid;
}
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<div class="box t">
<canvas id="canvas"></canvas>
</div>
<div class="box">
<canvas id="canvas"></canvas>
</div>
</body>
</html>