|
|
|
¿Qué es un tabla predefinida? Las tablas predefinidas o lookup table, es algo muy simple de entender, y que hará que en nuestros demos o juegos los distintos cálculos y operaciones que tengamos que realizar no nos quiten tiempo y hagan más rápidos nuestros programas. Cuando en nuestras aplicaciones necesitamos realizar numerosos cálculos matemáticos complejos de una forma frecuente, esto puede hacer que el resultado de nuestro demo o juego se ponga muy lento, debido al tiempo que se tardan en realizar estos cálculos. La idea para crear una tabla es sencilla. ¿Y si primero realizamos las operaciones y los resultados los guardamos en una tabla indexada? Luego tendremos solo que tomar los valores de la tabla, cuando nos haga falta para alguna aplicación, y extraer los resultados de esta, previamente calculados. Esto de las tablas precalculadas es vital en la programación 3D, o también para hacer fractales, etc. Creando una tabla precalculada Sabemos que el lenguaje C trae varias funciones trigonométricas, en las que se incluyen la del seno y coseno. Lamentablemente, estas funciones hacen muchas comprobaciones de rangos y algunos cálculos extra, que hacen que su uso sea algo muy lento. Además de que el parámetro que reciben debe ser un ángulo en radianes. Por lo que si quisiéramos usar grados, tendríamos que hacer antes una conversión, y lo que significa más cálculos y más tiempo que esperar. Lo que tenemos que hacer entonces, es generar nuestra propia tabla de valores de las funciones, almacenarla en un arreglo y simplemente usar este arreglo en lugar de las funciones sin() y cos(). Veamos un ejemplo de esto:
Primero definimos una constante para el
valor de Pi. Luego un tipo de datos llamado t_tabla, que es un puntero
a datos de tipo float, para almacenar los números reales que corresponden
a los senos y/o cosenos de ángulos enteros de 0 a 360 grados. Luego
creamos dos variable del tipo t_tabla una para los senos y otra para los
cosenos. Después en el procedimiento GeneraTablas(), reservamos
el espacio en memoria necesario para nuestras tablas con la funcion malloc().
Si intentamos acceder a las tablas antes de reservar el espacio en memoria
podríamos hacer que se trabara la máquina.
Por ejemplo: seno[45] devuelve
el seno de 45 grados.
Antes de que termine un programa que usa
tablas, debemos liberar la memoria que hemos reservado, para que el DOS
la pueda utilizar en otros programas.
Esto la hacemos simplemente usando la función free, de la siguientes forma: free(seno);
Obviamente, después de liberar la memoria de una tabla, ya no la podremos utilizar. Al dibujar un círculo debemos hacer un ciclo de 0 a 360 grados, pero no contando de uno en uno, sino que hay que utilizar incrementos fraccionarios. El problema es que nuestras tablas de senos y cosenos son arreglos, y C no permite que los arreglos tengan índices fraccionarios, por lo que tenemos que hacer un arreglo un poco más grande. Por ejemplo imaginemos que queremos dibujar un círculo con incrementos de 0.25. Para hacer esto en C podríamos hacer lo siguiente: float *tabla; tabla=(float )malloc(1440*sizeof(float)); Notar que: 1440 = 360 / 0.25 = 360 * 4 Esto significa que para calcular el seno o coseno de un ángulo específico, tendremos que usar: seno[angulo*4]
Por ejemplo: seno[80] = seno de 20
grados
Pero lo que nosotros vamos hacer es un ciclo desde 0 hasta 1440, por lo tanto no necesitamos hacer ningún cálculo extra. Ejemplo Ahora podrás ver un ejemplo que hace uso de tablas precalculadas para dibujar circunferencias en la pantalla. Primero se dibujan varias circunferencias concéntricas sin utilizar tablas predefinidas, y luego utilizándolas. Librería gráfica: vgalib.h
|