Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lrgraph

.pdf
Скачиваний:
12
Добавлен:
11.03.2016
Размер:
749.88 Кб
Скачать

71

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}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]