A mi parecer, uno de los problemas más completos para mostrar buena parte de los entresijos de Java es el de implementar un applet que represente un reloj analógico. Si echamos un vistazo al código, observaremos que conlleva el conocimiento de múltiples aspectos del lenguaje como: threads, herencia, uso de interfaces, uso de librerías, geometría, captura de parámetros html, ..., y ¡MATEMÁTICAS!. Sí, aunque continuamente nos quejamos de tener que estudiar cosas que luego no tienen utilidad práctica, lo cierto es que a veces es porque sencillamente no se la buscamos. En este caso hay que tirar de lección de trigonometría para entender el código. Veamos la parte crítica de la que hablo:
- El comentario inicial tiene un error: hay que dividir entre 30, no entre 2. Luego veremos el porqué.
- En el siguiente gráfico se representa una aguja del reloj. La aguja sería el radio r, mientras que (x+xcenter, y+ycenter) representa la coordenada del extremo exterior de la aguja dentro de las coordenadas de pantalla y (xcenter, ycenter) es el extremo interior de la aguja que se corresponde con el centro del reloj. Para calcular x hay que aplicar aquello de que el coseno del ángulo alfa es igual al cateto contiguo a alfa (x) dividido entre la hipotenusa (r). Sólo hay que despejar en esa fórmula la variable x. Lo mismo aplicado al cálculo de y: despejamos y en la fórmula que dice que el seno de alfa es igual al cateto opuesto (y) partido por la hipotenusa (r). Esas son las fórmulas que aparecen en el segundo comentario del código donde al ángulo alfa le llama a.
- ¿Pero de dónde sale la fórmula para calcular el ángulo a a partir del número de segundos s del primer comentario? Veamos: 2*pi radianes (una vuelta completa) se corresponden con 60 segundos, o lo que es lo mismo, pi radianes se corresponden con 30 segundos. Luego para transformar segundos en radianes hay que multiplicar los segundos por pi/30. Además, en nuestro esquema, hemos supuesto que el ángulo de 0 radianes está en horizontal, justo en la posición de las 3 horas pero el reloj empieza a contar en la posición de las 12 horas (en vertical), luego hay que girar 90 grados a la izquierda nuestra apreciación; o dicho de otra manera, hay que restar pi/2 radianes al cálculo inicial. Para el caso de los minutos sucede más o menos lo mismo. El cálculo es un poco diferente para la aguja horaria.
- Para las coordenadas horarias fijaros que multiplica primero las horas (h) por 30. En realidad, lo que se intenta es primero calcular cuántos grados (no radianes) hay en h. Como 360 grados son 12 horas, tenemos que a cada hora le corresponden 30 grados. Después sumamos los grados correspondientes a los minutos: como en 360 grados tenemos 720 minutos (60 min * 12 horas), a cada minuto le corresponde medio grado, de ahí que divida m entre 2. Una vez calculados los grados totales correspondientes a las horas y minutos (los segundos son despreciables) hay que pasarlos a radianes multiplicando por pi y dividiendo por 180 (pi radianes es el quivalente a 180 grados). Y finalmente el giro de 90 grados a la izquierda (restar pi/2).
- Pero todavía queda una cuestión final: ¿por qué multiplica el coseno y el seno de a por 45 para los segundos, por 40 para los minutos y por 30 para las horas? La razón es muy sencilla. No nos olvidemos de que el coseno y el seno siempre van a estar entre 0 y 1, pero el reloj no es de radio unidad, es más grande, de 50 puntos. De ahí que multipliquemos para el segundero que es la aguja más larga por 45 (ligeramente por debajo del radio del reloj), para el minutero por 40 (un poco más corto que el segundero) y por 30 para las horas (la aguja más corta).
No hay comentarios:
Publicar un comentario