Компьютерная графика
Создание правильного, наглядного и красивого отображения статистических данных в 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