В случае, когда имело место пересечение с горизонтальной стеной, параметр / переворачивается, если ордината точки пересечения меньше ординаты наблюдателя, для вертикальной стены - если абсцисса точки пересечения меньше абсциссы наблюдателя.
Индекс столбца текстуры определяется по формуле
Компьютерная графика. Полигональные модели
В данном случае достаточно просто произвести побитовый сдвиг; к примеру, если / задано в представлении 16.16, h = 1 , a picWidth = 64 , то
j = (int)(t» 10).
Для осуществления сжатия можно воспользоваться либо алгоритмом Брезен-хейма, либо дробными числами. Последний подход предпочтительнее, так как в большинстве случаев коэффициент сжатия больше единицы и алгоритм Брезенхей-ма приводит к многократным записям в один и тот же пиксел экрана.
Несложно видеть, что подобный подход дает действительно правильное перспективное проектирование текстуры, причем ценой совсем небольших затрат - все необходимые параметры для произведения сжатия можно взять из таблиц.
Модифицированная соответствующим образом программа приведена ниже.
jmj II File wolf4.cpp #include <bios.h> #include <dos.h> #include <math.h> #include <stdio.h> #include <time.h> #include "fixmath.h" #include "bmp.h"
#define VIEW_WIDTH (M_.PI / 3) // viewing angle ( 60 degrees )
#define SCREEN_WIDTH 320 // size of rendering window
#define SCREEN_HEIGHT 200 //basic colors
#define FLOOR_COLOR 140
#define CEILING_COLOR 3 // bios key defrntions
#define ESC 0x011b
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00 //labyrinth
char * worldMap [] =
{
и****************************************************и
I
h* * *»
I
I* ********* ************************** *
i
ii* * *и
I
и* ********* * ************************ *n
I
II* * *n
I
II* ********* ************************** *ll II* * *>
11************************^****************************11