Um raio de luz parte do canto inferior esquerdo do ecrã, com um ângulo de 45º. Quando colide com o círculo, o círculo muda de cor. Assim que o raio atinge o limite do canvas, o processo é reiniciado.
O período de atualização do canvas é de 20ms. A função eval é usada para transformar a largura e altura do canvas em valores numéricos, caso contrário o programa vê-as como texto e as adições sobre a variável y são concatenações de texto.
Visualização:
<!DOCTYPE html> <html> <head> <title>Gráfico</title> <meta charset="iso-8859-1"> <script type="text/javascript"> var xc = 350; // centro do círculo var yc = 150; var r = 80; // raio do círculo var ang = 45; // ângulo do raio de luz em graus // Incrementos para o raio de luz var incx = Math.cos(ang*Math.PI/180); var incy = -Math.sin(ang*Math.PI/180); var x, y; // coordenadas do ponto cintilante var ctx; var larg, alt; function init() { var c = document.getElementById("cvs"); ctx = c.getContext("2d"); ctx.lineWidth = 3; larg = eval( c.getAttribute("width") ); alt = eval( c.getAttribute("height") ); x = 0; y = alt; var periodoRelogio = 20; setInterval("anima()", periodoRelogio); } function anima() { // Desenhar ctx.fillStyle = "black"; ctx.beginPath(); ctx.rect(0,0,larg,alt); ctx.fill(); // Se a distância de (x,y) a (xc,yc) for inferior a r, então // muda de cor var d = Math.sqrt(Math.pow(x-xc,2)+Math.pow(y-yc,2)); if(d<r) ctx.fillStyle = "#FF8040"; else ctx.fillStyle = "#FF0000"; ctx.beginPath(); ctx.arc(xc,yc,r,0,2*Math.PI); ctx.fill(); x += incx; y += incy; //ctx.fillStyle = "#FFFF20"; //ctx.beginPath(); //ctx.arc(x,y,5,0,2*Math.PI); //ctx.fill(); poeLinha(0,alt,x,y,"#FFFF20"); // Quando sai do canvas, volta ao início if(y<0 || x>larg) { x = 0; y = alt; } } function poeLinha(x1,y1,x2,y2,cor) { ctx.strokeStyle = cor; ctx.beginPath(); ctx.moveTo(x1,y1); ctx.lineTo(x2,y2); ctx.stroke(); } </script> </head> <body onload="init();"> <canvas width="600" height="400" id="cvs"></canvas> </body> </html>