Um pêndulo, sem atrito, com um ângulo inicial ang0 e uma corda de comprimento corda. As equações do movimento foram desenvolvidas apenas com o objetivo de determinar as coordenadas x e y do pêndulo, que seguem uma função sinusoidal esquematizada no rascunho seguinte.
O movimento do pêndulo é discretizado com um tempo de amostragem fixo de 40ms. A variável auxiliar Z define os momentos da amostragem. O valor de cos(Z) indica a posição x do pêndulo. O ângulo atual do pêndulo, ang, é dado por asin(x/corda). O y do pêndulo é dado por corda*cos(ang).
Visualização:
<!DOCTYPE html>
<html>
<head>
<title>Gráfico</title>
<meta charset="iso-8859-1">
<script type="text/javascript">
var corda = 300;// comprimento da corda
var ang0=20; // ângulo inicial
var xc = 300; // Ponto onde a corda está presa
var yc = 35;
var x; // coordenadas do pêndulo
var y;
var ang;
var d = corda*Math.sin(ang0*Math.PI/180); // x máximo
// nº de posições intermédias por onde passa o pêndulo entre os extremos
var numPos = 30;
var incAng = Math.PI/numPos; // incremento angular (para angZ) de cada vez que o relógio dispara
var angZ = 0;
var ctx;
var larg, alt;
function init() {
var c = document.getElementById("cvs");
ctx = c.getContext("2d");
larg = eval( c.getAttribute("width") );
alt = eval( c.getAttribute("height") );
var relogio = 40;
ang = ang0;
x = corda * Math.sin(ang*Math.PI/180) + xc;
y = corda * Math.cos(ang*Math.PI/180) + yc;
setInterval("anima()", relogio);
}
function anima() {
angZ += incAng;
var z = d * Math.cos(angZ);
x = z;
ang = Math.asin(x/corda);
y = corda * Math.cos(ang);
x += xc;
y += yc;
// Desenhar
ctx.fillStyle = "black";
ctx.beginPath();
ctx.rect(0,0,larg,alt);
ctx.fill();
ctx.lineWidth = 3;
poeLinha(xc,yc,x,y,"#8080FF");
ctx.fillStyle = "#FFFF20";
ctx.beginPath();
ctx.arc(x,y,16,0,2*Math.PI);
ctx.fill();
}
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>
