Путем последовательных применений описанной процедуры мы приходим к серии изображений, получающихся из исходного сжатием в 2, 4, 8 и т. д. раз. Размер последнего изображения будет 1 на 1 пиксел. Дальнейшее сжатие проводить бессмысленно.
В результате получается пирамида, где на 0-м (нижнем) уровне находится исходное изображение, а каждый следующий уровень получается из предыдущего сжатием в 2x2 раза.
21 // File Pyramid.h
//
// class ImagePyramid realizes mip-mapping // for a given image
#ifndef __PYRAMID_ #define__PYRAMID_
#include "bmp.h"
#define MAX_LEVELS 10 // maximum # of levels in pyramid
class ImagePyramid {
public:
char * data; RGB * palette; int palSize; int width;
int offs [MAX_LEVELS];
ImagePyramid ( BMPImage *); -ImagePyramid ();
};
int findClosestEntry (int, int, int, RGB *, int); #endif
SI // File Pyramid.cpp
//
// class ImagePyramid realizes mip-mapping // for a given image
#include <alloc.h>
#include <mem.h>
#include <stdlib.h>
#include "pyramid.h"
ImagePyramid :: ImagePyramid ( BMPImage * im )
{
width = im -> width;
Компьютерная графика. Полигональные модели
palSize = 256;
data = (char *) malloc (( 4 * width * width ) / 3 ); palette = new RGB [palSize]; offs[0] =0;
// copy palette
memcpy ( palette, im -> palette, palSize * sizeof ( RGB ));
// copy 0-th layer memcpy ( data, im -> data, width * width );
for (int level = 1, w = width; w > 0; level ++ ) {
char * prev = data + offs [level -1]; char * cur = prev + w*w;
offs [level] = offs [level - 1] + w*w; w /= 2;
for (int i = 0; i < w; i++ ) for (int j = 0; j < w; j++ )
{
int index = 2*i + 2*j*2*w; int r, g, b;
r = ((int)palette [prev [index]].red + (int)palette [prev [index+1]].red + (int)palette [prev [index+2*w]].red + (int)palette [prev [index+2*w+1]].red ) » 2;
g = ((int)palette [prev [index]].green + (int)palette [prev [index+1]].green + (int)palette [prev [index+2*w]].green + (int)palette [prev [index+2*w+1]].green ) » 2;
b = ((int)palette [prev [index]].blue + (int)palette [prev [index+1]].blue + (int)palette [prev [index+2*w]].blue + (int)palette [prev [index+2*w+1]].blue ) » 2*