Программирование в Pascal. Моделирование 3D-объектов

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

p>

Пусть угол AOx равен ?, тогда из рисунка 4 видно, что

(? i) = x/r, sin(?) = y/r.

 

Угол AOA равен по условию ?.

Отсюда

x = r*cos(?+ ?) = r*(cos(?)*cos(?)-sin(?)*sin(?)) =

= (r*cos(?))*cos(?)-(r*sin(?))*sin(?) =

= x*cos(?)-y*sin (?)) = r*sin(? + ?) = r*(cos(?)*sin(?)+sin(?)*cos(?)) =

= (r*cos(?))*sin(?)+(r*sin(?))*cos(?) =

= x*sin(?)+y*cos(?)

 

Рассматривая случай с трехмерным пространством, таким образом

= x*cos(?)-y*sin(?) = x*sin(?)+y*cos(?)

z = z

 

Аналогично выводятся формулы и для других осей поворота (Ox, Oy). Поворот относительно произвольной оси, проходящей через начало координат, можно сделать с помощью этих поворотов - сделать поворот относительно Ox так, чтобы ось поворота стала перпендикулярна Oy, затем поворот относительно Oy так, чтобы ось поворота совпала с Oz, сделать собственно поворот, а затем обратные повороты относительно Oy и Ox. В результате чего соответственно получаем:

:=Y*cos(xv)-Z*sin(xv):=Y*sin(xv)+Z*cos(xv)

 

Здесь Y, Z это координаты вершины, а xv - угол поворота в градусах. Аналогично решаются задачи для поворота по оси X:

:=X*cos(yv)-Z*sin(yv):=X*sin(yv)+Z*cos(yv)

И, соответственно, по оси Z:

:=X*cos(zv)-Y*sin(zv):=X*sin(zv)+Y*cos(zv)

 

Важно отметить, что любая среда программирования работает с формой записи угла в радианах. Соответственно для любого значения в градусах необходимо выполнить преобразование - помножить значение в градусах на число Пи разделить на 180.

 

Программная реализация построения изображения

 

При обучении часто встает вопрос о программировании графических приложений ввиду некоторых факторов. Прежде всего, это кажущиеся сложности в инициализации графического модуля. До недавнего времени система программирования Borland Turbo Pascal устанавливалась простым копированием с компьютера на компьютер, при этом не происходило прописывание системных переменных и путей. По этой причине при попытке инициализации графического режима и выходили сообщения об ошибке:15: File not found (GRAPH.TPU)

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

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

Основной задачей при создании и выводе объемной графики на экран является преобразование трех координат в две, так как на экран можно вывести лишь 2 координаты. Учитывая, что "структуры данных+ алгоритмы= программы", определим изначально структуры данных.

Чем же является 3D-объект. Наиболее просто его можно представить в виде совокупности точек, комбинируя которые в пары или по тройкам можно в дальнейшем получать соответственно требуемые модели. Таким образом для работы с 3D объектами будет достаточно обычного массив точек:

[1..n] of record x,y,z:double end;

или [1..n1*3]of double;

 

В первом случае задан массив точек (record~point) а во втором массив координат, который необходимо интерплитировать как:

 

( (x1,y1,z1),(x2,y2,z2), ... ,(xi,yi,zi), ... ,(xn,yn,zn) )

 

Таким образом каждые 3 элемента массива - точка.

Организовывая первым способом массивы для хранения координат для фигур создадим пользовательский тип записи (для более удобной работы с координатами):

type d=record,y,z: real;;

 

После чего можно начать ввод координат. Создадим первую фигуру. Это будет простейшая пирамида, состоящая из треугольников. Известно, что она содержит в себе 3 треугольника и 4 вершины. Организуя координаты вершин в массив, относительно некоторой нулевой точки получим конструкцию:

tet: array[1..4] of d3d =

((x:50;y:80;z:50),

(x:50;y:0;z:80),

(x:100;y:0;z:0),

(x:0;y:0;z:0));

 

Аналогично можно поступить, задавая координаты куба. Суть остается прежней, изменится только количество вершин:

cub: array[1..8] of d3d =

((x:-50;y:-50;z:50),

(x:-50;y:50;z:50),

(x:50;y:50;z:50),

(x:50;y:-50;z:50),

(x:-50;y:-50;z:-50),

(x:-50;y:50;z:-50),

(x:50;y:50;z:-50),

(x:50;y:-50;z:-50));

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

:= Detect; (grDriver, grMode,);:= GraphResult;

 

На этом этапе предоставим графической системе возможность самостоятельно определить графический режим. Так как современные графические адаптеры, а так же непосредственно видеодисплеи, имеют гораздо большие возможности, всвязи с этим можно предположить, что графическим драйвером будет EGAVGA. Главное при этом иметь необходимый внешний модуль для среды разработки.

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

установка цвета п