Index des articles > Programmation > Le zoom - langage C, 68k -

Le zoom - langage C, 68k -

Article posté par Orage

bibliothèque graphique requise : OrageGL

Introduction
Le concept de grossissement est une notion importante dans la programmation, et peut être parfois utile. Nous allons nous interresser ici au concept de zoom le plus simple qui existe. L'algorithme expliqué ici permettra d'afficher en plein écran une zone définie par deux sommets ( x0, y0, x1, y1 ) d'un écran. Bien que simple à programmer, la fonction que nous verrons présente également des inconvégnants, comme sa lenteur par exemple.

Explications
Les coordonnées du rectangle à agrandir définissent deux coefficients de zoom ( verticaux et horizontaux ). On les obtient en divisant la largeur et la hauteur de l'écran, respectivement par la largeur et la hauteur de la zone définie.
On obtient alors :
Zoom_X = LCD_WIDTH / ( x1-x0 )
Zoom_Y = LCD_HEIGHT / ( y1 ? y0 )

Comme nous allons afficher l'image point par point, en plein écran, il nous faut une boucle qui passe chaque pointe de l'écran en revue, en nous interrogeant si le pixel correspondant à chacun de ces points est allumé ou éteint sur l'écran source. Pour ce faire, on appellera (i, j) les variables qui parcoureront l'écran de destination, et on les divisera par le coefficient de zoom, pour obtenir les coordonnées des points correspondants dans la zone réduite.

If(PxlText(i/Zoom_X, j/Zoom_Y, ecran_source))
PxlOn(i, j, ecran_dest);
else
PxlOff(i, j, ecran_dest);

Ce n'est pas tout, car cette fonction partirait du point (0, 0) de l'écran-source. Il faut donc ajouter la position de départ de la selection, soit x0 et y0. On obtient ainsi :

for(i=0 ; i<LCD_WIDTH ; i++)
{
for(j=0 ; j<LCD_HEIGHT ; j++)
{
if(PxlTest(x0 + i/Zoom_X, y0 + j/zoom_Y, ecran_source))
PxlOn(i, j, ecran_dest);
else
PxlOff(i, j, ecran_dest);
}
}

Code
Au final, on code la fonction ci-dessous.

void ZoomBox(short x0, short y0, short x1, short y1, void *origine, void *tampon, void *destination)
{
short i, j;

for(i=0 ; i<LCD_WIDTH ; i++)
{
for(j=0 ; j<LCD_HEIGHT ; j++)
{
if(GL_PxlTest(x0+i/(LCD_WIDTH/(x1-x0)), y0+j/(LCD_HEIGHT/(y1-y0)), origine))
GL_PxlOn(i, j, tampon);
else
GL_PxlOff(i, j, tampon);
}
}

GL_CopyBuffer(tampon, destination, 0, (LCD_HEIGHT-1));

return;
}

Orage

>> Vos commentaires [0]

Pas de commentaires

Poster un commentaire


Seuls les membres peuvent poster des commentaires