2017-07-20 4 views
1

Ich habe diesen Code, um eine Sinuswelle auf dem Bildschirm zu zeichnen, aber aus irgendeinem Grund kommt nichts auf der Leinwand. Es ist durchaus möglich, dass es überhaupt nichts mit requestAnimFrame zu tun hat, aber ich glaube, dass dies das Problem ist. Die var y in der Zeichenfunktion sollte nur eine einfache Sinusfunktion von Asin sein (kx - omega * t), wobei k die Wellenzahl ist, die = 2pi/Wellenlänge.requestAnimationFrame keine Zeichnung auf Leinwand

Javascript:

var canvas = document.getElementById("canvas"); 
var ctx = canvas.getContext("2d"); 
var cx = 0, 
    t = 0, 
    Amp1 = 200, 
    Wav1 = 100, 
    omega = 0.01; 
function draw(x, t) { 
    var y = Amp1 * Math.sin(x(2 * Math.PI/Wav1) - omega * t) + 999; 
    ctx.beginPath(); 
    ctx.moveTo(t + 100, y); 
    ctx.lineTo(t + 100, y + 1); 
    ctx.stroke(); 
    ctx.closePath(); 
} 
window.requestAnimFrame = (function (callback) { 
    return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) { 
     window.setTimeout(callback, 100); 
    }; 
}()); 
function animate() { 
    setInterval(function() { 
     window.requestAnimFrame(animate); 
     var newX = cx, 
      newT = t; 
     cx += 0.5; 
     t += 0.5; 
     draw(newX, newT); 
    }, 50); 
} 
animate(); 

EDIT: Nicht wirklich sicher, warum Amp1 und Wav1 anstehen Cyan?

Antwort

1

Als Erstes erzeugen Sie unzählige Anrufe an animate, weil Sie es jeden Animationsrahmen nennen, und alle 50 ms, so entfernen Sie entweder das Intervall oder den Anruf an requestAnimFrame.

Dann läuft der Rest Ihres Codes richtig. Ich bin mir nicht sicher, warum Sie + 999 auf y setzen, aber deshalb sehen Sie nichts, es geht einfach aus dem Bildschirm (canvas). Da ich kein Mathematiker bin, habe ich vielleicht Ihre Sinuskurve gebrochen, aber ich wollte Ihnen nur zeigen, dass es tatsächlich funktioniert.

var canvas = document.getElementById("canvas"); 
 
var ctx = canvas.getContext("2d"); 
 
var cx = 0, 
 
    t = 0, 
 
    Amp1 = 200, 
 
    Wav1 = 100, 
 
    omega = 0.01; 
 

 
function draw(x, t) { 
 
    var y = Amp1 * Math.sin(x*(2 * Math.PI/Wav1) - omega * t); 
 
    ctx.beginPath(); 
 
    ctx.moveTo(t + 100, y); 
 
    ctx.lineTo(t + 100, y + 1); 
 
    ctx.stroke(); 
 
    ctx.closePath(); 
 
} 
 
window.requestAnimFrame = (function(callback) { 
 
    return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback) { 
 
    window.setTimeout(callback, 100); 
 
    }; 
 
}()); 
 

 
function animate() { 
 
    window.requestAnimFrame(animate); 
 
    var newX = cx, 
 
     newT = t; 
 
    cx += 0.5; 
 
    t += 0.5; 
 
    draw(newX, newT); 
 
} 
 
animate();
<canvas id="canvas"></canvas>

+1

Dank für das Clearing, dass bis: p Der einzige Grund, warum ich 999 wurde die Zugabe war es zu verschieben, um die Leinwand nach unten, so dass es nicht Bildschirm ausgeblendet hat. Vielleicht bin ich mit der Verschiebung ein wenig über Bord gegangen. Hoppla. – CooperCape

+0

Anmerkung: Ich habe hier auch einen Operator '*' hinzugefügt: 'x * (2 * Math.PI/Wav1)', weil Sie versucht haben, x als Funktion zu verwenden, aber ich habe einen Tippfehler angenommen. –

+0

Ahhh das war wahrscheinlich, warum es nicht funktionierte. Kein Tippfehler, nur eine schlechte Annahme dass 'x() = x *()'. Zumindest weiß ich es für zukünftige Referenz. – CooperCape