Разработка программы, реализующей алгоритм, который использует z-буфер

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    558,08 Кб
  • Опубликовано:
    2015-06-07
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Разработка программы, реализующей алгоритм, который использует z-буфер

МИНИСТЕРСТВО ТРАНСПОРТА РФ

ГОСУДАРСТВЕННАЯ СЛУЖБА ГРАЖДАНСКОЙ АВИАЦИИ

МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ГРАЖДАНСКОЙ АВИАЦИИ

Кафедра вычислительных машин, комплексов, систем и сетей






Курсовая работа

по дисциплине

"Компьютерная графика"












Москва - 2014

1. Содержание

 

1. Техническое задание

2. Возможности программы

3. Аналитическое описание программной реализации

3.1 Геометрическая модель графических объектов

3.1.1 Геометрическая модель куба

3.1.2 Геометрическая модель усеченной пирамиды

3.2 Видовое преобразование

3.3 Проецирование

3.4 Элементарные геометрические преобразования в пространстве

3.4.1 Перенос

3.4.2 Поворот

3.5 Вращение вокруг произвольного вектора

3.6 Удаление невидимых линий и граней объекта

4. Структура программы

5. Алгоритмы основных функций программы

5.1 Voidvid_pr_kubik (inti), voidvid_pr_piramida (inti), voidvid_pr_vectora (inti)

5.2 Void proec_kubik (int i), void proec_piramida (int i), void proec_vectora (int i)

5.3 Void init_piramida (),void init_kubik ()

5.4 Voiddarw_piramida (),voiddraw_kubik (),draw_vector (), void draw_kubik2 (), void draw_piramida2 (), void draw_kubik3 (), void draw_piramida3 ()

5.5 Voidpovorot_x_kubik (),voidpovorot_y_piramida (),voidpovorot_z_kubik (), voidpovorot_x_piramida (), voidpovorot_y_piramida (), voidpovorot_z_piramida ()

5.6 Void perenos_kubik (int a, int b, int c), void perenos_piramida (int a, int b, int c)

5.7 Void z_buffer (), void z_buffer2 ()

5.9 Voidrotate_vector_piramida (floatalfa)

5.10 Прочие функции

6. Руководство пользователя

6.1 Основные файлы программы

6.2 Запуск программы

6.3 Пункты главного меню

6.4 Горячие клавиши

Литература

Приложения

1. Техническое задание

Разработать программу реализующую алгоритм использующий z-буфер.

Объекты: усеченная пирамида и куб.

Вид проецирования: параллельное ортографическое.

В программе следует также реализовать следующие модели: каркасная и закрашенная. Реализовать вращение усеченной пирамиды вокруг произвольно задаваемого вектора.

2. Возможности программы


В ходе выполнения курсовой работы была разработана программа, имеющая следующий функционал:

§  Отображение геометрических тел (куб и усеченная пирамида) в 3 вариантах: каркасная модель, каркасная модель с удалением невидимых линий и закрашенная модель

§  Перемещение куба горячими клавишами и прямое задание его координат

§  Поворот усеченной пирамиды вокруг произвольно задаваемого вектора.

§  Отображение вектора вращения

§  Работа программы осуществляется на основе алгоритма использующего Z-буфер.

§  Модели объектов и вектор заносятся в буферы кадра и z-буфер.

§  Управление камерой при помощи горячих клавиш и задание параметров напрямую

3. Аналитическое описание программной реализации

 

3.1 Геометрическая модель графических объектов


3.1.1 Геометрическая модель куба

Для описания геометрической модели куба нам понадобится:

§  Массивы вершин куба xw_kubik [8],yw_kubik [8],zw_kubik [8] - хранит координаты вершин куба;

§  Массив ребер куба MR_kubik [12] [2] - хранит номера вершин начала и конца ребра;

§  Массив граней по ребрам куба mgr_kubik [6] [4] - хранит номера ребер составляющих грань;

§  Массив граней по вершинам mgv_kubik [6] [4] - хранит номера вершин составляющих грань;

Геометрическая модель куба используемая в программе приведена на рисунке 1.

Рисунок 1. Геометрическая модель куба.

 

3.1.2 Геометрическая модель усеченной пирамиды

Для описания геометрической модели призмы, как было описано ранее для куба будут использоваться следующие массивы:

§  Массивы вершин xw_piramida [N*2],yw_piramida [N*2],zw_piramida [N*2] - хранит координаты вершин усеченной пирамиды;

§  Массив ребер MRV [Nr*3] [2] - хранит номера вершин начала и конца ребра;

§  Массив граней по ребрам mgr_piramida [N+2] [N] - хранит номера ребер составляющих грань;

§  Массив граней по вершинам mgv_piramida [N+2] [3] - хранит номера вершин составляющих грань;

Дополнительные переменные и массивы сходны с описанными в кубе.

В данной курсовой работе усеченная пирамида задается динамически, то есть количество граней в ней может задаваться пользователем. В этом случае использовать статическое задание координат вершин невозможно. Для расчета координат вершин воспользуемся следующими формулами:

§  Из того, что расположена в начале мировой СК следует, что координата yw_piramidaбудет принимать только 2 значения: H/2 для верхнего основания и - H/2 для нижнего основания

§  Поскольку в основании лежит правильный многоугольник, все углы основания равны. Найти их легко l=360/Nгде Nкол-во граней.

Если в основании усеченной пирамиды правильный многогранник, его можно вписать в окружность. (рисунок 2)

Рисунок 2. Расчет координат вершин

Следуя из этого мы можем найти значения Xи Z:

§  Координата xw_piramidaможет быть найдена из выражения x=R*cos (l)

§  Координата zw_piramidaнаходится подобным образом z=R*sin (l)

Общая геометрическая модель, для 4-гранной усеченной пирамиды имeет вид представленный на

Рисунке 3.

Рисунок 3. Геометрическая модель 4-гранной усеченной пирамиды

 

.2 Видовое преобразование


Исходное описание объекта осуществляется в абстрактной трехмерной системе координат, т. е в мировой системе координат. В этом случае не учитывается наблюдатель, его положение и угол обзора. Исправить это можно использую видовое преобразования, для перехода в видовую систему координат, т.е. систему координат центром которой является наблюдатель.

В общем виде видовое преобразование выглядит следующим образом:

[Xe Ye Ze 1] = [Xw Yw Zw 1] x V,

где V - матрица видового преобразования.


 - угол между осью Zи вектором наблюдения,  - угол между вектором наблюдения и его проекцией на ось XY,  - расстояние от точки наблюдения до начала мировой СК. В результате видового преобразования мы получаем видовые координаты объекта, однако мы остаёмся в трехмерных координатах, а монитор компьютера имеет только две координаты. Для того чтобы перейти от n-мерного пространства к пространство меньше nнадо выполнить операцию проецирования. В нашем случае мы переходим и 3-мерного в 2-мерное пространство.

 

3.3 Проецирование


Как сказано выше проецирование позволит нам перейти от видовых координат объекта непосредственно к экранным координатам.

В данной курсовой работе будет использовано параллельное ортографическое проецирование на плоскость параллельную координатной плоскости XY. Матрица этого ортографического проецирования выглядит так:

Mxy=

В этом случае выражение для получения экранных координат примет следующий вид:

X=Xe

Y=Ye

 

3.4 Элементарные геометрические преобразования в пространстве


Элементарные преобразования которые были использованы в разработанной программе описаны ниже.

 

3.4.1 Перенос

Данное преобразование переносит точку на заданное расстояние вдоль координатных осей X,Y,Z.

Реализация этого преобразования имеет следующий вид:


 - константа переноса вдоль оси X

 - константа переноса вдоль оси Y

 - константа переноса вдоль оси Z

Или в виде системы:



3.4.2 Поворот

Данное преобразование осуществляет поворот точки на определенный угол вокруг одной из координатных осей. Реализация для поворота на угол  будет иметь вид:

§  Поворот вокруг оси Z


В виде системы:


§  Поворот вокруг оси X


В виде системы:


§  Поворот вокруг оси Y


В виде системы:


3.5 Вращение вокруг произвольного вектора


Вращение вокруг произвольного вектора не относится к элементарным геометрическим преобразованием, потому что реализуется через их последовательное выполнение.

Для того чтобы повернуть точку вокруг произвольного вектора на угол  надо выполнить следующие преобразования:

1.      Перенос системы координат в начальную точку вектора.

2.      Поворот вокруг оси Z на угол

.        Поворот вокруг оси Yна угол

.        Поворот вокруг оси Zна угол

.        Поворот вокруг оси Y обратно на угол

.        Поворот вокруг оси Z обратно на угол

.        Перенос системы координат в прежнее положение.

Запишем это выражением:


Расчет результирующей матрицы в программе Mathcad 15 представлен ниже.

 

3.6 Удаление невидимых линий и граней объекта


В данной курсовой работе для удаления невидимых линий и граней используется алгоритм использующий Z-буфер.

Это один из простейших алгоритмов, предоставляющий при этом удаление невидимых поверхностей. Суть алгоритма заключается в наличии в программе двух буферов: буфер кадра и z-буфер. В первом хранятся значения цвета пикселя имеющего координаты (x,y).

В z-буфере хранятся z координаты каждого пикселя тела. Преимущество алгоритма - ео простота. Из минусов стоит отметить большие объемы памяти требующейся для хранения буферов и программная реализация, из-за частого обращения к памяти и потребности каждый раз попиксельно выводить кадр на экран, работает достаточно медленно. Однако существует ряд улучшенных методов работы с буфером (например деление экрана на области и отдельной их обработки), которые ускоряют работу его программной реализации.

Формальное описание этого алгоритма можно свести к следующей последовательность шагов:

. Заполнить буфер кадра значениями цвета фона.

. Заполнить z-буфер максимальными значениями (или очень большими числами которые не могут появиться при работе программы0

. Разложить все многоугольники в раст.

.1 Для каждого пиксела (x,y) рассчитать координату z (x,y)

.2 Если z (x,y) меньше значения занесённого в z-буфер по этим координатам следует занести полученное значение в z-буфер и занести значение цвета в буфер кадра по координатам (x,y).

.3 Если z (x,y) больше значения занесенного в z-буфер по этим координатам ранее никаких действий не производится.

. Отобразить буфер кадра на экран.

4. Структура программы


Структура программы представлена на рисунке 5.

Рисунок 4. Структура программы.

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

Таблица 1. Глобальные переменные программы

Имя переменной

Тип

Назначение

xw _kubik, yw _kubik,zw_kubik

float

Координаты куба в мировой СК

xw _piramida, yw _piramida, zw_piramida

float

Координаты усеченной пирамиды в мировой СК

xe _kubik, ye _kubik,ze _kubik

float

Координаты куба в видовой СК

xe _piramida, ye _piramida, ze_piramida

float

Координаты усеченной пирамиды в видовой СК

x_kubik,y_kubik

int

Экранные координаты куба

x_piramida, y_piramida

int

Экранные координаты усеченной пирамиды

MR_kubik, MR_piramida

int

Списки ребер куба и усеченной пирамиды

mgr_kubik, mgr_piramida

int

Списки граней по ребрам куба и усеченной пирамиды

mgv_kubik, mgv_piramida

int

Список граней по вершинам куба и усеченной пирамиды

VK,VP

int

Признак видимости граней и ребер куба

buf_kadr

int

Буфер кадра

z_buf

float

Z-буфер

N

int

Число граней усеченной пирамиды

h_kubik

int

Длина ребра куба

R1, R2

int

Радиусы окружностей, в которые вписаны основания усеченной пирамиды

H

int

Высота усеченной пирамиды

xl,yl

float

Смещение относительно 0

fi,te

float

Сферические кооринаты точки наблюдения. Отклонение от осей Zи X

al

float

Угол поворота вокруг осей X,Y,Z

Таблица 2. Пользовательские функции.

Имя

Назначение

main ()

Главная функция

Init_kubik (), init_piramida ()

Функции инициализации: куб, усеченная пирамида

Vvod_dannyh ()

Ввод данных по объектам

Draw_kubik (),draw_piramida (),draw_vector () draw_kubik2 (),draw_kubik3 (), draw_piramida2 (),draw_piramida3 (),

Рисование куба и усеченной пирамиды и вектора

Zapolnenie_kubik (),Zapolnenie_piramida ()

Закраска куба и усеченной пирамиды

vvod_D (),vvod_A (),vvod_W (),vvod_S (), vvod_Q (),vvod_E (),vvod_O (),vvod_P (), vvod_K (),vvod_L (),vvod_N (),vvod_M () vvod_R ()

Нажатие горячих клавиш

rotate_vector_piramida ()

Вращение усеченной пирамиды вокруг произвольного вектора

povorot_x_kubik (),povorot_y_kubik (), povorot_z_kubik () povorot_x_piramida (),povorot_y_piramida (), povorot_z_piramida ()

Вращения куба и призмы вокруг координатных осей

perenos_kubik (),perenos_piramida ()

Перенос куба и усеченной пирамиды

z_buffer (),z_buffer2 ()

Вычисление значения координаты z

menu (),menu1 (), menucamera (), vvod (),selectmodel (),knopki () vyvod_dannyh (),ramka (),vvod_vector ()

Подменю

osi ()

Рисование координатных осей на экран

Vid_pr_kubik (),vid_pr_piramida (), vid_pr_vectora ()

Видовое преобразование куба, усеченной пирамиды и вектора.

Proec_kubik (),proec_piramida (), proec_vectora ()

Проецирование куба, усеченной пирамиды и вектора.

 


5. Алгоритмы основных функций программы


5.1 Voidvid_pr_kubik (inti), voidvid_pr_piramida (inti), voidvid_pr_vectora (inti)


1.      Данные функции предназначаются для преобразования мировых координат вершин в видовые координаты.

2.      Входным параметром функцииявляется номер вершины

.        Результатом выполнения функции является значение видовых координат вершины, занесенное в соответствующий массив

.        Последовательность видового преобразования подробно рассмотрено на стр.8.

.        Листинг программы страница -

 

5.2 Void proec_kubik (int i), void proec_piramida (int i), void proec_vectora (int i)


1.      Данные функции предназначаются для преобразования видовых координат вершины в экранные координаты.

2.      Входным параметром функцииявляется номер вершины

.        Результатом выполнения функции является значение экранных координат вершины, занесенное в соответствующий массив

.        Последовательность проецирования подробно рассмотрено на стр.8.

.        Листинг программы страница -

 


5.3 Void init_piramida (),void init_kubik ()


1.      Данные функции предназначены для первичной инициализации усеченной пирамиды/куба, т.е. заданию положения опорных точек в мировой СК.

2.      Функция использует переменную, хранящую количества граней

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

.        Блок-схема алгоритма функции представлена на рисунке 5.

.        Листинг программы на странице -

Рисунок 5. Алгоритм функции init_piramida ().

5.4 Voiddarw_piramida (),voiddraw_kubik (),draw_vector (), void draw_kubik2 (), void draw_piramida2 (), void draw_kubik3 (), void draw_piramida3 ()


1.      Предназначены для рисования усеченной пирамиды, куба и вектора в буфер кадра и заполнения z-буфера значениями глубины точек пирамиды

2.      На входе функции мировые координаты опорных точек фигуры.

.        Результатом работы функции является заполненный буфер кадра и z-буфер

.        Блок-схема алгоритма функции представлена на рисунке 6.

.        Листинг программы на странице -

Рисунок 6. Алгоритм функции draw_piramida ().

Рисунок 7.

5.5 Voidpovorot_x_kubik (),voidpovorot_y_piramida (),voidpovorot_z_kubik (), voidpovorot_x_piramida (), voidpovorot_y_piramida (), voidpovorot_z_piramida ()


1.      Данные функции предназначены для преобразования координат объекта через матрицу поворота вокруг одной из координатных осей

2.      На входе функции мировые координаты опорных точек фигуры.

.        Результатом работы функции является преобразованные мировые и угол поворота координаты

.        Последовательность поворота рассмотрена на стр.9, поэтому не требует иллюстрации.

.        Листинг программы на странице -

 

5.6 Void perenos_kubik (int a, int b, int c), void perenos_piramida (int a, int b, int c)


1.      Данные функции предназначены для изменения положения фигуры на заданные величины.

2.      На входе функции величины a, b, c, на которые изменяется положение по осям X, Y, Z соответственно.

.        Функция возвращает измененные мировые координаты вершин.

.        Алгоритм данной функции линеен и не требует иллюстрации.

.        Листинг программы на странице -

 

5.7 Void z_buffer (), void z_buffer2 ()


1.      Предназначены для рисования buf_kadrв закрашенной модели и модели с удалением невидимых линий.

2.      В зависимости от того какая выбрана модель, происходит рисование тел.

.        Результатом работы функции является нарисованная область буфера кадра.

.        Алгоритм данной функции линеен и не требует иллюстрации.

.        Листинг программы на странице -

 

.8 Voidzapolnenie_kubik (intcolor),zapolnenie_piramida (intcolor)


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

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

.        Результатом работы функции является заполненный буфер кадра и z-буфер.

.        Алгоритм данной функции основывается на алгоритме построчного сканирования. Для удаления невидимых линей и поверхностей применен алгоритм, использующий z-буфер. Алгоритм представлен на рисунке 8.

.        Листинг программы на странице -

 

5.9 Voidrotate_vector_piramida (floatalfa)


6.      Предназначены для закраски усеченной пирамиды, куба и отображения закрашенной фигуры в кадр.

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

.        Результатом работы функции является заполненный буфер кадра и z-буфер.

.        Алгоритм данной функции основывается на алгоритме построчного сканирования. Для удаления невидимых линей и поверхностей применен алгоритм, использующий z-буфер. Алгоритм представлен на рисунке 8.

.        Листинг программы на странице -

 

5.10 Прочие функции


Ввиду линейности и простоты не были описаны следующие функции:

§  Menu () - функция отображения титульного листа курсовой работы

§  Menu1 () - основное меню программы

§  Vvod () - подменю ввода параметров фигур

§  Menucamera () - подменю ввода параметров камеры

§  Selectmodel () - функция установки модели отображения фигур

§  Osi () - функция рисования координатных осей

§  Knopki () - функция рисования кнопок

§  Vyvod_dannyh () - функция вывода заданных параметров на экран

§  Ramka () - функция рисования рамок для оформления интерфейса

§  Vvod_D (),Vvod_A (),Vvod_W (),Vvod_S (),Vvod_Q (),Vvod_E (),Vvod_R (),Vvod_O (),Vvod_P (),Vvod_K (),Vvod_L (),Vvod_N (),Vvod_M () - функции работы с горячими клавишами

Рисунок 8 Алгоритм функции zapolnenie_piramida ().

 


6. Руководство пользователя


6.1 Основные файлы программы


Данная программа требует для запуска следующие файлы:

§  YsPir&kub. exe - основной исполняемый файл

§  EGAVGA. BGI - подключаемый файл, работа без данного файла невозможна.

 

6.2 Запуск программы


Внимание, запуск программы на системах WindowvVistaи Windows7 невозможен. Для запуска программы на данных ОС следует предварительно установить программу DosBox. Для запуска программы надо запустить исполняемый файл Yspir&kub. exe. После запуска на экране появится сообщение о старте программы и нажав любую клавишу вы окажетесь в главном меню.

 

6.3 Пункты главного меню


Главное меню содержит следующие пункты:

§  Vvodparametrovobjektov - переход в подменю ввода параметров куба и усеченной пирамиды.

§  Vvod parametrov kamery - подменю задания параметров камеры.

§  Vvodparametrovvektorov - подменю задания параметров вектора.

§  Vybormodeliizobrazheniya - выбор модели отображения объектов 1 - каркасная, 2 - с закраской, 3-с удалением невидимых линий.

§  Zapusknavypolnenie - выполнение программы.

§  Vyhodizprogrammy - выход из программы.

6.4 Горячие клавиши


Горячие клавиши работают после первого запуска на выполнение. На экране отображаются кнопки с символом, который следует нажать для срабатывания горячей клавиши. Для возврата обратно используйте клавишу Esc. Горячие клавиши для изменения положения куба: D, A, W, S, Q, E. Горячие клавиши для измененияпараметров камеры: O, P, K, L, N, M. Горячая клавиша R для вращения усеченной пирамиды.

алгоритм буфер программа пользователь

Литература


1. Федотова Т.Н. Пособие по выполнению лабораторных работ по дисциплине "Компьютерная графика". M: МГТУГА 2002.

. Федотова Т.Н. Конспект лекций по дисциплине "Компьютерная графика"

. Роджерс Д.Ф. Алгоритмические основы машинной графики. Москва "Мир". 1989.

Приложения

 

Приложение 1

 

Листинги программы.

#include<stdlib. h>

#include<iostream. h>

#include<graphics. h>

#include<math. h>

#include<dos. h>

#include<conio. h>

#include<CTYPE. H>

#include<bios. h>

#include<stdio. h>

#include<string. h>s1, s2, x1, y1;N, R1, R2, H;

// ___________________________________________________________

// -------------------------------koordinaty kuba---------------------------------------

float xw_kubik [8], yw_kubik [8], zw_kubik [8]; // mirovye koordinaty kubaxe_kubik [8], ye_kubik [8], ze_kubik [8]; // vidovye koordinaty kubax_kubik [8], y_kubik [8]; // ekrannye koordinaty kuba

// __________________________________________________________________

// -------------------------------koordinaty piramidy----------------------------------xw_piramida [8], yw_piramida [8], zw_piramida [8]; // mirovye koordinaty piramidy

float xe_piramida [8], ye_piramida [8], ze_piramida [8]; // vidovye koordinaty piramidyx_piramida [8], y_piramida [8]; // ekrannye koordinaty piramidyMR_kubik [12] [2] ={{0,1},{1,2},{2,3},{3,0},{4,5},{5,6},{6,7},{7,4},{1,7},{2,6},{0,4},{3,5}};MR_piramida [20] [2], mgr_piramida [10] [10],mgv_piramida [10] [10];

int VK [4] [6];VP [4] [6];z_buf [70] [70];buf_kadr [70] [70];

// ____________________________________________________________

// -------------------------------koordinaty vectora------------------------------------

float xvectw_piramida [2], yvectw_piramida [2], zvectw_piramida [2];

float xvecte_piramida [2], yvecte_piramida [2], zvecte_piramida [2];xvect_piramida [2], yvect_piramida [2];

int h_kubik; // chirina osnovaniya kuba

float fi, te, al, ro;

int model=1;color1, color2;mgr_kubik [6] [4] ={{0,1,2,3},{4,5,6,7},{7,8,0,10},{5,9,2,11},{4,11,3,10},{6,9,1,8}};mgv_kubik [6] [4] ={{0,1,2,3},{4,5,6,7},{0,4,7,1},{2,6,5,3},{0,3,5,4},{1,7,6,2}};

int prg_kubik [6], prr_kubik [12];prg_piramida [6], prr_piramida [12];

// __________________________________________________________________

// -------------------------------Funkciya inicializacii kuba--------------------------init_kubik ()

{x0 [8] ={-h_kubik/2,-h_kubik/2,h_kubik/2,h_kubik/2,-h_kubik/2,h_kubik/2,h_kubik/2,-h_kubik/2};y0 [8] ={h_kubik/2,-h_kubik/2,-h_kubik/2,h_kubik/2,h_kubik/2,h_kubik/2,-h_kubik/2,-h_kubik/2};z0 [8] ={h_kubik/2,h_kubik/2,h_kubik/2,h_kubik/2,-h_kubik/2,-h_kubik/2,-h_kubik/2,-h_kubik/2};(int i=0; i<8; i++)

{_kubik [i] =x0 [i];_kubik [i] =y0 [i];_kubik [i] =z0 [i];

}

}

// _________________________________________________________________

// -------------------------------Funkciya inicializacii piramidy---------------------init_piramida ()

{=l*atan (1) /45.0;_piramida [i] =R1*cos (angle);_piramida [i] =-H/2;_piramida [i] =R1*sin (angle);+=dl;

}(i; i<N*2; i++)

{=l*atan (1) /45.0;_piramida [i] =R2*cos (angle);_piramida [i] =H/2;_piramida [i] =R2*sin (angle);+=dl;

}(i=0; i<N-1; i++)

{_piramida [i] [0] =i;_piramida [i] [1] =i+1;

}_piramida [i] [0] =i;_piramida [i] [1] =0;(i=N; i<N*2-1; i++)

{_piramida [i] [0] =i;_piramida [i] [1] =i+1;

}_piramida [i] [0] =i;_piramida [i] [1] =N;(i=3; i>=N/2; i--)

{_piramida [ (N*3-1) - i] [0] =i;_piramida [ (N*3-1) - i] [1] =i+N;

}(i=0; i<N/2; i++)

{_piramida [i+ (N*3-2)] [0] =i;_piramida [i+ (N*3-2)] [1] =i+N;

}(int j=0; j<N; j++)_piramida [0] [j] =j;(j=N; j<N*2; j++)

mgr_piramida [1] [j-N] =j;

for (i=2; i<N+1; i++)

{_piramida [i] [0] =i-2;_piramida [i] [1] =i-1+N*2;_piramida [i] [2] =i-2+N;_piramida [i] [3] =i-2+N*2;(N>4)(j=4; j<N; j++)

mgr_piramida [i] [j] =-1;

}_piramida [N+1] [0] =N-1;_piramida [N+1] [1] =N*2;_piramida [N+1] [2] =N*2-1;_piramida [N+1] [3] =N*3-1;_piramida [0] [0] =0;_piramida [0] [1] =N-1;_piramida [0] [2] =N-2;_piramida [1] [0] =N;_piramida [1] [1] =N+1;

mgv_piramida [1] [2] =N+2;(i=2; i<N+2; i++)

{_piramida [i] [0] =i-2;_piramida [i] [1] =i-1;_piramida [i] [2] =i-1+N;

}

}

// _________________________________________________________________

// -------------------------------Funkciya inicializacii piramidy1--------------------

void init_piramida1 ()

{x0 [8] ={-h_min_piramida/2,-h_piramida/2,h_piramida/2,h_min_piramida/2,h_min_piramida/2,h_min_piramida/2,h_piramida/2,-h_piramida/2};y0 [8] ={h_piramida/2,-h_piramida/2,-h_piramida/2,h_piramida/2,h_piramida/2,h_piramida/2,-h_piramida/2,-h_piramida/2};z0 [8] ={h_min_piramida/2,h_piramida/2,h_piramida/2,h_min_piramida/2,h_min_piramida/2,-h_min_piramida/2,-h_piramida/2,-h_piramida/2};

for (int i=0; i<8; i++)

{_piramida [i] =x0 [i];_piramida [i] =y0 [i];_piramida [i] =z0 [i];

}

}

// ____________________________________________________________

// ---------------------------Funkciya vidovogo preobrazovaniya kuba------------vid_pr_kubik (int i)

{_kubik [i] = - xw_kubik [i] *sin (te) +yw_kubik [i] *cos (te);_kubik [i] = - xw_kubik [i] *cos (fi) *cos (te) - yw_kubik [i] *cos (fi) *sin (te)

+zw_kubik [i] *sin (fi);_kubik [i] = - xw_kubik [i] *sin (fi) *cos (te) - yw_kubik [i] *sin (fi) *sin (te)_kubik [i] *cos (fi) +ro;

}

// ____________________________________________________________

// ---------------------------Funkciya vidovogo preobrazovaniya piramidy-------vid_pr_piramida (int i)

{_piramida [i] = - xw_piramida [i] *sin (te) +yw_piramida [i] *cos (te);_piramida [i] = - xw_piramida [i] *cos (fi) *cos (te) - yw_piramida [i] *cos (fi) *sin (te)

+zw_piramida [i] *sin (fi);_piramida [i] = - xw_piramida [i] *sin (fi) *cos (te) - yw_piramida [i] *sin (fi) *sin (te)_piramida [i] *cos (fi) +ro;

}

// ____________________________________________________________

// ---------------------------Funkciya vidovogo preobrazovaniya vectora---------vid_pr_vectora (int i)

{_piramida [i] = - xvectw_piramida [i] *sin (te) +yvectw_piramida [i] *cos (te);_piramida [i] = - xvectw_piramida [i] *cos (fi) *cos (te) - yvectw_piramida [i] *cos (fi) *sin (te)

+zvectw_piramida [i] *sin (fi);_piramida [i] = - xvectw_piramida [i] *sin (fi) *cos (te) - yvectw_piramida [i] *sin (fi) *sin (te)_piramida [i] *cos (fi) +ro;

}

// ____________________________________________________________

// -------------------------------Funkciya proecirovaniya kuba----------------------

void proec_kubik (int i)

{_kubik [i] =xe_kubik [i] +x1;_kubik [i] =-ye_kubik [i] +y1;

}

// ____________________________________________________________

// -------------------------------Funkciya proecirovaniya piramidy-----------------proec_piramida (int i)

{_piramida [i] =xe_piramida [i] +x1;_piramida [i] =-ye_piramida [i] +y1;

}

// ____________________________________________________________

// -------------------------------Funkciya proecirovaniya vectora-------------------proec_vectora (int i)

{_piramida [i] =xvecte_piramida [i] +x1;_piramida [i] =-yvecte_piramida [i] +y1;

}

// ____________________________________________________________

// -----------------------------------Funkciya risovaniya kuba-----------------------

void draw_kubik ()

{(int i=0; i<8; i++) {_pr_kubik (i);_kubik (i); }(i=0; i<12; i++)

{=MR_kubik [i] [0];=MR_kubik [i] [1];(x_kubik [s1],y_kubik [s1],x_kubik [s2],y_kubik [s2]);

}

}

// ____________________________________________________________

// -----------------------------------Funkciya risovaniya piramidy------------------

void draw_piramida ()

{(int i=0; i<8; i++) {_pr_piramida (i);_piramida (i); }(i=0; i<12; i++)

{=MR_piramida [i] [0];=MR_piramida [i] [1];(x_piramida [s1],y_piramida [s1],x_piramida [s2],y_piramida [s2]);

}

}

// ____________________________________________________________

// -----------------------------------Funkciya risovaniya vectora--------------------

void draw_vector ()

{(int i=0; i<2; i++)

{_pr_vectora (i);_vectora (i);

}(xvect_piramida [0],yvect_piramida [0],xvect_piramida [1],yvect_piramida [1]);

}

// ____________________________________________________________

// ------------------------------Funkciya povorota kuba otnositelno osi x----------

void povorot_x_kubik ()

{(int i=0; i<8; i++)

{k=yw_kubik [i];_kubik [i] =yw_kubik [i] *cos (al) - zw_kubik [i] *sin (al);_kubik [i] =k*sin (al) +zw_kubik [i] *cos (al);

}

}

// ____________________________________________________________

// ------------------------------Funkciya povorota kuba otnositelno osi y-------

void povorot_y_kubik ()

{(int i=0; i<8; i++)

{k=xw_kubik [i];_kubik [i] =xw_kubik [i] *cos (al) +zw_kubik [i] *sin (al);_kubik [i] =-k*sin (al) +zw_kubik [i] *cos (al);

}

}

// _________________________________________________________________

// ------------------------------Funkciya povorota kuba otnositelno osi z---------

void povorot_z_kubik ()

{(int i=0; i<8; i++)

{k=xw_kubik [i];_kubik [i] =xw_kubik [i] *cos (al) - yw_kubik [i] *sin (al);_kubik [i] =k*sin (al) +yw_kubik [i] *cos (al);

}

}

// ____________________________________________________________

// --------------------------Funkciya povorota piramidy otnositelno osi x--------

void povorot_x_piramida ()

{(int i=0; i<8; i++)

{k=yw_piramida [i];_piramida [i] =yw_piramida [i] *cos (al) - zw_piramida [i] *sin (al);_piramida [i] =k*sin (al) +zw_piramida [i] *cos (al);

}

}

// ____________________________________________________________

// --------------------------Funkciya povorota piramidy otnositelno osi y--------

void povorot_y_piramida ()

{(int i=0; i<8; i++)

{k=xw_piramida [i];_piramida [i] =xw_piramida [i] *cos (al) +zw_piramida [i] *sin (al);_piramida [i] =-k*sin (al) +zw_piramida [i] *cos (al);

}

}

// ____________________________________________________________

// --------------------------Funkciya povorota piramidy otnositelno osi z---------povorot_z_piramida ()

{(int i=0; i<8; i++)

{k=xw_piramida [i];_piramida [i] =xw_piramida [i] *cos (al) - yw_piramida [i] *sin (al);_piramida [i] =k*sin (al) +yw_piramida [i] *cos (al);

}

}

// ____________________________________________________________

// -----------------------------------Funkciya perenosa kuba-------------------------

void perenos_kubik (int a, int b, int c)

{(int i=0; i<8; i++)

{_kubik [i] += a;_kubik [i] += b;_kubik [i] += c;

}

}

// ____________________________________________________________

// -----------------------------------Funkciya perenosa piramidy---------------------

void perenos_piramida (int a, int b, int c)

{(int i=0; i<8; i++)

{_piramida [i] += a;_piramida [i] += b;_piramida [i] += c;

}

}

// ____________________________________________________________

// -----------------------------------Funkciya zakraski kuba------------------------

void zapolnenie_kubik (int color)

{{ygr, dy,miny,minx,maxx;dx, x,zz;

} SR [4], SAR [4], temp;f,f1,f2;z2,a1,b1,c1;(int i=0; i<6; i++)

// if (prg_kubik [i] ==0)

{(color! =0)++;(int n=0; n<4; n++)

{[n]. ygr=0;[n]. dx=0;[n]. dy=0;[n]. x=0;[n]. zz=0;[n]. miny=0;[n]. minx=0;

SR [n]. maxx=0;[n] =SR [n];

}=VK [0] [i];=VK [1] [i];=VK [2] [i];(int j=0,j1=0; j<4; j++)

{[j]. dy=0;=mgr_kubik [i] [j];=MR_kubik [f] [0];=MR_kubik [f] [1];( (int) y_kubik [f1]! = (int) y_kubik [f2])

{(y_kubik [f2] <y_kubik [f1])

{=f2;=f1;=f;

}[j1]. ygr=y_kubik [f2];[j1]. miny=y_kubik [f1];[j1]. dy=y_kubik [f2] - y_kubik [f1];

SR [j1]. x=x_kubik [f2];[j1]. maxx=x_kubik [f2];[j1]. minx=x_kubik [f1];[j1]. zz=ze_kubik [f2];[j1++]. dx=float (x_kubik [f2] - x_kubik [f1]) /float (y_kubik [f1] - y_kubik [f2]);

}

}a=SR [0]. ygr,j2,str=0,str1,str2,str3;(j=1; j<j1; j++)(a<SR [j]. ygr)=SR [j]. ygr;(j=0, j2=0; j<j1; j++)(SR [j]. ygr==a)[j2++] =SR [j];(j2! =0)

{

// if (j2==1) j2=2;(int l=0; l<j2; l++)(int z=0; z<j2-l; z++)( (SAR [z]. dy==0) || ( (SAR [z]. x>SAR [z+1]. x) && (SAR [z+1]. dy! =0)))

{=SAR [z];[z] =SAR [z+1];

SAR [z+1] =temp;

}(j=0; j<j2; j+=2)

{=SAR [j]. zz;=SAR [j]. dy;=int (SAR [j]. miny) - int (SAR [j+1]. miny);= (int (SAR [j+1]. maxx) - int (SAR [j]. maxx)) * (int (SAR [j+1]. minx) - int (SAR [j]. minx));

for (int x=SAR [j]. x,h=0; x<SAR [j+1]. x; h++, x++)

// putpixel (x,a,color);

{(z_buf [x] [a] <=z2)

{_buf [x] [a] =z2;( (h==0) || ( ( (str==0) || (str1==1)) && (str2==0) && (str3! =0)))_kadr [x] [a] =15;_kadr [x] [a] =color;

}(c1! =0)-=a1/c1;

}(z_buf [x] [a] <=z2)

{_buf [x] [a] =z2;_kadr [x] [a] =15; }

}=j2;(j=0; j<f; j++)

{[j]. ygr--;[j]. dy--;[j]. x+=SAR [j]. dx;

if (c1! =0)[j]. zz-= (a1*SAR [j]. dx+b1) /c1;(SAR [j]. dy<=0)--;

}-;++;(j=0; j<j1; j++)(SR [j]. ygr==a)(int k=0; k<4; k++)(SAR [k]. dy==0) {[k] =SR [j];++;;

}

}

}

}

// ___________________________________________________________

// -----------------------------------Funkciya zakraski piramidy--------------------

void zapolnenie_piramida (int color)

{{ygr, dy,miny,minx,maxx;dx, x,zz;

} SR [4], SAR [4], temp;f,f1,f2;z2,a1,b1,c1;(int i=0; i<6; i++)

// if (prg_piramida [i] ==0)

{(int n=0; n<4; n++)

{[n]. ygr=0;[n]. dx=0;[n]. dy=0;[n]. x=0;[n]. zz=0;[n]. miny=0;[n]. minx=0;[n]. maxx=0;[n] =SR [n];

}=VK [0] [i];=VK [1] [i];=VK [2] [i];(int j=0,j1=0; j<4; j++)

{[j]. dy=0;=mgr_piramida [i] [j];

f1=MR_piramida [f] [0];=MR_piramida [f] [1];( (int) y_piramida [f1]! = (int) y_piramida [f2])

{(y_piramida [f2] <y_piramida [f1])

{=f2;=f1;=f;

}[j1]. ygr=y_piramida [f2];[j1]. miny=y_piramida [f1];[j1]. dy=y_piramida [f2] - y_piramida [f1];[j1]. x=x_piramida [f2];[j1]. maxx=x_piramida [f2];[j1]. minx=x_piramida [f1];[j1]. zz=ze_piramida [f2];[j1++]. dx=float (x_piramida [f2] - x_piramida [f1]) /float (y_piramida [f1] - y_piramida [f2]);

}

}a=SR [0]. ygr,j2,str=0,str1,str2,str3;(j=1; j<j1; j++)(a<SR [j]. ygr)=SR [j]. ygr;(j=0, j2=0; j<j1; j++)(SR [j]. ygr==a)[j2++] =SR [j];(j2! =0)

{

// if (j2==1) j2=2;(int l=0; l<j2; l++)(int z=0; z<j2-l; z++)( (SAR [z]. dy==0) || ( (SAR [z]. x>SAR [z+1]. x) && (SAR [z+1]. dy! =0)))

{=SAR [z];[z] =SAR [z+1];

SAR [z+1] =temp;

}(j=0; j<j2; j+=2)

{=SAR [j]. zz;=SAR [j]. dy;=int (SAR [j]. miny) - int (SAR [j+1]. miny);= (int (SAR [j+1]. maxx) - int (SAR [j]. maxx)) * (int (SAR [j+1]. minx) - int (SAR [j]. minx));

for (int x=SAR [j]. x,h=0; x<SAR [j+1]. x; h++, x++)

// putpixel (x,a,color);

{(z_buf [x] [a] <=z2)

{_buf [x] [a] =z2;( (h==0) || ( ( (str==0) || (str1==1)) && (str2==0) && (str3! =0)))_kadr [x] [a] =5;_kadr [x] [a] =color;

}(c1! =0)-=a1/c1;

}(z_buf [x] [a] <=z2)

{_buf [x] [a] =z2;_kadr [x] [a] =5; }

}=j2;(j=0; j<f; j++)

{[j]. ygr--;[j]. dy--;[j]. x+=SAR [j]. dx;

if (c1! =0)[j]. zz-= (a1*SAR [j]. dx+b1) /c1;(SAR [j]. dy<=0)--;

}-;++;(j=0; j<j1; j++)(SR [j]. ygr==a)(int k=0; k<4; k++)(SAR [k]. dy==0) {[k] =SR [j];++;;

}

}

}

}draw_kubik2 ()

{f0;f1;f2;f3;(int i=0; i<12; i++)_kubik [i] =0;(i=0; i<6; i++)_kubik [i] =0;(i=0; i<4; i++)

{(int ii=0; ii<6; ii++)[i] [ii] =0;

}(i=0; i<8; i++)

{_pr_kubik (i);_kubik (i);

}(int g=0; g<6; g++) // // // // // // matrix kubik

{=mgv_kubik [g] [0];=mgv_kubik [g] [1];=mgv_kubik [g] [2];=mgv_kubik [g] [3];[0] [g] = (ye_kubik [f0] - ye_kubik [f1]) * (ze_kubik [f0] +ze_kubik [f1]) +

(ye_kubik [f1] - ye_kubik [f2]) * (ze_kubik [f1] +ze_kubik [f2]) +

(ye_kubik [f2] - ye_kubik [f3]) * (ze_kubik [f2] +ze_kubik [f3]) +

(ye_kubik [f3] - ye_kubik [f0]) * (ze_kubik [f3] +ze_kubik [f0]);[1] [g] = (ze_kubik [f0] - ze_kubik [f1]) * (xe_kubik [f0] +xe_kubik [f1]) +

(ze_kubik [f1] - ze_kubik [f2]) * (xe_kubik [f1] +xe_kubik [f2]) +

(ze_kubik [f2] - ze_kubik [f3]) * (xe_kubik [f2] +xe_kubik [f3]) +

(ze_kubik [f3] - ze_kubik [f0]) * (xe_kubik [f3] +xe_kubik [f0]);[2] [g] = (xe_kubik [f0] - xe_kubik [f1]) * (ye_kubik [f0] +ye_kubik [f1]) +

(xe_kubik [f1] - xe_kubik [f2]) * (ye_kubik [f1] +ye_kubik [f2]) +

(xe_kubik [f2] - xe_kubik [f3]) * (ye_kubik [f2] +ye_kubik [f3]) +

(xe_kubik [f3] - xe_kubik [f0]) * (ye_kubik [f3] +ye_kubik [f0]);[3] [g] =- ( (VK [0] [g]) *xe_kubik [f0] + (VK [1] [g]) *ye_kubik [f0] +

(VK [2] [g]) *ze_kubik [f0]);

}_kubik (9);

}draw_kubik3 ()

{f0;f1;f2;f3;(int i=0; i<12; i++)_kubik [i] =0;(i=0; i<6; i++)_kubik [i] =0;(i=0; i<4; i++)

{(int ii=0; ii<6; ii++)[i] [ii] =0;

}(i=0; i<8; i++)

{_pr_kubik (i);_kubik (i);

}(int g=0; g<6; g++) // // // // // // matrix kubik

{=mgv_kubik [g] [0];=mgv_kubik [g] [1];=mgv_kubik [g] [2];=mgv_kubik [g] [3];[0] [g] = (ye_kubik [f0] - ye_kubik [f1]) * (ze_kubik [f0] +ze_kubik [f1]) +

(ye_kubik [f1] - ye_kubik [f2]) * (ze_kubik [f1] +ze_kubik [f2]) +

(ye_kubik [f2] - ye_kubik [f3]) * (ze_kubik [f2] +ze_kubik [f3]) +

(ye_kubik [f3] - ye_kubik [f0]) * (ze_kubik [f3] +ze_kubik [f0]);[1] [g] = (ze_kubik [f0] - ze_kubik [f1]) * (xe_kubik [f0] +xe_kubik [f1]) +

(ze_kubik [f1] - ze_kubik [f2]) * (xe_kubik [f1] +xe_kubik [f2]) +

(ze_kubik [f2] - ze_kubik [f3]) * (xe_kubik [f2] +xe_kubik [f3]) +

(ze_kubik [f3] - ze_kubik [f0]) * (xe_kubik [f3] +xe_kubik [f0]);[2] [g] = (xe_kubik [f0] - xe_kubik [f1]) * (ye_kubik [f0] +ye_kubik [f1]) +

(xe_kubik [f1] - xe_kubik [f2]) * (ye_kubik [f1] +ye_kubik [f2]) +

(xe_kubik [f2] - xe_kubik [f3]) * (ye_kubik [f2] +ye_kubik [f3]) +

(xe_kubik [f3] - xe_kubik [f0]) * (ye_kubik [f3] +ye_kubik [f0]);[3] [g] =- ( (VK [0] [g]) *xe_kubik [f0] + (VK [1] [g]) *ye_kubik [f0] +

(VK [2] [g]) *ze_kubik [f0]);

}_kubik (0);

}draw_piramida2 ()

{f0;f1;f2;f3;(int i=0; i<12; i++)_piramida [i] =0;(i=0; i<6; i++)_piramida [i] =0;(i=0; i<4; i++)

{(int ii=0; ii<6; ii++)[i] [ii] =0;

}(i=0; i<8; i++)

{_pr_piramida (i);_piramida (i);

}(int g=0; g<6; g++) // // // // // // matrix piramida

{=mgv_piramida [g] [0];=mgv_piramida [g] [1];=mgv_piramida [g] [2];=mgv_piramida [g] [3];[0] [g] = (ye_piramida [f0] - ye_piramida [f1]) * (ze_piramida [f0] +ze_piramida [f1]) +

(ye_piramida [f1] - ye_piramida [f2]) * (ze_piramida [f1] +ze_piramida [f2]) +

(ye_piramida [f2] - ye_piramida [f3]) * (ze_piramida [f2] +ze_piramida [f3]) +

(ye_piramida [f3] - ye_piramida [f0]) * (ze_piramida [f3] +ze_piramida [f0]);[1] [g] = (ze_piramida [f0] - ze_piramida [f1]) * (xe_piramida [f0] +xe_piramida [f1]) +

(ze_piramida [f1] - ze_piramida [f2]) * (xe_piramida [f1] +xe_piramida [f2]) +

(ze_piramida [f2] - ze_piramida [f3]) * (xe_piramida [f2] +xe_piramida [f3]) +

(ze_piramida [f3] - ze_piramida [f0]) * (xe_piramida [f3] +xe_piramida [f0]);[2] [g] = (xe_piramida [f0] - xe_piramida [f1]) * (ye_piramida [f0] +ye_piramida [f1]) +

(xe_piramida [f1] - xe_piramida [f2]) * (ye_piramida [f1] +ye_piramida [f2]) +

(xe_piramida [f2] - xe_piramida [f3]) * (ye_piramida [f2] +ye_piramida [f3]) +

(xe_piramida [f3] - xe_piramida [f0]) * (ye_piramida [f3] +ye_piramida [f0]);[3] [g] =- ( (VK [0] [g]) *xe_piramida [f0] + (VK [1] [g]) *ye_piramida [f0] +

(VK [2] [g]) *ze_piramida [f0]);

}_piramida (RED);

}draw_piramida3 ()

{f0;f1;f2;f3;(int i=0; i<12; i++)_piramida [i] =0;(i=0; i<6; i++)_piramida [i] =0;(i=0; i<4; i++)

{(int ii=0; ii<6; ii++)[i] [ii] =0;

}(i=0; i<8; i++)

{_pr_piramida (i);_piramida (i); }(int g=0; g<6; g++) // // // // // // matrix piramida

{=mgv_piramida [g] [0];=mgv_piramida [g] [1];=mgv_piramida [g] [2];=mgv_piramida [g] [3];[0] [g] = (ye_piramida [f0] - ye_piramida [f1]) * (ze_piramida [f0] +ze_piramida [f1]) +

(ye_piramida [f1] - ye_piramida [f2]) * (ze_piramida [f1] +ze_piramida [f2]) +

(ye_piramida [f2] - ye_piramida [f3]) * (ze_piramida [f2] +ze_piramida [f3]) +

(ye_piramida [f3] - ye_piramida [f0]) * (ze_piramida [f3] +ze_piramida [f0]);[1] [g] = (ze_piramida [f0] - ze_piramida [f1]) * (xe_piramida [f0] +xe_piramida [f1]) +

(ze_piramida [f1] - ze_piramida [f2]) * (xe_piramida [f1] +xe_piramida [f2]) +

(ze_piramida [f2] - ze_piramida [f3]) * (xe_piramida [f2] +xe_piramida [f3]) +

(ze_piramida [f3] - ze_piramida [f0]) * (xe_piramida [f3] +xe_piramida [f0]);[2] [g] = (xe_piramida [f0] - xe_piramida [f1]) * (ye_piramida [f0] +ye_piramida [f1]) +

(xe_piramida [f1] - xe_piramida [f2]) * (ye_piramida [f1] +ye_piramida [f2]) +

(xe_piramida [f2] - xe_piramida [f3]) * (ye_piramida [f2] +ye_piramida [f3]) +

(xe_piramida [f3] - xe_piramida [f0]) * (ye_piramida [f3] +ye_piramida [f0]);[3] [g] =- ( (VK [0] [g]) *xe_piramida [f0] + (VK [1] [g]) *ye_piramida [f0] +

(VK [2] [g]) *ze_piramida [f0]);

}_piramida (0);

}z_buffer ()

{z2;(int z=0; z<70; z++)

{(int z1=0; z1<70; z1++)

{_buf [z] [z1] =-60;_kadr [z] [z1] =0;

}

}_piramida2 ();_kubik2 ();(z=0; z<70; z++)(int z1=0; z1<70; z1++)(z+120,z1+120,buf_kadr [z] [z1]);

}z_buffer2 ()

{z2;(int z=0; z<70; z++)

{(int z1=0; z1<70; z1++)

{_buf [z] [z1] =-60;_kadr [z] [z1] =0;

}

}_piramida3 ();_kubik3 ();(z=0; z<70; z++)(int z1=0; z1<70; z1++)(z+120,z1+120,buf_kadr [z] [z1]);

}

// ____________________________________________________________

// -------------------------------Funkciya titulnyi list kursovoi----------------------

void menu ()

{();(5);(3,0,9);(120,0,"Kursovaya");(195,100,"rabota");(7,0,3);(60,270,"Rabotu vypolnila studentka gpuppy EVM 5-1");(7,0,1);(250,310,"LAVINA VIKTORIYA");(8,0,1);(15);(160,230,"Dlya prodoljeniya najmite \"Enter\"");();

}

// ____________________________________________________________

// -------------------------------Funkciya menu programmy-------------------------

void menu1 ()

{();(0);(5);(10,0,1);(100,50,"Vvod parametrov objektov 1");(100,80,"Vvod parametrov kamery 2");(100,110,"Vvod parametrov vektorov 3");(100,140,"Vybor modeli izobrazheniya 4");(100,170,"Zapusk na vypolnenie 5");(100, 200,"Vyhod iz programmy ESC");

}

// ____________________________________________________________

// -------------------------------Funkciya vvoda parametrov-------------------------

void vvod ()

{ clrscr ();();(0);(5);(5,0,3);(0,30,"Vvedite dlinu osnovaniya kuba (5-40)");<< endl << endl << endl<< endl<< endl;>> h_kubik;(0,75,"Vvedite radius bolchego osnovaniya piramidy (5-20)");

cout<< endl << endl;>>R1;(0,120,"Vvedite radius bolchego osnovaniya piramidy (5-20)");<< endl << endl;>> R2;(0,165,"Vvedite vysotu piramidy (5-20)");<< endl << endl;>> H;(0, 205,"Vvedite kolichestvo verchin v osnovanii piramidy (5-20)");<< endl << endl;>> N;

getchar ();

}

// ____________________________________________________________

// -------------------------------Funkciya podmenu camery------------------------

void menucamera ()

{();();(0);(5);(5,0,4);(0,0,"Vvedite ro");(0,50,"Vvedite fi");

outtextxy (0,100,"Vvedite te");<< endl << endl << endl <<"ro=";>> ro;<< endl << endl << endl <<"fi=";>> fi;<< endl << endl << endl <<"te=";

cin >> te;();

}

// ____________________________________________________________

// -------------------------------Funkciya podmenu vybora modeli------------------

void selectmodel ()

{();(0);(5);(10,0,1);(0,50," Karkasnaya model 1");(0,100," Zakraska 2");(0,150," Model ydaleniya nevidimyh linii 3");:(getch ())

{'1': model=1; break;'2': model=2; break;'3': model=3; break;: goto m1;

}

}

// ____________________________________________________________

// -------------------------------Funkciya risovaniya osi-----------------------------

void osi ()

{mox [3] ={50,0,0}, moy [3] ={0,50,0}, moz [3] ={0,0,50};vox [3],voy [3],voz [3];eox [3],eoy [3];(int a=0; a<3; a++)

{[a] =-mox [a] *sin (te) +moy [a] *cos (te);[a] =-mox [a] *cos (fi) *cos (te) - moy [a] *cos (fi) *sin (te) +moz [a] *sin (fi);[a] =-mox [a] *sin (fi) *cos (te) - moy [a] *sin (fi) *sin (te) - moz [a] *cos (fi) +ro;

}(a=0; a<3; a++)

{[a] =vox [a];[a] =-voy [a];

}(1,0,1);(a=0; a<3; a++)

{(a+1);(a)

{0: outtextxy (570+eox [a] +3,280+eoy [a] - 3,"x"); break;1: outtextxy (570+eox [a] +3,280+eoy [a] - 3,"y"); break;2: outtextxy (570+eox [a] - 3,280+eoy [a] - 3,"z"); break;

}(570,280,570+eox [a],280+eoy [a]);

}

}rotate_vector_piramida (float alfa)

{_vector ();vect= (sqrt (pow (xvectw_piramida [1] - xvectw_piramida [0],2) +

pow (yvectw_piramida [1] - yvectw_piramida [0],2) +(zvectw_piramida [1] - zvectw_piramida [0],2)));vte=cos ( (xvectw_piramida [1] - xvectw_piramida [0]) /

(sqrt (pow (xvectw_piramida [1] - xvectw_piramida [0],2) +(yvectw_piramida [1] - yvectw_piramida [0],2))));vfi=cos ( (zvectw_piramida [1] - zvectw_piramida [0]) /vect);=vte;_z_piramida ();=vfi;_y_piramida ();=alfa*atan (1) /45;_z_piramida ();=-vfi;_y_piramida ();=-vte;_z_piramida ();

}

// ___________________________________________________________

// -------------------------------Funkciya risovaniya knopok-----------------------

void knopki ()

{(15);(15, 240,"Dvigenie kuba");(15, 265,"Po osi X: ");d (110, 265, 130,285,2,1);d (140, 265, 160,285,2,1);(15, 295,"Po osi Y: ");d (110, 295, 130,315,2,1);d (140, 295, 160,315,2,1);(15, 325,"Po osi Z: ");d (110, 325, 130,345,2,1);d (140, 325, 160,345,2,1);(220, 240,"Vrachenie");(220, 260,"piramida");d (250, 300, 270,320,2,1);(5);(113,265,"A");(143,265,"D");(113,295,"S");(143,295,"W");(113,325,"E");(143,325,"Q");(252,301,"R");

}vyvod_dannyh ()

{str [10];(15);(1,0,1);(505,5," H kubika");(h_kubik,str,10);(515, 20,str);(510,70,"CAMERA: ");(540,95,"Fi: ");(fi,str,10);(570,95,str);d (610, 95, 630,115,2,1);d (510, 95, 530,115,2,1);(540,125,"Te: ");

itoa (te,str,10);(570,125,str);

bar3d (610, 125, 630,145,2,1);d (510, 125, 530,145,2,1);(540,155,"Ro: ");(ro,str,10);(570,155,str);d (610, 155, 630,175,2,1);d (510, 155, 530,175,2,1);(360,5,"VECTOR: ");

outtextxy (360,35,"x1: ");(xvectw_piramida [0],str,10);(395,35,str);(430,35,"x2: ");(xvectw_piramida [1],str,10);(465,35,str);(360,70,"y1: ");(yvectw_piramida [0],str,10);(395,70,str);(430,70,"y2: ");(yvectw_piramida [1],str,10);(465,70,str);(360,105,"z1: ");(zvectw_piramida [0],str,10);(395,105,str);(430,105,"z2: ");(zvectw_piramida [1],str,10);(465,105,str);(360, 190,"USECHENNAYA: ");(360, 205,"PIRAMIDA: ");

outtextxy (360,235,"R1: ");(R1,str,10);(395,235,str);(360,265,"R2: ");(R2,str,10);(395,265,str);(360,295,"N: ");(N,str,10);(395,295,str);(360,325,"H: ");(H,str,10);(395,325,str);(5);(512,95,"O");(612,95,"P");(512,125,"K");(612,125,"L");(512,155,"N");(612,155,"M");(512,185,"-5 < - > +5");

}minus (float ugol)

}plus (float ugol)

{= ugol + 5;ugol;

}

// ____________________________________________________________

// -------------------------------Funkciya risovaniya ramok--------------------------ramka ()

{(5);(0,0,getmaxx (),getmaxy ());(119,119, 191, 191);(500,0,getmaxx (),getmaxy ());(500,70,getmaxx (),210);(350,0,500,getmaxy ());(350,getmaxy () /2,500,getmaxy ());(0,235, 200,getmaxy ());(200,235,350,getmaxy ());

}vvod_D ()

{();(0);();_dannyh ();(WHITE);_kubik (10,0,0);(model==1)

{_kubik ();(6);_piramida ();

}(model==2)_buffer ();(model==3)_buffer2 ();();();

}vvod_A ()

{();(0);();_dannyh ();(WHITE);_kubik (-10,0,0);(model==1)

{_kubik ();(6);_piramida ();

}(model==2)_buffer ();(model==3)_buffer2 ();();();

}vvod_W ()

{();(0);();_dannyh ();(WHITE);_kubik (0,10,0);(model==1)

{_kubik ();(6);_piramida ();

}(model==2)_buffer ();(model==3)_buffer2 ();();();

}vvod_S ()

{();(0);();_dannyh ();(WHITE);_kubik (0,-10,0);(model==1)

{_kubik ();(6);_piramida ();

}(model==2)_buffer ();(model==3)_buffer2 ();();();

}vvod_Q ()

{();(0);();_dannyh ();(WHITE);_kubik (0,0,10);(model==1)

{_kubik ();(6);_piramida ();

}(model==2)_buffer ();(model==3)_buffer2 ();();();

}vvod_E ()

{();(0);();_dannyh ();(WHITE);_kubik (0,0,-10);(model==1)

{_kubik ();(6);_piramida ();

}(model==2)_buffer ();(model==3)_buffer2 ();();();

}vvod_O ()

{();(0);();_dannyh ();(WHITE);=minus (fi);(model==1)

{_kubik ();(6);_piramida ();

}(model==2)_buffer ();(model==3)_buffer2 ();();();

}vvod_K ()

{();(0);();_dannyh ();(WHITE);=minus (te);(model==1)

{_kubik ();(6);_piramida ();

}(model==2)_buffer ();(model==3)_buffer2 ();();();

}vvod_N ()

{();(0);();_dannyh ();(WHITE);=minus (ro);(model==1)

{_kubik ();(6);_piramida ();

}(model==2)_buffer ();(model==3)_buffer2 ();();();

}vvod_P ()

{();(0);();_dannyh ();(WHITE);=plus (fi);(model==1)

{_kubik ();(6);_piramida ();

}(model==2)_buffer ();(model==3)_buffer2 ();();();

}vvod_L ()

{();(0);();_dannyh ();(WHITE);

te=plus (te);(model==1)

{_kubik ();(6);_piramida ();

}(model==2)_buffer ();(model==3)_buffer2 ();();();

}vvod_M ()

{();(0);();_dannyh ();(WHITE);=plus (ro);(model==1)

{_kubik ();(6);_piramida ();

}(model==2)_buffer ();(model==3)_buffer2 ();();();

}vvod_R ()

{();(0);();_dannyh ();(WHITE);_vector_piramida (te);(model==1)

{_kubik ();(6);_piramida ();

}(model==2)_buffer ();(model==3)_buffer2 ();();();

}vvod_vector ()

{();();(0);(5);(5,0,4);i = 0;x=0;(0,0,"Vvedite koordinaty 1 tochki vectora");

cout<< endl << endl << endl <<"x=";>> x;_piramida [i] =x;<< endl <<"y=";>> x;_piramida [i] =x;<< endl <<"z=";>> x;

zvectw_piramida [i] =x;++;(0,100,"Vvedite koordinaty 2 tochki vectora");<< endl << endl << endl <<"x=";>> x;_piramida [i] =x;

cout<< endl <<"y=";>> x;_piramida [i] =x;<< endl <<"z=";

cin >> x;_piramida [i] =x;();

}

// ________________________________________________________

// -----------------------------------Glavnay funkciya-----------------------------

void main ()

{int g=EGA,gmode=EGAHI;(&g,&gmode,"C: \\borlandc\\bgi");= ( (atan (1) /45.0) *fi);= ( (atan (1) /45.0) *te);= ( (atan (1) /45.0) *30);pr = 0;();: menu1 ();

switch (getch ())

{'1': vvod (); pr=1; goto m;'2': pr++; menucamera (); goto m;'3': pr++; vvod_vector (); goto m;'4': pr++; selectmodel (); goto m;'5': if (pr! =4)

{();(0);(5);(10,0,1);(100,150,"Dlya na4ala sleduet vvesti dannye!");();m;

}();(0);_kubik ();_piramida ();(0);=150; y1=150;(model==1)

{();(0);();_dannyh ();(WHITE);_kubik ();(6);_piramida ();();();: switch (getch ())

{'d': vvod_D (); goto m2;'a': vvod_A (); goto m2;'w': vvod_W (); goto m2;'s': vvod_S (); goto m2;'q': vvod_Q (); goto m2;'e': vvod_E (); goto m2;'r': vvod_R (); goto m2;'o': vvod_O (); goto m2;'p': vvod_P (); goto m2;'k': vvod_K (); goto m2;'l': vvod_L (); goto m2;'n': vvod_N (); goto m2;'m': vvod_M (); goto m2;27: goto m;

}();

}(model==2)

{=35; y1=35;();(0);();_dannyh ();(5);();();_buffer ();: switch (getch ())

{'d': vvod_D (); goto m3;'a': vvod_A (); goto m3;'w': vvod_W (); goto m3;'s': vvod_S (); goto m3;'q': vvod_Q (); goto m3;'e': vvod_E (); goto m3;'r': vvod_R (); goto m3;'o': vvod_O (); goto m3;'p': vvod_P (); goto m3;'k': vvod_K (); goto m3;'l': vvod_L (); goto m3;'n': vvod_N (); goto m3;'m': vvod_M (); goto m3;27: goto m;

}

}(model==3)

{=35; y1=35;();();_dannyh ();(0);(WHITE);_buffer2 ();();();: switch (getch ())

{'d': vvod_D (); goto m4;'a': vvod_A (); goto m4;'w': vvod_W (); goto m4;'s': vvod_S (); goto m4;'q': vvod_Q (); goto m4;'e': vvod_E (); goto m4;'r': vvod_R (); goto m4;'o': vvod_O (); goto m4;'p': vvod_P (); goto m4;'k': vvod_K (); goto m4;'l': vvod_L (); goto m4;'n': vvod_N (); goto m4;'m': vvod_M (); goto m4;27: goto m;

}();

}();m;27: exit (0);: goto m;

}();

}

Приложение 2

 

Графические результаты работы программы.



Похожие работы на - Разработка программы, реализующей алгоритм, который использует z-буфер

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!