cur [i+j*w] = findClosestEntry (r, g, b, palette,
palSize );
}
}
}
ImagePyramid :: HmagePyramid () {
free (data ); delete palette;
}
int findClosestEntry (int r, int g, int b, RGB * palette, int palSize ) {
int minDist = 1024; int index;
for (int i = 0; i < palSize; i++ ) {
int d = abs (r - palette [i].red) + abs (g - palette [i],green) +

13. Элементы виртуальной реальности

abs ( b - palette [i].blue ); if ( d < minDist )
{
minDist = d; index = i;
}
. }
return index;
}

Рассмотрим применение пирамид для текстурирования.

Предположим, что нужно найти пиксел из изображения, соответствующего сжатию в к раз. Если к больше размера изображения, то возьмем пиксел с изображения в вершине пирамиды - размером 1 на 1 пиксел. В противном случае возьмем пиксел с такого уровня /, что 2/ < к < 21+* .

Полученный пиксел соответствует усреднению исходной текстуры в 2^2^раз.

Ниже приводится модификация программы текстурирования горизонтальной плоскости с использованием пирамидального фильтрования. Сразу бросается в глаза отсутствие случайных точек вблизи линии горизонта.

При этом для хранения всей пирамиды требуется всего на 1/3 больше памяти, чем для хранения только исходного изображения.

Ы\ II File Floor3.cpp //

// Drawing textured floor
//with pyramid filtering (mip-mapping)
#include <alloc.h>
#include <bios.h>
#include <dos.h>
#include <math.h>
#include <mem.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "bmp.h"
#include "pyramid.h"
#include "fixmath.h"
#define ESC 0x011b
#define UP 0x4800
#define . DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define SCREEN_HEIGHT 200 #define SCREEN_WIDTH 320
#define H (100*2561)
#define DELTA 1.0 //note : DELTA * NumLines == H

#define С 0.01

#define DO Ю0.0

Компьютерная графика. Полигональные модели

#define MAKELONG(high, low) (((long)low) | (((long)high)«16))
BMPImage * pic = new BMPImage ("FLOOR.BMP" );

⇐ Предыдущая| |Следующая ⇒