2do paso: poner el reloj en hora (parte I)

En el paso anterior nos dedicamos a programar la simulación del mecanismo sincrónico asociado a un reloj analógico. Los resultados fueron más que satisfactorios, y fácilmente perfectibles en caso de que nos hubiésemos ocupado de ajustar levemente la base de tiempo (tema que cedo a la incursión de algún programador inquieto).
Nos debemos ocupar ahora de la posibilidad de dar el ajuste horario que debe estar presente en todo reloj.
¿Cómo poner el reloj en hora?… that is the question, Hamlet.
En este Tutorial propondremos dos disímiles acercamientos a la solución —uno lo trataremos en este 2do paso, otro en el paso 3ro—, aunque tendrán en común una primera etapa de análisis del problema —algo que comenzaremos en sólo un momento—

Secuencia de trabajo

Demos —como siempre al empezar cada nuevo paso— un resumen de la secuencia de trabajo que tendremos por delante, tomá nota:
  • Discurrir sobre el proceso de puesta en hora, de lo que ello implica para un reloj analógico, y dar un grupo de metas iniciales que deberá cumplir nuestro proyecto de simulación en este 2do paso.
  • Efectuar un primer análisis de las metas, del que se concluirá el hecho de que los cambios afectarán fundamentalmente a las condiciones iniciales de dirección de 2 de las agujas, pero el comportamiento dinámico del reloj que ya conseguimos no se verá mayormente alterado.
  • Estudiar —desde un punto de vista matemático— cuál será la relación entre los valores horarios determinados por el usuario en el proceso de ajuste de la hora, y la posición inicial que deberán tomar las agujas minutero y horario. Explicitar las fórmulas que expresen este vínculo.
  • Poner de manifiesto la ventaja de pensar el proyecto como la composición de 2 etapas comunicadas entre si a través de un mensaje.
  • Comenzar un nuevo proyecto tomando como base el que fue realizado en el 1er paso, del que heredará los objetos y la programación previa (remixado de un proyecto propio). Guardarlo como scratch watch 2.
  • Crear un nuevo objeto llamado botón a partir de las imágenes proporcionadas en este mismo tutorial. Crear las primeras líneas de programa que le den condiciones iniciales y fundamentalmente la capacidad de envío de un mensaje (START) cuando sea pulsado.
  • Reformular el script original del segundero, subdividiéndolo de manera de que se manifieste una etapa de condiciones iniciales, y otra donde se ejecute el generador de pulsos —ahora será arrancado al recibir START—.
  • Crear 2 nuevas variables MINUTO y HORA; a través del uso de sus monitores en opción deslizador el usuario determinará los valores de ajuste de hora que decida. Determinar los valores mín y max que puedan tomar.
  • Reprogramar los scripts del minutero y el horario. El posicionamiento angular de las agujas deberá responder a un nuevo script que se accione al ser recibido el mensaje START . El valor de dicho posicionamiento se calculará usando bloques que incluyan operadores matemáticos; ellos permitirán aprovechar las fórmulas obtenidas en el análisis matemático realizado con antelación.
  • Terminar de programar al objeto botón para cumplir parcialmente con las metas propuestas (se desechará la meta del ocultamiento de los monitores, explicación mediante). Con esto se concluirá el primer proyecto relacionado a este 2do paso.
  • Proponer un remixado del proyecto obtenido, buscando llevar un paso más allá el modo en como se visualizará la etapa de puesta en hora. La meta será proporcionar movimiento de giro a las agujas tratando de que acompañen los valores de HORA y MINUTO que va definiendo el usuario.
  • Analizar de que maneras puede conseguirse la meta anterior sin afectar la segunda etapa. Proponer un mecanismo de detención de los bucles de update que sense la posición del segundero como indicio de que el usuario ha puesto el reloj en funcionamiento.
  • Finalizar esta segunda propuesta de resolución guardándola con el nombre scratch watch evolution 1.
  • Tomar nota de otras posibles mejoras al proyecto, y de las complejidades añadidas que esto implica.
Creo que para resumen quedó muy largo... adelante que es menos trabajo de el que parece.

¿Qué significa poner un reloj en hora?

Aclaremos en principio que no hay finalidad metafísica alguna en la pregunta.
La voy a reescribir: ¿a qué llamamos poner en hora un reloj? Digamos que consiste en el intento de sincronizar el funcionamiento de nuestra "maquinaria" con el del patrón universal de tiempo, adecuándolo al correspondiente huso horario en que nos encontremos. En la práctica: fijarnos en la hora que muestra alguna emisora de TV (o en la que muestra nuestra computadora), o quizá esperar los pitidos de "la hora oficial" en alguna radioemisora, y disponer entonces las agujas de nuestro reloj analógico de manera que se corresponda con esta información.
Simplificando: poner en hora es hacer que las agujitas apunten en una determinada dirección, de acuerdo a ciertas convenciones que se establecen en un reloj analógico para que la hora pueda ser leída sin ambigüedad.
No todos los relojes analógicos "reales" responden de igual manera al momento de ser ajustada su hora: algunos detienen su funcionamiento, otros no. Y casi ninguno permite ajustar al segundero. Ergo: deberemos dar nuestras propias metas a cumplir en el 2do paso del Tutorial respecto a esta cuestión:

METAS A CUMPLIR EN ESTE 2do PASO DEL TUTORIAL

  • El proceso de ajuste de la hora se efectuará sólo al comenzar el programa.
  • En todos los casos el segundero comenzará su funcionamiento en cero (o sea, apuntando en la dirección 0º).
  • Tanto el minutero como el horario serán puestos en hora usando los monitores de 2 variables en su modo deslizador (algo similar a lo usado al final del 1er paso).
  • Una vez definidos los valores horarios, el arranque del reloj recién se producirá al ser cliqueado un nuevo objeto a ser incorporado al proyecto. Utilizando al mismo deberemos también procurar un modo de informarle al usuario de esta funcionalidad (lo que debe ocurrir al inicio mismo del programa).
  • Tanto el objeto recién incorporado como los monitores deben dejar de ser visibles al comenzar el funcionamiento del reloj.
Haciendo un rápido análisis de las metas, una de las primeras conclusiones a extraer es que el proceso de puesta en hora sólo va a afectar las condiciones iniciales en dos de las tres agujas respecto de lo que habíamos trabajado en el paso previo —para ser más específico, lo que deberá cambiar es la dirección inicial para el minutero y el horario—.
El comportamiento dinámico del mecanismo no sufrirá ninguna alteración (aunque sí tendremos que hacer cambios sobre los scripts de los 3 objetos).
Se impone entonces la necesidad de analizar cuál será la relación entre los valores horarios determinados por el usuario y la posición inicial que tomarán nuestras agujas… ¡de nuevo terminaremos cayendo en las garras de las matemáticas, qué se va a hacer!

GRRRRRR... —onomatopeya—

Enfoquémonos en el problema. El usuario en su accionar va a definir dos valores numéricos: uno para la hora y otro para el minuto. Nuestro trabajo por delante es analizar como van a afectar estos valores a las condiciones iniciales (dirección) de las dos agujas involucradas.
Desde ya que estamos ante un problema que involucra factores variables: no sabemos cuál será el ajuste de la hora que determinará el usuario, por lo que deberemos establecer algún tipo de función que vincule a los valores ingresados con los ángulos iniciales del minutero y del horario.
Será otra vez una situación donde existen variables independientes (los datos HORA y MINUTO que determina el usuario) y variables dependientes (los 2 ángulos iniciales antes citados) [hablamos ya sobre variables independientes y dependientes en esta página del Tutorial 2].
Problema enfocado. Empecemos.

Apuntemos al minutero

Y empezamos por lo fácil. ¿En qué dirección deberá apuntar el minutero si el usuario decide un valor de MINUTO minutos? —no está de más aclarar que MINUTO será algún valor numérico entero entre 0 y 59—.
La evidencia empírica (¡corre ya y vé a mirar un reloj real !), más algo de lo trabajado en el paso anterior, nos permitirá construir una tabla con sólo algunos valores entre los 60 posibles (¿para qué todos?).
La relación que puede inducirse desde los 2 juegos de valores de la misma nos llevará al mismo resultado (menos mal…) que el que obtendríamos de seguir un camino más analítico como éste: si a un minutero le insume 60 minutos en dar un giro completo al cuadrante, y un giro completo equivale a 360º, cada nuevo minuto debe agregar 6º al ángulo de dirección que tenía previamente esta aguja, por lo que si al minuto 0 (cero) le corresponde un ángulo de 0º la fórmula que buscamos será:
ángulo=minuto x 6

Ninguna novedad: es un razonamiento similar al que tuvimos que seguir en el paso anterior al momento de determinar cuánto debía girar la aguja del minutero al recibir el mensaje pasó un minuto.

Ya veremos como afecta esto a nuestro script del minutero en la página siguiente, pero ahora sigamos pensando…

Apuntemos a la aguja horaria

Y seguimos con lo difícil (bueh… no tanto). ¿En qué dirección deberá apuntar el horario si el usuario decide ajustar el reloj a un valor de HORAhoras y MINUTOminutos? —aclaremos ya que HORA será algún valor numérico entero entre 1 y 12 (hablar de 0 horas es más de relojes digitales)—.
En este caso la construcción empírica de una tabla de valores angulares para esta agujita (suponiendo que su posición se actualiza 1 vez por minuto) no será evidente salvo para aquellas ocurrencias de horas en punto (donde MINUTO vale cero). Después… la cosa se complica, pero resulta claro que existe una dependencia respecto de ambas variables independientes —HORA y MINUTO—.
¿Porqué es esto? Porque en los relojes "reales" la aguja horaria se vá moviendo durante el transcurso de los minutos; de esta manera quién mire la hora tendrá a un "golpe de ojo" una estimación de la misma (si faltan 5 minutos para las 10 es mucho más claro que esta aguja esté casi en las 10).
Para lograr este comportamiento en nuestro proyecto propusimos que los saltos angulares ocurran cada minuto, y como en 60 minutos la aguja horaria debe avanzar 30º el valor de cada salto debe ser de 30º/60 = 0.5º ¿capisce?
HORA MINUTO ángulo
12 0
1 0 30º
3 0 90º
6 0 180º
10 0 300º
1 30 45º
4 30 135º
9 30 285º
11 30 345º
1 20 40º
5 50 175º
8 40 260º
9 55 297.5º
12 5 2.5º
Llegar a alguna fórmula que resuelva el problema requerirá de algún mínimo análisis: a mí se me ocurrieron dos (que llegan a un mismo resultado, por supuesto).
Análisis uno 
En el movimiento de la aguja intervienen 2 factores: el valor de HORA y el de MINUTO. La componente de giro dependiente de HORA hará que la aguja se mueva 30º por HORA, por lo que el primer componente de la fórmula que buscamos puede calcularse como ángulo1 = HORA x 30º.
Por otro lado la componente de giro dependiente de MINUTO hace que la aguja se mueva 0.5º por MINUTO, y su contribución a la fórmula final será ángulo2 = MINUTO x 0.5º.
Sólo nos resta sumar (resta sumar suena raro) ambas contribuciones para arribar a la fórmula tan deseada —la que ya estás viendo¿convencid@?
ángulo=hora x 30 + minuto x 0.5
¿NO? ¿Aunque funcione? Bueno, aquí va otro posible análisis…
Análisis dos 
Pensamiento lateral. Si la aguja horaria apunta a 0º a las doce en punto, y se desplaza 0.5º por minuto ¿en que dirección apuntaría después de haber transcurrido una cantidad de tiempo igual a la indicada en el proceso de ajuste de hora del reloj? ("¿me lo podría repetir…?").
Necesitamos sólo saber a cuántos minutos equivale dicha hora indicada, lo que nos deja a un paso de la respuesta al problema —que está ante tus ojos
ángulo=(hora x 60 + minuto) x 0.5
Si sos un viejo lector de los mis tutoriales ya sabrás de mis dotes para-sensoriales… puedo leer tu mente, y no voy a ir más allá de recordarte que existe algo así como "la propiedad distributiva del producto respecto de la suma". Nada más.

Seconds out

Segundos afuera: dada las metas impuestas no deberemos hacer ningún análisis sobre la dirección inicial del segundero ya que se le impondrá un valor cero. Segundos afuera: tañido de campana, llegó el momento de que la matemática salga del ring y pasemos a pelear con los contendientes/protagonistas del proyecto. Seconds Out: una buena muestra de porqué no hay Genesis sin Peter Gabriel en la banda… (con menos de 40 años no vas a entender).
Quiero decir: en la página siguiente volveremos a trabajar con nuestro relojito, esta vez enarbolando un nuevo puñado de (matemáticas) verdadesSee you soon!
Última actualización: Marzo 2, 2014

No hay comentarios.:

Publicar un comentario

© Scratch CodeLab | D153ñ0 b454d0 3n l4 pl4n71ll4 SimpleRWD d3 Oloblogger