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

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

Рубрика Программирование, компьютеры и кибернетика
Вид контрольная работа
Язык русский
Дата добавления 29.10.2012
Размер файла 905,2 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Контрольная работа

по дисциплине Компьютерная графика

1. Деловая графика

Чтобы создать правильное, наглядное и красивое отображение статистических данных, можно воспользоваться программой MS Excel.

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

Таблица. Диаграммы Excel

Тип диаграммы

Описание

Гистограмма (Column)

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

Линейчатая (Bar)

Отражает соотношение отдельных компонентов.

График (Line)

Отражает тенденции изменения данных за равные промежутки времени.

Круговая (Pie)

Иллюстрирует относительные значения элементов из одного ряда.

Точечная (XY (scatter))

Отображает взаимосвязь между числовыми значениями в нескольких рядах.

С областями (Area)

Подчеркивает величину изменения в течение определенного периода времени.

Кольцевая (Doughnut)

Показывает вклад каждого элемента в общую сумму.

Лепестковая (Radar)

Каждая категория имеет собственную ось координат, исходящую из начала координат (позволяет сравнить общие значения из нескольких наборов данных, что удобно использовать, например, при статистическом исследовании спроса)..

Поверхность (Surface)

Используется для поиска наилучшего сочетания двух наборов данных.

Пузырьковая (Bubble)

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

Биржевая (Stock)

Используется для демонстрации максимальных и минимальных цен на акции, а также цен закрытия.

Цилиндрическая, коническая, пирамидальная (Cone, Cylinder. Pyramid)

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

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

Ось -- это граница диаграммы, показывающая тип ряда, например, время или денежные суммы.

Легенда -- это описание рядов данных и осей диаграммы.

Таблица данных -- это уменьшенное изображение вашего листа с выделенными для построения диаграммы данными, которое располагается под диаграммой.

Маркеры изменения размера -- это восемь черных квадратиков, расположенных вокруг определенных объектов, (например, диаграмм) перетаскивая которые, вы сможете изменять их размеры.

Таблица 1. Статистические данные продаж автомобилей.

Аукционная статистика продаж автомобилей марки Toyota Cedan

 

 

Toyota Allion

 

Кузов

Объем

Шт.

Цена прим.

 

 

 

 

Средн. 

Максимальн.

До 3 лет

 

598

 

 

2008 - 2010 гг.

 

 

 

 

NTZ260

 1500

1

$19 605

$19 605

NZT260

 1500-Б-пер

494

$19 502

$32 727

ZRT260

 1800-Б-пер

74

$14 021

$21 115

ZRT261

 2000-Б-пер

14

$15 100

$18 420

ZRT265

 1800-Б-4wd

15

$13 915

$17 587

От 3 до 5 лет

 

1196

 

 

2005 - 2007 гг.

 

 

 

 

AZT240

 2000-Б-пер

40

$5 156

$10 245

NZT240

 1500-Б-пер

328

$10 718

$23 575

NZT260

 1500-Б-пер

305

$17 705

$26 075

ZPT260

 1800

6

$13 857

$15 804

ZRT260

 1800-Б-пер

169

$12 845

$16 858

ZRT265

 1800-Б-4wd

22

$12 578

$15 504

ZZT240

 1800-Б-пер

279

$6 553

$20 282

ZZT245

 1800-Б-4wd

47

$6 041

$15 869

Для выполнения данного задания были взяты статистические данные из источника «Автомобили. Спецтехника. Запчасти» :

Результатом работы можно считать следующую диаграмму:

Рис.1. Статистика продаж автомобилей

Вывод:

Средствами программы MS Excel создана объемная круговая диаграмма, иллюстрирующая статистические данные.

2. Трехмерные преобразования

Постановка задачи: составить программу, реализующую трехмерное преобразование с фигурой октаэдр в контурном виде, без удаления невидимых линий. Фигура должна вращаться вокруг произвольной оси. Вращение управляется с помощью девяти клавишь (1…9) на цифровой клавиатуре.

Октамэдр (греч. пкфЬедспн, от греч. пкфю, «восемь» и греч. Эдсб -- «основание») -- один из пяти выпуклых правильных многогранников, так называемых, Платоновых тел.

Октаэдр имеет 8 треугольных граней, 12 рёбер, 6 вершин, в каждой его вершине сходятся 4 ребра.

Рис.2. Октаэдр.

Если длина ребра октаэдра равна а, то площадь его полной поверхности (S) и объём октаэдра (V) вычисляются по формулам:

Радиус сферы, описанной вокруг октаэдра, равен:

,

радиус вписанной в октаэдр сферы может быть вычислен по формуле:

Правильный октаэдр имеет симметрию Oh, совпадающую с симметрией куба.

Подобно тому, как двумерные преобразования описываются матрицами размером , трехмерные преобразования могут быть представлены матрицами размером . Тогда трехмерная точка записывается в однородных координатах как , где . Для получения декартовых координат надо первые три однородные координаты разделить на . Два однородных вектора описывают одну декартову точку в трехмерном пространстве, если , где и - векторы, записанные в однородных координатах.

Матрицы преобразований будем записывать в правосторонней системе координат. При этом положительный поворот определяется следующим образом. Если смотреть из положительной части оси вращения (например, оси ) в направлении начала координат, то поворот на против часовой стрелки будет переводить одну положительную полуось в другую (ось в , в соответствии с правилом циклической перестановки).

Заметим, что на практике удобнее применять левостороннюю систему координат, так как в этом случае удобнее интерпретировать тот факт, что точки с большими значениями находятся дальше от наблюдателя.

Запишем теперь матрицу трехмерного переноса. Аналогично двумерному случаю.

, при этом

.

Операция масштабирования:

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

.

Матрица поворота вокруг оси имеет вид:

,

и вокруг оси :

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

Обратные преобразования будут выражаться обратными матрицами. Для операции переноса надо лишь заменить знаки компонент вектора переноса на противоположные:

;

для операции масштабирования - на обратные значения:

для поворота - выбором отрицательного угла поворота:

.

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

.

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

После перемножения любого числа матриц вида и результирующая матрица всегда будет иметь вид:

.

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

Используя вышеизложенный математический аппарат, можно составить следующую программу на языке программирования Turbo Pascal.

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

Uses Graph, Crt; {подключение графического и текстового модуля}

Const N=8; {постоянные 8 граней, 12 ребер}

M=12;

Type Coord = record {описание типов, используемых программой}

X,Y,Z : Real;

End;

Rebro = record

B,E,C,d : Word;

End;

Var {Рездел описания переменных}

grDriver : Integer; {Переменные для работы в графическом режиме}

grMode : Integer;

A : Array [1..N] of Coord;

B : Array [1..M] of Rebro;

Key : Char;

I : Byte;

L,C : Coord;

Ux, Uy, Uz : Real;

Procedure Tr3d(P,T:Coord; Var R:Coord); {Процедура расчет значений 3-х векторов }

Type Matrix = Array [1..4,1..4] Of Real;

Var I,J : Byte;

O : Matrix;

Begin

For I := 1 To 4 Do For J := 1 To 4 Do If I = J Then O[I,J] := 1

Else O[I,J] := 0;

O[1,4] := T.X;

O[2,4] := T.Y;

O[3,4] := T.Z;

R.X := O[1,1] * P.X + O[1,2] * P.Y + O[1,3] * P.Z + O[1,4];

R.Y := O[2,1] * P.X + O[2,2] * P.Y + O[2,3] * P.Z + O[2,4];

R.Z := O[3,1] * P.X + O[3,2] * P.Y + O[3,3] * P.Z + O[3,4];

End;

Procedure Sr3d(P,S:Coord; Var R:Coord); {расчет изменения масштаба }

Type Matrix = Array [1..4,1..4] Of Real;

Var I,J : Byte;

O : Matrix;

Begin

For I := 1 To 4 Do For J := 1 To 4 Do If I = J Then O[I,J] := 1

Else O[I,J] := 0;

O[1,1] := S.X;

O[2,2] := S.Y;

O[3,3] := S.Z;

R.X := O[1,1] * P.X + O[1,2] * P.Y + O[1,3] * P.Z + O[1,4];

R.Y := O[2,1] * P.X + O[2,2] * P.Y + O[2,3] * P.Z + O[2,4];

R.Z := O[3,1] * P.X + O[3,2] * P.Y + O[3,3] * P.Z + O[3,4];

End;

Procedure UX3d(P:Coord; Teta:Real; Var R:Coord); {расчет вращения вокруг оси x}

Type Matrix = Array [1..4,1..4] Of Real;

Var I,J : Byte;

O : Matrix;

Begin

For I := 1 To 4 Do For J := 1 To 4 Do If I = J Then O[I,J] := 1

Else O[I,J] := 0;

O[2,2] := COS(Teta);

O[2,3] := -SIN(Teta);

O[3,2] := SIN(Teta);

O[3,3] := COS(Teta);

R.X := O[1,1] * P.X + O[1,2] * P.Y + O[1,3] * P.Z + O[1,4];

R.Y := O[2,1] * P.X + O[2,2] * P.Y + O[2,3] * P.Z + O[2,4];

R.Z := O[3,1] * P.X + O[3,2] * P.Y + O[3,3] * P.Z + O[3,4];

End;

Procedure UY3d(P:Coord; Teta:Real; Var R:Coord); {расчет вращения вокруг оси y}

Type Matrix = Array [1..4,1..4] Of Real;

Var I,J : Byte;

O : Matrix;

Begin

For I := 1 To 4 Do For J := 1 To 4 Do If I = J Then O[I,J] := 1

Else O[I,J] := 0;

O[1,1] := COS(Teta);

O[1,3] := -SIN(Teta);

O[3,1] := SIN(Teta);

O[3,3] := COS(Teta);

R.X := O[1,1] * P.X + O[1,2] * P.Y + O[1,3] * P.Z + O[1,4];

R.Y := O[2,1] * P.X + O[2,2] * P.Y + O[2,3] * P.Z + O[2,4];

R.Z := O[3,1] * P.X + O[3,2] * P.Y + O[3,3] * P.Z + O[3,4];

End;

Procedure UZ3d(P:Coord; Teta:Real; Var R:Coord); {расчет вращения вокруг оси z}

Type Matrix = Array [1..4,1..4] Of Real;

Var I,J : Byte;

O : Matrix;

Begin

For I := 1 To 4 Do For J := 1 To 4 Do If I = J Then O[I,J] := 1

Else O[I,J] := 0;

O[1,1] := COS(Teta);

O[1,2] := -SIN(Teta);

O[2,1] := SIN(Teta);

O[2,2] := COS(Teta);

R.X := O[1,1] * P.X + O[1,2] * P.Y + O[1,3] * P.Z + O[1,4];

R.Y := O[2,1] * P.X + O[2,2] * P.Y + O[2,3] * P.Z + O[2,4];

R.Z := O[3,1] * P.X + O[3,2] * P.Y + O[3,3] * P.Z + O[3,4];

End;

Procedure Fig; {расчет начальных координат для октаэдра}

Begin

A[ 1].X := 10; A[ 1].Y := 10; A[ 1].Z := 10; {координаты 6 вершин}

A[ 2].X :=10; A[ 2].Y := 10; A[ 2].Z :=-10;

A[ 3].X := -10; A[ 3].Y := 10; A[ 3].Z := -10;

A[ 4].X := -10; A[ 4].Y := 10; A[ 4].Z := 10;

A[ 5].X := 0; A[ 5].Y := -10;A[ 5].Z := 0;

A[ 6].X := 0; A[ 6].Y := 30; A[ 6].Z := 0;

B[ 1].B := 1; B[ 1].E := 2; B[ 1].C := 4;{координаты соединяемых вершин, цвет ребер}

B[ 2].B := 2; B[ 2].E := 3; B[ 2].C := 4;

B[ 3].B := 3; B[ 3].E := 4; B[ 3].C := 4;

B[ 4].B := 5; B[ 4].E := 1; B[ 4].C := 14;

B[ 5].B := 5; B[ 5].E := 2; B[ 5].C := 14;

B[ 6].B := 5; B[ 6].E := 3; B[ 6].C := 14;

B[ 7].B := 5; B[ 7].E := 4; B[ 7].C := 14;

B[ 8].B := 6; B[ 8].E := 1; B[ 8].C := 12;

B[ 9].B := 6; B[ 9].E := 2; b[ 9].C := 12;

B[10].B := 6; B[10].E := 3; b[10].C := 12;

B[11].B := 6; B[11].E := 4; b[11].C := 12;

B[12].B := 4; B[12].E := 1; b[12].C := 4;

End;

Procedure Draw3D; {ввод значений для вывода на экран фигуры}

Var I : Byte;

XB, YB, XE, YE : Real;

Begin

For I := 1 To M Do Begin

SetColor(B[I].C);

XB := A[B[I].B].X;

YB := A[B[I].B].Y;

XE := A[B[I].E].X;

YE := A[B[I].E].Y;

Line( Trunc(XB), Trunc(YB), Trunc(XE), Trunc(YE) );

End;

End;

Procedure Hide3D; {стирание фигуры}

Var I : Byte;

XB, YB, XE, YE : Real;

Begin

SetColor(Black);

For I := 1 To M Do Begin

XB := A[B[I].B].X;

YB := A[B[I].B].Y;

XE := A[B[I].E].X;

YE := A[B[I].E].Y;

Line( Trunc(XB), Trunc(YB), Trunc(XE), Trunc(YE) );

End;

End;

Begin

ClrScr; {очистка экрана, модуль crt }

WriteLn('1-2 ‚вращение по оси OZ'); {вывод на экран меню - пояснение к управляющим кнопкам}

WriteLn('3-4 ‚ вращение по оси OY');

WriteLn('5-6 ‚ вращение по оси OX');

WriteLn('7-9 приблизить объект - отдалить объект);

WriteLn('esc для выхода из программы);

ReadLn; {ожидание нажатия клавиши enter}

Fig; {ввод процедуры рисования фигуры }

C.X := 5; C.Y := 5; C.Z := 5; { указание координат вывода на экран}

For I := 1 To N Do Sr3d(A[I], C, A[I]);

L.X := 200; L.Y := 200; L.Z := 200;

For I := 1 To N Do Tr3d(A[I], L, A[I]);

grDriver := Detect;

InitGraph(grDriver,grMode,'c:\tp\bgi\'); {инициализация графического режима}

Draw3D; { вывод на экран фигуры}

Key := ' ';

While Key <> #27 Do Begin {если нажата клавиша enter присвоить значения для клавиши (от 1 до 8)}

Key := ReadKey;

If Key = '1' Then Begin

Hide3D;

L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;

For I := 1 To N Do Tr3d(A[I], L, A[I]);

Uz := Pi/120; For I := 1 To N Do Uz3d(A[i],Uz,A[i]);

L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;

For I := 1 To N Do Tr3d(A[I], L, A[I]); {смещение фигуры относительно оси z по часовой стрелке}

Draw3D;

End;

If Key = '2' Then Begin

Hide3D;

L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;

For I := 1 To N Do Tr3d(A[I], L, A[I]);

Uz := -Pi/120; For I := 1 To N Do Uz3d(A[i],Uz,A[i]);

L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;

For I := 1 To N Do Tr3d(A[I], L, A[I]); {смещение фигуры относительно оси z против часовой стрелки}

Draw3D;

End;

If Key = '3' Then Begin

Hide3D;

L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;

For I := 1 To N Do Tr3d(A[I], L, A[I]);

Uy := Pi/120; For I := 1 To N Do Uy3d(A[i],Uy,A[i]);

L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;

For I := 1 To N Do Tr3d(A[I], L, A[I]); {смещение фигуры относительно оси y вправо}

Draw3D;

End;

If Key = '4' Then Begin

Hide3D;

L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;

For I := 1 To N Do Tr3d(A[I], L, A[I]);

Uy := -Pi/120; For I := 1 To N Do Uy3d(A[i],Uy,A[i]);

L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;

For I := 1 To N Do Tr3d(A[I], L, A[I]); {смещение фигуры относительно оси y влево}

Draw3D;

End;

If Key = '5' Then Begin

Hide3D;

L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;

For I := 1 To N Do Tr3d(A[I], L, A[I]);

Ux := Pi/120; For I := 1 To N Do Ux3d(A[i],Ux,A[i]);

L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;

For I := 1 To N Do Tr3d(A[I], L, A[I]); {смещение фигуры относительно оси х вверх}

Draw3D;

End;

If Key = '6' Then Begin

Hide3D;

L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;

For I := 1 To N Do Tr3d(A[I], L, A[I]);

Ux := -Pi/120; For I := 1 To N Do Ux3d(A[i],Ux,A[i]);

L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;

For I := 1 To N Do Tr3d(A[I], L, A[I]); {смещение фигуры относительно оси х вниз}

Draw3D;

End;

If Key = '7' Then Begin

Hide3D;

L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;

For I := 1 To N Do Tr3d(A[I], L, A[I]);

C.X := 1.1; C.Y := 1.1; C.Z := 1.1;

For I := 1 To N Do Sr3d(A[I], C, A[I]);

L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;

For I := 1 To N Do Tr3d(A[I], L, A[I]); {масштабирование фигуры - приблизить}

Draw3D;

End;

If Key = '9' Then Begin

Hide3D;

L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;

For I := 1 To N Do Tr3d(A[I], L, A[I]);

C.X := 0.9; C.Y := 0.9; C.Z := 0.9;

For I := 1 To N Do Sr3d(A[I], C, A[I]);

L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;

For I := 1 To N Do Tr3d(A[I], L, A[I]); {масштабирование фигуры - удалить}

Draw3D;

End;

End;

Hide3D;

CloseGraph; {закрыть графический режим}

End.

Вывод:

При помощи языка программирования Turbo Pascal создана программа, реализующая трехмерные преобразования с октаэдром. Программа составлена с использованием процедур для отображения и вращения вокруг осей x, y, z. Управление вращением осуществляется с помощью клавиш <1>..<9> на клавиатуре.

3. Проекции

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

Проекция Кабине (рис. 3.) имеет направление проецирования, которое составляет с проекционной плоскостью угол  = arctg(?) (?26,5°). При этом отрезки, перпендикулярные проекционной плоскости, после проецирования составляют ? их действительной длины. Проекции Кабине являются более реалистическими, чем проекции Кавалье, так как укорачивание с коэффициентом ? больше согласуется с нашим визуальным опытом.

Рис. 3. Проекция Кабине

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

Выделяют три класса таких алгоритмов:

1. Алгоритмы, работающие в пространстве объекта. Для определения видимости данной поверхности сравнивается ее взаимное расположение с остальными поверхностями объекта в трехмерной сцене.

* Алгоритм Робертса.

2. Алгоритмы, работающие в пространстве изображения (экрана). Они основаны на нахождении точки ближайшей поверхности, которую пересекает луч зрения, проходящий через заданную точку на растре.

* Алгоритм плавающего горизонта;

* Алгоритм Коэна ? Сазерленда;

* Модифицированный вариант алгоритма Коэна ? Сазарленда;

* Алгоритм с использованием z-буфера;

* Метод трассировки лучей;

* Алгоритм Варнока;

* Алгоритм Вейлера ? Азертона.

3. Алгоритмы, формирующие список приоритетов, работают попеременно в обеих системах координат (объекта и изображения).

* Алгоритм Ньюэла ? Ньюэла ? Санча (алгоритм удаления невидимых граней методом сортировки по глубине;)

Рассмотрим более подробно некоторые алгоритмы удаления невидимых линий и поверхностей.

Алгоритм Робертса

Алгоритм Робертса удаляет из каждого тела те ребра или грани, которые скрываются самим телом. Затем каждое из видимых ребер каждого тела сравнивается с каждым из оставшихся тел для определения того, какая его часть или части, если таковые есть, скрываются этими телами. При этом вычислительная трудоемкость алгоритма Робертса растет теоретически, как квадрат числа объектов. При этом математические методы, используемые в этом алгоритме, просты, мощны и точны.

Алгоритм плавающего горизонта

Алгоритм плавающего горизонта чаше всего используется для удаления невидимых линий трехмерного представления функций, описывающих поверхность в виде F(x, у, z) = 0.

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

Алгоритм сначала упорядочивает плоскости z = const по возрастанию расстояния до них от точки наблюдения. Затем для каждой плоскости, начиная с ближайшей к точке наблюдения, строится кривая, лежащая на ней, т.е. для каждого значения координаты х в пространстве изображения определяется соответствующее значение y.

Если на текущей плоскости при некотором заданном значении x соответствующее значение у на кривой больше значения y для всех предыдущих кривых при этом значении x, то текущая кривая видима в этой точке; в противном случае она невидима.

Используя вышеизложенный математический аппарат, можно составить следующую программу на языке программирования Turbo Pascal.

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

ROGRAM HEXAEDR;

USES Crt, Graph;

VAR Gd, Gm: Integer; {Переменные для работы в графическом режиме}

hex: array[1..8, 1..3] of real; {Массив с координатами вершин}

hex2: array[1..8, 1..2] of integer; {Массив с координатами вершин в проекции}

grani: array[1..6, 1..4] of integer; {Массив граней гексаэдра}

i, j: integer; {Цикловые переменные}

ch: char; {Значение нажатой клавиши}

PROCEDURE Projectiya; {Расчет координат проекции}

CONST UgolX=26.5*Pi/180; {Угол вращения вокруг оси X}

UgolY=26.5*Pi/180; {Угол вращения вокруг оси Y}

BEGIN

For i:=1 To 8 Do Begin

hex2[i,1]:=round(hex[i,1]*cos(UgolY)+hex[i,3]*sin(UgolY))+320;

hex2[i,2]:=290-round(hex[i,1]*sin(UgolY)*sin(UgolX)+hex[i,2]*cos(UgolX)-hex[i,3]*cos(UgolY)*sin(UgolX));

End;

END;

FUNCTION VidimayaGran(i:integer): boolean; {Определение видимости i-й грани}

VAR V1,V2,N: array[1..3] of real;

scalar: real;

BEGIN

{Расчет значений 2-х векторов, лежащих в плоскости грани}

For j:=1 To 3 Do Begin

V1[j]:=hex[grani[i,2],j]-hex[grani[i,1],j];

V2[j]:=hex[grani[i,3],j]-hex[grani[i,1],j];

End;

{Вычисление вектора нормали грани}

N[1]:=V1[2]*V2[3]-V2[2]*V1[3];

N[2]:=V1[3]*V2[1]-V2[3]*V1[1];

N[3]:=V1[1]*V2[2]-V2[1]*V1[2];

{Определение видимости грани}

scalar:=N[1]-N[2]-N[3];

If scalar>0 Then

VidimayaGran:=true

Else

VidimayaGran:=false;

END;

PROCEDURE Draw; {Вывод на экран}

VAR gran: array[1..4] of PointType;

BEGIN

Projectiya;

For i:=1 To 6 Do Begin

If VidimayaGran(i) Then Begin {Если грань видима, то выводим ее на экран}

For j:=1 To 4 Do Begin

gran[j].x:=hex2[grani[i,j],1];

gran[j].y:=hex2[grani[i,j],2];

End;

SetFillStyle(1,i+8); {Устанавливаем цвет и стиль закраски}

FillPoly(4,gran);

End;

End;

END;

PROCEDURE VrachOY(Ugol: real); {Поворот вокруг оси OY}

VAR x,z: real;

BEGIN

For i:=1 To 8 Do Begin

x:=hex[i,1];

z:=hex[i,3];

hex[i,1]:=x*cos(Ugol)+z*sin(Ugol);

hex[i,3]:=-x*sin(Ugol)+z*cos(Ugol);

End;

END;

BEGIN

{Описываем гексаэдр}

hex[1,1]:=30; hex[1,2]:=0; hex[1,3]:=0;

hex[2,1]:=30; hex[2,2]:=150; hex[2,3]:=0;

hex[3,1]:=180; hex[3,2]:=150; hex[3,3]:=0;

hex[4,1]:=180; hex[4,2]:=0; hex[4,3]:=0;

hex[5,1]:=30; hex[5,2]:=0; hex[5,3]:=150;

hex[6,1]:=30; hex[6,2]:=150; hex[6,3]:=150;

hex[7,1]:=180; hex[7,2]:=150; hex[7,3]:=150;

hex[8,1]:=180; hex[8,2]:=0; hex[8,3]:=150;

{и грани}

grani[1,1]:=1; grani[1,2]:=2; grani[1,3]:=3; grani[1,4]:=4;

grani[2,1]:=5; grani[2,2]:=6; grani[2,3]:=2; grani[2,4]:=1;

grani[3,1]:=2; grani[3,2]:=6; grani[3,3]:=7; grani[3,4]:=3;

grani[4,1]:=4; grani[4,2]:=3; grani[4,3]:=7; grani[4,4]:=8;

grani[5,1]:=1; grani[5,2]:=4; grani[5,3]:=8; grani[5,4]:=5;

grani[6,1]:=5; grani[6,2]:=8; grani[6,3]:=7; grani[6,4]:=6;

Gd := Detect;

InitGraph(Gd, Gm, ''); {Инициализация графического режима}

If GraphResult <> grOk Then

Halt(1);

SetBkColor(Blue); {Устанавливаем цвет фона}

ClearDevice; {Очищаем экран}

Draw; {Выводим}

While ch<>#27 Do Begin {Пока не нажата клавиша "Esc", вращаем}

If keypressed Then

ch:=readkey; {Считываем значение нажатой клавиши}

VrachOY(pi/40); {Делаем поворот вокруг оси OY}

ClearDevice; {Очищаем экран}

Draw; {Выводим}

OuttextXY(10,465,'Press <Esc> to Exit');

Delay(8000);

End;

CloseGraph; {Завершение работы в графическом режиме}

END.

Вывод:

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

Заключение

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

Размещено на Allbest.ru


Подобные документы

  • Написание программы вывода графика функции с помощью точек и линий, модификация программы. Программа вывода каркаса вращающегося тора относительно своей оси с одновременным движением по заданной траектории. Создание эффекта сползания текстуры с цилиндра.

    контрольная работа [433,2 K], добавлен 01.12.2009

  • Компьютерная графика и её виды. Векторный графический редактор CorelDraw. Создание изображения панели осциллографа, разработка наглядного изображения. Особенности графических редакторов, изображение панели осциллографа в программе Adobe Illustrator.

    курсовая работа [4,2 M], добавлен 04.05.2023

  • Методика графического отображения табличных данных MS Excel. Создание и редактирование диаграмм. Виды диаграмм, их практическое применение. Возможности программы, последовательность действии при стандартных и специальных операциях. Элементы диаграммы.

    лабораторная работа [13,9 K], добавлен 16.11.2008

  • Закрепление навыков работы с программами пакета MS Office. Создание таблиц в базе данных под управлением программы MS Access, выполнение сортировки, различных видов запросов и диаграммы. Оформление отчета в виде комплексного документа в MS Excel.

    контрольная работа [3,3 M], добавлен 23.12.2014

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

    курсовая работа [2,0 M], добавлен 12.11.2012

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

    контрольная работа [642,0 K], добавлен 21.01.2015

  • Сведения о языке Delphi. Основы разработки баз данных. Разработка конвертера таблицы Excel, интерфейса главной формы, модуля отображения, системы поиска информации, средств редактирования. Системные требования программы. Инструкция по эксплуатации.

    курсовая работа [2,6 M], добавлен 29.12.2008

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

    реферат [38,6 K], добавлен 27.12.2012

  • Составление программы для вычисления по двум формулам одной и той же переменной "X". Создание программы, которая по введенному значению аргумента вычислят значение функции, заданной в виде графика. Вывод на экран значения функции, заданной графически.

    курсовая работа [4,9 M], добавлен 14.03.2014

  • Алгоритм создания базы данных табличного типа для двух объектов в MS Excel, сортировка данных согласно заданным критериям, расчет показателей с использованием статистических функций программы. Прогноз характера изменения объёма продажи оборудования.

    курсовая работа [488,9 K], добавлен 01.02.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.