Как генерировать движущиеся волны Canvas, используя динамические значения x, y в HTML5?

0

Изображение 174551

У меня есть значения динамического массива x, y...

Используя значения x, y, вы создаете движущиеся синусоидальные, треугольные, квадратные, пилообразные волны в холсте HTML5....

  • 2
    Что вы пробовали до сих пор и где в вашем коде вы столкнулись с проблемами? (Поделись, пожалуйста). Нужны ли вам конкретные частоты и амплитуды или просто «волны».
Теги:
canvas
html5-canvas

1 ответ

4
Лучший ответ

Неизменная синусоидальная волна очевидна - Math.sin(x), но вот остальные...

Данный:

p = period
o = oscillation
x = x coordinate 

Найти y (координата y):

// squared sine
function squareY(x) {
    return( (x%p)<o?o:0 );
}

// sawtooth sine
function sawY(x){
    return( x%p );
}

// triangular sine
function triY(x){
    return( Math.abs((x%p)-o) );
}

В выборках:

var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");

var p=30;    // period
var o=15;   // oscillation

// plot sawtooth sine wave

ctx.beginPath();
for(var x=0;x<120;x++){
    var y=sawY(x);
    ctx.lineTo(x,y);
}
ctx.stroke();


// plot squared sine wave

ctx.beginPath();
for(var x=0;x<60;x++){
    var y=squareY(x);
    y+=75; // just offsetting so drawings don't overlap
    ctx.lineTo(x,y);
}
ctx.stroke();


// plot triangular sine wave

ctx.beginPath();
for(var x=0;x<60;x++){
    var y=triY(x);
    y+=150; // just offsetting so drawings don't overlap
    ctx.lineTo(x,y);
}
ctx.stroke();

[Добавлен пример анимации]

    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");
    ctx.lineWidth=3;

    var p=30;    // period
    var o=15;   // oscillation

    var fps = 60;
    var n=0;
    animate();
    function animate() {
        setTimeout(function() {
            requestAnimationFrame(animate);

            // Drawing code goes here
            n+=1.5;
            if(n>300){
                n=0;
            }
            ctx.clearRect(0,0,canvas.width,canvas.height);
            ctx.beginPath();
            for(var x=0;x<n;x++){
                var y=sawY(x);
                ctx.lineTo(x,y+50);
            }
            ctx.stroke();        

        }, 1000 / fps);
    }


    // sawtooth sine
    function sawY(x){
        return( x%p );
    }
  • 1
    Для анимации: вместо расчета графика внутри цикла for, просто рассчитайте график внутри цикла анимации с течением времени. Если вы новичок в циклах анимации, посмотрите requestAnimationFrame (или более старый, но все еще полезный setInterval или setTimeout). Ура! :)
  • 1
    Добавил пример кода анимации в мой ответ ... jsfiddle.net/m1erickson/DAShs
Показать ещё 13 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню