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]
|