lrgraph
.pdf71
sx:=sx+0.333; {приращение сдвига локальной трехмерной системы относительно глобальной по оси X}
Delay(100); {задержка изображения на каждом шаге перемещения} end;
Readln; {остановка изображения до нажатия любой клавиши}
Closegraph; {выход из графического режима} end.
Варианты задания
Создать программу, реализующую средствами графики языка программирования TurboPascal следующее динамическое изображение:
а) проекция трехмерных координат соответствует варианту, заданному в лабораторной работе №7;
б) вид изображения и тип перемещения соответствует следующим параметрам: Варианты 1-5: линия 1 (0, 0, 0; 0, 90, 0);
линия 2 (40, 0, 0; 40, 90, 0).
1)линия 2 совершает полный оборот вокруг линии 1 по часовой стрелке. Все изображение при этом перемещается вдоль оси Y на 180 пикселей.
2)линия 1 совершает полный оборот вокруг оси X против часовой стрелки, а линия 2 в два раза медленнее вращается вокруг оси X по часовой стрелке. Все изображение перемещается вдоль оси X на 100 пикселей.
3)обе линии синхронно совершают полный оборот вокруг оси Z по часовой стрелке, перемещаясь при этом вдоль ее на 120 пикселей вверх.
4)обе линии совершают полный оборот вокруг оси Z, вращаясь в разные стороны и перемещаясь вдоль оси Y на - 180 пикселей.
5)линия 1 совершает полный оборот против часовой стрелки вокруг оси Z, а линия 2 сдвигается по оси X на -120 пикселей.
Варианты 6-10: линия 1 (0, 0, 0; 110, 0, 0);
линия 2 (55, 0, 0; 55, 60, 0).
72
6) линия 2 совершает полный оборот вокруг оси X по часовой стрелке. Все изображе-
ние перемещается вдоль оси Z на 90 пикселей.
7) линия 1 совершает полный оборот вокруг линии 2 против часовой стрелки. Все изо-
бражение перемещается вдоль оси Y на 180 пикселей.
8) линия 1 совершает полный оборот вокруг оси Z по часовой стрелке, а линия 2 пере-
мещается вдоль оси Z на 120 пикселей.
9)вся система совершает полный оборот вокруг оси Y против часовой стрелки.
10)вся система совершает полный оборот вокруг оси Z по часовой стрелке.
Варианты 11-15: линия 1 (0, 0, 0; 100, 0, 0);
линия 2 (0, 0, 0; 0, 90, 0).
11) линия 1 совершает полный оборот вокруг оси Y против часовой стрелки. Все изо-
бражение сдвигается по оси Z на 90 пикселей.
12) линия 2 совершает полный оборот вокруг оси X по часовой стрелке. Все изобра-
жение сдвигается по оси Y на -120 пикселей.
13) вся система совершает полный оборот вокруг оси Z против часовой стрелки и пе-
ремещается по оси Z на 180 пикселей.
14) линия 2 совершает полный оборот вокруг оси X против часовой стрелки, а линия 1
сдвигается по оси X на -90 пикселей.
15) обе линии, вращаясь в разные стороны, совершают полный оборот вокруг оси Z.
При этом они перемещаются вдоль оси Y на 120 пикселей.
Варианты 16-20: линия 1 (0, 0, 0; 110, 0, 0);
линия 2 (110, 0, 0; 110, 90, 0).
16)линия 1 совершает полный оборот вокруг линии 2 по часовой стрелке. При этом вся система сдвигается вдоль оси X на -120 пикселей.
17)линия 2 совершает полный оборот вокруг оси X против часовой стрелки. Вся сис-
тема сдвигается вдоль оси Z на 180 пикселей.
18) вся система совершает полный оборот вокруг точки соединения по часовой стрел-
ке в плоскости X0Y и перемещается вдоль оси Y на -90 пикселей.
19) линии совершают полный оборот, вращаясь в противоположные стороны в плос-
кости X0Y. При этом вся система перемещается вдоль оси Z на 120 пикселей.
73
20) линия 1 совершает полный оборот вокруг оси Y по часовой стрелке, а линия 2 -
полный оборот вокруг оси X против часовой стрелки.
Варианты 21-24: линия 1 (0, 0, 0; 0, 0, 110);
линия 2 (60, 0, 0; 60, 0, 110).
21) линия 2 совершает полный оборот вокруг линии 1 по часовой стрелке. Все изо-
бражение при этом перемещается вдоль оси Y на 180 пикселей.
22)линия 1 совершает полный оборот вокруг оси X против часовой стрелки, а линия 2
вдва раза медленнее вращается вокруг оси X по часовой стрелке. Все изображение перемеща-
ется вдоль оси X на 100 пикселей.
23)обе линии синхронно совершают полный оборот вокруг оси У, перемещаясь при этом вдоль ее на 120 пикселей.
24)обе линии совершают полный оборот вокруг оси Х, вращаясь в разные стороны и перемещаясь вдоль оси Y на - 180 пикселей.
25)линия 1 вращается вокруг оси Y по часовой стрелке, а линия 2 – против часовой.
При этом перемещаются вдоль оси Y на 150 пикселей, совершив полный оборот.
26) линия 1 вращается по часовой стрелке вокруг оси Y, а линия 2 – вокруг оси Х. При этом они перемешаются вдоль оси Y на 160 пикселей, совершив два оборота
Выполнение лабораторной работы
1.Получить задание у преподавателя.
2.Написать и поэтапно отладить на компьютере программу, реализующую требуемое преобразование изображения.
3.Результат работы программы продемонстрировать преподавателю.
4.Напечатать листинг программы.
Содержание отчета
Отчет включает:
1)содержание задания;
2)блок-схему программы;
74
3) листинг программы.
Контрольные вопросы
1.При каких условиях проявляется некорректность графического изображения моделируемой системы на экране в данной лабораторной работе?
2.Как будет выглядеть алгоритм программы при использовании в данной лабораторной работе только одной графической страницы?
3.Можно ли использовать в качестве переменной цикла сдвиг по координатным осям?
4.Можно ли смоделировать перемещение по разным осям трехмерной системы с разной скоростью?
5.Можно ли в данной лабораторной работе смоделировать изменение размеров перемещающейся системы?
Рекомендуемая литература
Смотри литературу, рекомендованную к лабораторной работе №7.
75
Лабораторная работа №9
Контроль видимости элементов изображения
Цель работы: изучение методов и алгоритмов устранения невидимых линий и участков поверхностей при отображении на экране компьютера трехмерных изображений.
Введение
Анализ результатов выполнения предыдущей лабораторной работы показывает, что в изображении могут возникнуть некорректности, связанные с отображением элементов, которые должны быть в глубине или невидимыми, поверх элементов, находящихся ближе к наблюдателю. Причина некорректности - отсутствие анализа относительного расположения элементов по объему пространства и методов устранения невидимых линий. Линии отображались на экране в соответствии с жестко заданной последовательностью в программе, а не с их естественной последовательностью расположения по глубине моделируемого пространства.
Задача контроля видимости (устранения невидимых линий) оказалась для машинного решения довольно сложной и требующей повышенного расхода машинного времени и оперативной памяти /1/. Основная причина в том, что в общем случае каждый из элементов смоделированного в трехмерном пространстве объекта может быть закрыт, при наблюдении, любым другим элементом. Поэтому при увеличении количества элементов число их взаимных сопоставлений увеличивается в квадрате. К настоящему времени разработан ряд методов и алгоритмов решения подобной задачи /2, 3/: алгоритм Галимберти и Монтанари, алгоритм Варнока, алгоритм Уоткинса, алгоритм Ньюэлла, Ньюэлла и Санча, алгоритм плавающего горизонта, алгоритм Робертса, алгоритм Вейлера-Азертона и др. Для примера кратко рассмотрим суть алгоритма Уоткинса, а затем алгоритма Ньюэлла, Ньюэлла и Санча.
Алгоритм Уоткинса используется в терминалах с телевизионной разверткой изображения. Отображаемый объект мысленно рассекается плоскостями, перпендикулярными поверхности экрана, параллельными одна другой и проходящими по строкам развертки. Каждая такая плоскость определяет совокупность отрезков прямых, представляющих собой результат пересечения граней отображаемого объекта с данной плоскостью. Для формирования изобра-
76
жения в каждой плоскости анализируется эта совокупность отрезков и определяется их поло-
жение относительно пользователя. Так как отрезки, расположенные впереди, закрывают пол-
ностью или частично отрезки, расположенные сзади, то достаточно начертить на линии раз-
вертки только части отрезков, видимые наблюдателю.
Алгоритм Ньюэлла, Ньюэлла и Санча. Идея алгоритма очень проста. Сначала опреде-
ляется порядок расположения всех граней изображаемого объекта по удаленности от наблю-
дателя. Далее все грани поочередно изображаются на экране в порядке их приближения к на-
блюдателю, что приводит к естественному отображению перекрытий граней.
Как указывалось выше, контроль видимости является чрезвычайно сложной задачей и требует большой вычислительной мощности от компьютера. Указанные алгоритмы реализу-
ются обычно специально разработанными графическими программными пакетами или специ-
ально созданными графическими микропроцессорами, которыми оснащаются специализиро-
ванные компьютеры, называемые графическими станциями (еще одно их отличие от других компьютеров - большой экран).
Описание среды программирования
В силу сложности решения задачи контроля видимости элементов ограничимся про-
стейшим вариантом, предполагающим, что пользователь сам определяет условия корректного отображения моделируемого объекта на экране и явно это фиксирует в реализующей про-
грамме.
Пример программы:
Анализ примера, реализованного в предыдущей лабораторной работе, показывает, что некорректность имеет место при совпадении на экране изображений линии 1 и 2. При этом линия 2 находится дальше по оси Х, но изображается поверх линии 1 в соответствии с фикси-
рованным порядком алгоритма программы. Для усложнения задания зададим сдвиг всей сис-
темы по оси Х на -120 пикселей, что приводит и к перекрытию осью Y линии 2 в процессе вращения. Устранить некорректность можно изменением порядка вычерчивания линий 1, 2 и
оси Y. Пока значение координаты Х линии 2 положительно сохраняется порядок, установлен-
ный в предыдущей лабораторной работе, а при отрицательных значениях линия 2 отображает-
77
ся после линии 1 и оси Y. Для уменьшения листинга программы вводятся процедуры отобра-
жения каждой линии и оси Y.
Листинг программы
Program Lr9;
uses {подключение требуемых модулей}
Graph, Crt; var
GraphDriver:integer; {номер графического драйвера}
GraphMode:integer; {номер графического подрежима}
mx, my:word; {параметры масштабирования изображения} k:real; {коэффициент масштабирования изображения}
x11, x12, y11, y12, z11, z12:integer; {координаты линии 1 в локальной системе координат} x21, x22, y21, y22, z21, z22:integer; {исходные координаты линии 2 в локальной системе координат}
x21y, x22y, y21y, y22y, z21y, z22y:real; {координаты линии 2 в локальной системе коор-
динат после поворота вокруг оси Y}
x11m, x12m:integer; {координаты концов линий 1 по оси X после сдвига } x21m, x22m:integer; {координаты концов линии 2 по оси Х после сдвига}
dx, dy:integer; {смещение глобальной трехмерной системы координат относительно ко-
ординатной системы экрана}
ay:real; {угол поворота линии 2 относительно оси Y в радианах} i:integer; {переменная цикла}
sx:real; {сдвиг локальной трехмерной системы координат относительно глобальной} ns:byte; {номер графической страницы}
procedure KY; {процедура вычерчивания оси Y} begin
SetColor(15); {установка цвета для изображения оси}
78
SetLineStyle(0, 0, 1); {установка толщины линий для изображения координатной оси}
Line(320, 200, 580, 316);
Line(580, 316, 574, 308);
Line(580, 316, 569, 316); end;
procedure L1; {процедура вычерчивания линии 1} begin
SetLineStyle(0, 0, 3); {установка толщины линий для изображения перемещающихся элементов}
SetColor(8); {установка цвета линии 1}
Line(dx+Round(0.71*(y11-x11m)), dy+Round(k*0.82*(-z11+0.5*(x11m+ y11))), dx+Round(0.71*(y12-x12m)), dy+Round(k*0.82*(-z12+0.5*(x12m+y12))));
end;
procedure L2; {процедура вычерчивания линии 2} begin
SetLineStyle(0, 0, 3); {установка толщины линий для изображения перемещающихся элементов}
SetColor(13); {установка цвета линии 2}
Line(dx+Round(0.71*(y21y-x21m)), dy+Round(k*0.82*(-z21y+0.5*(x21m+ y21y))), dx+Round(0.71*(y22y-x22m)), dy+Round(k*0.82*(-22y+0.5*(x22m+y22y))));
end; begin
GraphDriver:=3;
GraphMode:=1;
InitGraph(GraphDriver, GraphMode, ''); {запуск графического режима}
GetAspectRatio(mx, my); {определение параметров масштабирования} k:=mx/my; {определение коэффициента масштабирования}
dx:=320; {задание положения глобальной трехмерной системы координат относительно координатной системы экрана}
79
dy:=200;
sx:=50; {задание начального положения локальной трехмерной системы координат отно-
сительно глобальной}
ns:=0; {установка номера активной графической страницы}
SetTextJustify(0,0); {установка стиля выравнивания текста}
SetTextStyle(0, 0, 1); {установка стиля текста}
x11:=0; {координаты линии 1 в локальной системе координат} y11:=0;
z11:=0;
x12:=0;
y12:=100;
z12:=0;
x21:=-50; {координаты линии 2 в локальной системе координат} y21:=0;
z21:=0; x22:=-50; y22:=100; z22:=0;
for i:=0 to 360 do {цикл по углу поворота линии 2 вокруг линии 1} begin
ay:=3.14*i/180; {перевод угла поворота в радианы}
if ns=0 then {смена активной и видимой графических страниц} begin
SetActivePage(0);
SetVisualPage(1) end
else begin
SetActivePage(1);
80
SetVisualPage(0)
end;
SetBkColor(9); {установка цвета фона изображения}
ClearDevice; {очистка активной страницы}
SetColor(15); {установка цвета для изображения координатных осей}
SetLineStyle(0, 0, 1); {установка толщины линий для изображения координатных осей}
Line(320, 200, 320, 10); {отображение координатных осей X и Z}
Line(320, 10, 315, 20);
Line(320, 10, 325, 20);
Line(320, 200, 60, 316);
Line(60, 316, 66, 308);
Line(60, 316, 71, 316);
SetColor(4); {установка цвета для отображения названий осей}
OutTextXY(587, 316, 'Y'); {отображение названий осей}
OutTextXY(310, 10, 'Z');
OutTextXY(50, 316, 'X');
x11m:=Round(x11+sx); {координаты линии 1 по оси X после очередного сдвига} x12m:=Round(x12+sx);
x21y:=x21*cos(ay)+z21*sin(ay); {расчет координат линии 2 в локальной трехмерной системе после поворота вокруг оси Y}
y21y:=y21;
z21y:=-x21*sin(ay)+z21*cos(ay);
x22y:=x22*cos(ay)+z22*sin(ay);
y22y:=y22;
z22y:=-x22*sin(ay)+z22*cos(ay);
x21m:=Round(x21y+sx); {координаты линии 2 после очередного сдвига по оси X}
x22m:=Round(x22y+sx);
if x21m>0 then {порядок вычерчивания элементов при положительных значения ко-
ординаты Х линии 2}