Tablas Prefefinidas

 
Hardware
Modo 13h
Retrazado Vertical
Primitivas
La Paleta
Pantallas Virtuales
Sprites
Tablas Prefedifinidas
Efectos
Texto
Formatos gráficos
Periféricos
Optimizaciones
Herramientas
Cursos
Links
Foro
Correo Electrónico


¿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. 


Volver


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:
 

#define PI 3.141516

typedef float *t_tabla;

t_tabla seno, coseno;

void GeneraTablas(void)
{
    int ang;

    seno=(float )malloc(360*sizeof(float));
    coseno=(float *)malloc(360*sizeof(float));

    for(ang=0; ang<360; ang++)
    {
        seno[ang]=sin(ang*PI/180);
        coseno[ang]=cos(ang*PI/180);
    }
}

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. 
Luego calculamos los valores de las tablas. En este caso no importa usar las funciones sin y cos, ya que solamente calculamos las tablas una vez en el programa, de preferencia al principio. Las funciones sin y cos usan un argumento en radianes, por lo tanto hay que convertir primero los grados a radianes.
Una vez que hemos calculado las tablas, podemos usarlas en cualquier parte del programa, pero hay recordar que las variables seno y coseno son punteros. Otra cosa a recordar es que las tablas son arreglos, no funciones, por lo tanto tenemos que especificar el parámetro como si fuera un índice, es decir , entre [ ].

Por ejemplo:

seno[45]  devuelve el seno de 45 grados.
coseno[20]  devuelve el coseno de 20 grados.
seno[30.5]  devuelve un error de compilación.
Coseno[-20]  devuelve un error de fuera de rango.

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);
free(coseno);

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]
coseno[angulo*4]

Por ejemplo:

seno[80] = seno de 20 grados
seno[720] = seno de 180 grados
coseno[1] = coseno de 0.25 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. 


Volver


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

Ver ejemplo
 
 

Bajar todo Bajar todo (31.1 Kb)
Volver

Anterior
Página principal
Siguiente
1
Hosted by www.Geocities.ws

1