Hipocicloide ou hypocycloid (inglês) são curvas que podem ser produzidas por meio de dois círculos, sendo um externo de raio maior e outro interno de raio menor, além dos círculos é utilizada uma constante que é geralmente representada por k, caso a constante seja um número inteiro, ela determina a quantidade de cúspides na curva.
O círculo de raio menor rola em volta do círculo de raio maior com um ponto fixo, as coordenadas que esse ponto fixo intercepta, são utilizadas como pontos da curva. O ponto inicial sempre é completado (juntado com outro) no final das iterações.
Fig 1: Hipocicloide obtida com K=2.1 |
O círculo de raio menor rola em volta do círculo de raio maior com um ponto fixo, as coordenadas que esse ponto fixo intercepta, são utilizadas como pontos da curva. O ponto inicial sempre é completado (juntado com outro) no final das iterações.
O que mais chama a atenção são os desenhos que é possível gerar simplesmente variando o valor da constante k, como podemos observar nas figura 1.
Para obter os pontos das curvas é utilizada a seguinte equação.
Para reproduzir computacionalmente a equação anterior, foi utilizada a linguagem Javascript junto com Canvas 2D que faz parte do padrão HTML5. Podemos observar o trecho de código que calcula as coordenadas.
function calculateCoordinates(theta) { canvas = document.getElementById("hypocycloid"); width = canvas.width; height = canvas.height; r = width/(k*3); x = width/2 + r * (k - 1) * Math.cos(theta) + r * Math.cos((k-1)*theta); y = height/2 + r * (k - 1) * Math.sin(theta) - r * Math.sin((k-1)*theta); return [x,y]; }
Na implementação o raio (r) foi obtido dividindo a largura da área do canvas (área de desenho) pela constante k*3, pois com valor fixo do raio e dependendo do tamanho da área, parte do desenho poderia ser ocultado.
A seguir podemos observar o trecho de código que é responsável pelas iterações e atualização do desenho e animação.
function animate() { reqFrame = window.mozRequestAnimationFrame || window.msRequestAnimationFrame || window.webkitRequestAnimationFrame || window.oRequestAnimationFrame; theta=theta+0.006; coord = calculateCoordinates(theta); x = coord[0]; y = coord[1]; draw(); reqFrame(animate); }
O trecho que desenha cada ponto no Canvas 2D é mostrado a seguir.
function draw() { canvas = document.getElementById("hypocycloid"); ctx = canvas.getContext("2d"); ctx.fillRect(x,y,1,1); }
Os principais trechos do código são os que foram expostos anteriormente, é claro que para a animação funcionar é necessário inicializar as variáveis, tratar os valores de entrada e etc. O código completo pode ser visto neste link. Outro detalhe foi que para tornar o código mais didático, não tratei a condição de parada do desenho.
Abaixo é possível ver o funcionamento do código, basta clicar no botão "Gerar Curvas". É necessário o navegador ser compatível com HTML5.
Show de bola!
ResponderExcluir