Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

147
Vistas
Encuentre números mínimos y máximos de Math.sin()

Imagina que hay un péndulo que oscila de -1 a 1:

ingrese la descripción de la imagen aquí

Este péndulo es equivalente a SINE. Imagine también que este péndulo se balancea bastante rápido en un ciclo de actualización de 60 fps.

Este podría ser mi código:

 let angle = 0 function update() { angle += .1 pendulum.angle = Math.sin(angle) requestAnimationFrame(update) } update()

Eso está bien. Lo que quiero es detectar el punto en el que este péndulo está más cerca de -1 o 1. Uno podría pensar que simplemente podría escribir:

 if (pendulum.angle == -1 || pendulum.angle == 1) { console.log('pendulum is at it\'s maximum') }

Sin embargo, no funciona así: si la velocidad del péndulo se movía bastante rápido, ¡puede perder -1 o 1 por completo! Otra solución aparentemente posible es detectar si el péndulo está dentro de cierto rango y, de ser así, lanzar el mensaje:

 if (pendulum.angle < -0.9 || pendulum.angle > 0.9) { console.log('pendulum is at it\'s maximum') }

... Pero, ¿y si la velocidad fuera muy, muy rápida? ¿Qué pasa si se perdió esos rangos?

El ángulo cada vez más grande se restringe a la velocidad de fotogramas del programa, por lo que cuanto más rápido gira, más espacio omite.

Esto lleva a la pregunta: ¿Qué fórmula podría usar para averiguar qué tan grande debería ser el rango, en función de su velocidad?

Cualquier ayuda sería apreciada.

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Calcule el sin del valor actual, así como el de los valores anteriores y posteriores. Si su valor sin está más cerca de -1 o 1 que el de los valores anteriores y posteriores, usted es el más cercano, realice su registro.

 function update() { lastanglemag = Math.abs(Math.sin(angle)); // Get the preadjustment magnitude angle += .1 pendulum.angle = Math.sin(angle) currentanglemag = Math.abs(pendulum.angle) // Get current magnitude // If current magnitude is larger than both neighbors, we're at a maximum if (currentanglemag > lastanglemag && currentanglemag > Math.abs(Math.sin(angle + 0.1))) { console.log("pendulum is at its maximum") } requestAnimationFrame(update) } update()

Las optimizaciones para calcular solo un nuevo sin por update (el del siguiente angle ), almacenar en caché los otros valores, para reducir 2-3 llamadas de sin por update a solo una se dejan como un ejercicio para el lector (no quería introducir cualquier estado persistente adicional y la complejidad asociada, y en la práctica, para cualquier cosa basada en una GUI, el costo de 1-2 cálculos adicionales de sin no tiene sentido; el usuario no puede ver un retraso medido en nanosegundos de todos modos).

about 4 years ago · Juan Pablo Isaza Denunciar

0

Usando que d/dx sin(x) = cos(x), uno podría simplificar la otra respuesta a

 function update() { lastangle_d = Math.cos(angle); // Get the preadjustment derivative angle += .1 pendulum.angle = Math.sin(angle); currentangle_d = Math.cos(angle); // Get current derivative // If signum of current and previous derivatives differ, we've passed a maximum if (Math.sign(lastangle_d) !== Math.sign(currentangle_d)) { console.log("pendulum is at its maximum") } requestAnimationFrame(update); } update();

Si alguien realmente quiere piratear, if (lastangle_d*currentangle_d < 0) también podría hacerlo.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda