Изображение можно условно представить в виде массива точек 256х256, у каждой их которых есть своя целая 8-битовая высота и цвет. Изображение замыкается таким образом, что функция высоты точки с координатами (u,v) возвращает одинаковые значения в углах условной сетки точек. Т.е. w(0,0)=w(256,0)=w(0,256)=w(256,256). w(1,1)=w(257,257) и т.д. Координаты поверхности: (u,v) - координаты, описывающие положение на поверхности. Т.о. поверхность может быть задана как функция высоты h=w(u,v). Экранные координаты: (x,y) - координаты точки на экране. Генерация поверхности Поверхность генерируется рекурсивным фрактальным алгоритмом. В данном случае целесообразно воспользоваться разновидностью фракталов, имеющей общее название "плазма". Алгоритм начинает свою работу в точке (0,0) (эквивалентно (256,0), (0,256), (256,256)). Алгоритм основан на рекурсивном вызове процедуры, которая в качестве параметров получает размер и координаты прямоугольного участка поверхности. Во время первого своего вызова она получает координаты и размер всей поверхности. Эта процедура получает высоты точек из углов прямоугольника, полученного в качестве параметра. Затем подсчитывается средняя высота точек, лежащих на одном ребре. Результат с учетом длины ребра "записывается" на поверхность. Высота точки в центре прямоугольника подсчитывается как среднее между высотами четырех вершин и также с учетом длин ребер "записывается" на поверхность. Затем процедура вызывает себя же, разбивая прямоугольник на четыре части. Процесс продолжается до тех пор, пока длина ребра не станет равна двум пикселям. Поверхность получается более реалистичной, если использовать blur-эффект по следующей формуле: w(u,v)=k1*w(u,v)+k2*w(u+3,v-2)+k3*w(u-2,v+4) Коэффициенты k1, k2, k3 подбираются таким образом, чтобы их сумма равнялась 1. Цвет точки выбирается по следующей формуле: Color = A*[ w(u+1,v)-w(u,v) ] + B Коэффициенты А и В подбираются таким образом, чтобы была использована вся палитра цветов. Условно то, что будет на дисплее можно представить так: небо линия горизонта а земля координаты точки а (0,0) ось х направлена вправо, ось у - вниз Предположим, наблюдатель находится в точке с координатами (p,q,r), где (p,q) - это координаты (u,v) поверхности, а r - это высота. Теперь для каждой горизонтальной линии (v=const) будем менять v в пределах от v=q+100 до v=q и выполнять следующие шаги: 1. Получить у-координату из координат на поверхности (p,q,0), т.е. сделать перспективное преобразование наблюдатель r P Земля q v Далее нужно найти точку пересечения линии, соединяющей Р и наблюдателя, с экраном. Данное преобразование перспективы делается по формуле: y = r / (q-v). 2. Нужно подсчитать масштабирующий коэффициент f, от которого зависит кол-во отображаемых пикселей по вертикали - чем дальше v от q, тем он меньше и наоборот. F должно получиться таким, чтобы при его умножении на высоту точки получалось количество пикселей на экране. 3.Выполнить вышеописанные действия для всех u. (v=const) 4.Начиная с посчитанной точки (u,v), пересечь весь экран, увеличивая х-координату и добавляя к u константу с. Т.о. координаты (u+c,v) являются в экранных координатах (1,у) Т.о., чем дальше находится сканируемая линия, тем "левее" будет начинаться отсчет u и тем больше будет с и наоборот.