Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JS && Matemática - RSJS 2017

JS && Matemática - RSJS 2017

A matemática se faz presente no nosso dia-a-dia e a usamos empiricamente muitas vezes. Essa palestra aborda exemplos usando as APIs do browser! Desde Canvas até Web Audio passando por animações de CSS entenda como conhecer senos e cossenos é importante!

Rafael Specht da Silva

April 08, 2017
Tweet

More Decks by Rafael Specht da Silva

Other Decks in Programming

Transcript

  1. “O que a escola deveria ensinar: - Declarar IR -

    Escriturar apê - Educação financeira - Costura - Culinária - Elétrica O que a escola ensina: - Bháskara” Alguém no twitter:
  2. const xAxis = [] for (let i = 0; i

    <= 24; i++) { xAxis.push(i) }
  3. const xAxis = [] for (let i = 0; i

    <= 24; i++) { xAxis.push(i) } // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...]
  4. for (let i = 0; i < xAxis.length; i++) {

    const value = AMOUNT * Math.pow((1 + TAX/100), xAxis[i]) ctx.lineTo(i, value) }
  5. for (let i = 0; i < xAxis.length; i++) {

    const value = AMOUNT * Math.pow((1 + TAX/100), xAxis[i]) ctx.lineTo(i, value) }
  6. Problema: o ponto (0, 0) do canvas é em cima

    à esquerda Solução: diminuímos os valores da altura
  7. const { height, width } = ctx.canvas for (let i

    = 0; i < xAxis.length; i++) { const value = height - AMOUNT * Math.pow((1 + TAX/100), xAxis[i]) ctx.lineTo(i, value) }
  8. Problema: o eixo X está usando valores em pixels e

    não considerando a largura do canvas Solução: criamos uma escala onde cada valor de X é uma fatia da largura
  9. const sliceSize = width / (xAxis.length - 1) for (let

    i = 0; i < xAxis.length; i++) { const value = AMOUNT * Math.pow((1 + TAX/100), xAxis[i]) const y = height - value const x = sliceSize * i ctx.lineTo(x, y) }
  10. Problema: o eixo Y usa valores em pixels e nosso

    máximo ultrapassa isso Solução: criamos uma escala de Y levando em conta que o valor máximo como a altura do canvas
  11. const sliceSize = width / (xAxis.length - 1) const points

    = [] let max = null for (let i = 0; i < xAxis.length; i++) { const value = AMOUNT * Math.pow((1 + TAX/100), xAxis[i]) const x = sliceSize * i max = value > max ? value : max points.push({x, value}) }
  12. points.forEach(({x, value}) => { const scaledY = (value / max)

    * height ctx.lineTo(x, height - scaledY) })
  13. SVG

  14. points.forEach(({x, values}, pointIndex) => { let scaledY = (values[index] /

    rangeSize) * height scaledY += Math.abs(min) / rangeSize * height if (pointIndex === 0) { d += `M${x} ${height - scaledY} ` } d += `L${x} ${height - scaledY} ` })
  15. M = P * (1 + i)t a n =

    a 1 * qn - 1
  16. Uma PG com razão √2 e quadrados com o mesmo

    centro e ângulos alternados em 45º
  17. const initial = 10 for (let i = 0; i

    < 20; i += 1) { const side = initial * Math.pow(Math.sqrt(2), i) const angle =(counter % 2) * 45 plotSquare(width/2, height/2, side, angle) counter++ }
  18. const osc = audioContext.createOscillator() const gainOsc = audioContext.createGain() osc.type =

    type const endTime = audioContext.currentTime + 0.5 gainOsc.gain.setValueAtTime(1, audioContext.currentTime) gainOsc.gain.exponentialRampToValueAtTime(0.0001, endTime) osc.frequency.setValueAtTime(freq, audioContext.currentTime) osc.frequency.exponentialRampToValueAtTime(0.0001, endTime)
  19. const node = audioContext.createBufferSource() const { sampleRate } = audioContext

    const buffer = audioContext.createBuffer(1, 4096, sampleRate) const data = buffer.getChannelData(0) const gainOsc = audioContext.createGain() for (var i = 0; i < 4096; i++) { data[i] = Math.random() / 2 }
  20. E os dados de cada cor são arrays como os

    arrays de áudio, podemos usar web audio api para filtrar imagens!
  21. const baseImage = new Image() baseImage.src = 'lena.jpg' baseImage.onload =

    () => { context.drawImage(baseImage, 0, 0, width, height) }
  22. 1. Aumentamos o contraste 2. Filtramos os pontos onde há

    uma mudança brusca (de 255 para 0, no caso) 3. Plotamos os pontos como círculos no SVG 4. Criamos retas entre esses pontos