КОМПЛЕКС ЛАБОРАТОРНЫХ РАБОТ 1-9

Методические указания

по выполнению лабораторных работ

Дисциплина

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

 

 

Специальность 220100

«Вычислительные машины, комплексы, системы и сети»

 

Киров,2005


Печатается по решению редакционно-издательского совета

Вятского государственного университета

 

УДК 004.92(07)

Б

 

Рецензент: доктор технических наук, профессор кафедры РЭС А.В. Частиков

 

Блинова С,Д, Комплекс лабораторных работ. Методические указания по выполнению лабораторных работ/ С.Д. Блинова. – Киров: Изд-во ВятГУ, 2005. – ХХ с.

 

 

Редактор Е.Г. Козвонина

 

 

Подписано в печать Усл.печ.л. 1,13

Бумага офсетная Печать копир Aficio 1022

Заказ №441 Тираж 27 Бесплатно

Текст напечатан с оригинал-макета, представленного автором.

 

 

610000, г.Киров, ул. Московская, 36.

Оформление обложки, изготовление – ПРИП ВятГУ

 

 

С.Д. Блинова, 2005

Вятский государственный университет, 2005


Содержание:

 

Лабораторная работа №1. Освоение приемов работы с графическими редакторами на примере Paint и с графическими библиотеками на примере BGI 4

Лабораторные работы №2,3. Реализация алгоритмов растровой развертки линий 11

Лабораторные работы № 4,5 Реализация алгоритмов растровой графики для заполнения сплошных областей. 20

Лабораторная работа № 6 Реализация двумерного алгоритма отсечения отрезка Сазерленда-Коэна. 25

Лабораторная работа № 7 Аффинные преобразования на плоскости. 28

Лабораторная работа № 8. Представление и проецирование трехмерных объектов 33

Лабораторная работа N9 Аффинные преобразования в пространстве. 37


Лабораторная работа №1.
Освоение приемов работы с графическими редакторами
на примере Paint и с графическими библиотеками на примере BGI

Цель работы:

1. Научиться работать в графическом редакторе Paint.

2. Научиться применять в программах на языке высокого уровня основные графические примитивы двумерной компьютерной графики - функции универсальной графической библиотеки BGI.

Краткие теоретические сведения

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

- строку меню

- набор графических операций (2D- или 3D -примитивов),и инструментов (кисть, перо, резиновая нить, ластик, полигон и т.д.)

- поле образцов толщины линий

- палитру доступных цветов для рисования контура и закраски сплошных областей

- строку заголовка, линейки прокрутки.

Позволяют:

· "резать", "склеивать", "стирать", "зеркально отображать", масштабировать, инвертировать, копировать, поворачивать произвольные части изображения

· обращаться через строку меню к библиотеке готовых объектов и вставлять их в создаваемые рисунки

· применять для рисования разнообразные инструменты ("кисти", "краски", трафареты, "пульверизаторы" и т.д.)

· пользоваться разными (в том числе масштабируемыми) шрифтами для создания рекламы, заставок, объявлений.

Paint - простой графический растровый редактор для создания иллюстраций. Запускается щелчком мыши по соответствующей пиктограмме на рабочем столе Windows. Предоставляет стандартный пользовательский набор инструментов для рисования мышью и некоторые сервисные возможности работы с объектами в главном меню простого и интуитивно понятного интерфейса. Можно пользоваться готовыми рисунками и сохранять свои нарисованные (в формате .bmp).

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

1. Запустите программу Paint. Убедитесь, что на палитре цветов заданы: основной цвет (выбор левой клавишей мыши) - черный, фон (выбор правой клавишей мыши)- белый.

2. В меню Рисунок выберите команду Атрибуты. В диалоговом окне Атрибуты задайте ширину рисунка 300 точек и высоту - 200 точек. Закройте окно Атрибуты.

3. Выберите инструмент Эллипс, в палитре настройки инструмента - без заполнения.

4. С помощью клавиши Shift методом протягивания нарисуйте окружность в центре поля диаметром примерно в половину высоты рисунка. Отпустите клавишу Shift.

5. Выберите инструмент Линия. Вариант толщины - второй сверху.

6. С помощью клавиши Shift нарисуйте небольшой горизонтальный отрезок в стороне от окружности.

7. Выберите инструмент Выделение, прозрачный фон.

8. Методом протягивания выделите прямоугольный фрагмент, включающий отрезок прямой, но не затрагивающий окружность. Клавишами Ctrl+X поместите его в буфер обмена.

9. С помощью Ctrl+V вставьте отрезок на рисунок (выделение сохранится).

10. Переместите выделенный фрагмент впритык к окружности слева по центру. Обратите внимание, что фон фрагмента не перекрывает окружность.

11. Повторите пункты 10-11, но отрезок присоедините справа от окружности.

12. Выделите инструмент Текст.

13. Методом протягивания создайте область ввода текста внутри окружности. Введите символ “V”. С помощью панели Шрифты задайте подходящий размер и начертание буквы.

14. Методом перетаскивания за границу области ввода текста поместите букву “V“ в центр окружности.

15. Щелкните вне области ввода текста, чтобы превратить текст в часть рисунка.

16. Сохраните рисунок в файле Scheme.bmp.

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

На растровых графических дисплеях изображение представляется прямоугольной матрицей точек (пикселов) определенного цвета. Для этого компьютер имеет видеоадаптер – устройство, которое хранит в своей памяти, называемой видеопамятью, изображение и обеспечивает регулярное (не менее 75 раз в секунду) отображение этой памяти на экран дисплея. На каждый пиксел изображения отводится фиксированное количество битов видеопамяти, зависящее от ее объема, типа и режима видеоадаптера. Практически каждый видеоадаптер поддерживает несколько режимов работы, различающихся размерами матрицы пикселов (разрешением экрана), количеством одновременно отображаемых на экране цветов, количеством видеостраниц.

Фактически любая графическая операция сводится к работе с отдельными пикселами - нарисовать точку заданного цвета в определенном месте экрана или узнать цвет заданной точки. Точка - простейший примитив 2D-графики. Однако, практически все графические библиотеки предоставляют пользователю и более сложные примитивы - объекты, необходимыми для эффективной работы. Среди объектов можно выделить следующие основные группы:

- линейные изображения(растровые образы линий)

- сплошные объекты (растровые образы закрашенных областей)

- шрифты (текстовые символы)

- изображения (прямоугольные матрицы пикселов).

Как правило, каждый универсальный язык программирования содержит возможность работы с основными группами графических объектов. В среде Turbo Pascal такая возможность обеспечивается библиотекой BGI - Borland's Graphics Interface с набором драйверов (небольших программ сопряжения с видеоадаптерами) для основных типов адаптеров. В начале работы с библиотекой определяется тип имеющегося адаптера и соответствующий драйвер загружается в память, чем достигается почти полная машинная независимость программ. Библиотека находится в модуле Graph, поэтому для работы с ней необходимо использовать оператор uses Graph;

Основные процедуры BGI:

1. Инициализация и завершение работы с библиотекой

procedure InitGraph(var Dr, Mode:integer; DrPath:string) - инициализацирует библиотеку; обязательна и первая из используемых процедур при работе в графическом режиме.

Ее паpаметpы: Dr - тип драйвера, нужно указать соответствующую константу (VGA, например) или значение Detect, тогда библиотека сама оп­ределит тип имеющегося адаптера и выберет для него режим наибольшего разрешения.

Mode - режим работы видеодаптера, нужно указать соответствующую константу (например, VGAHi) или просто переменную. Если Dr=Detect, то параметр Mode не используется.

DrPatch -путь к файлу с драйверами (например,"d:\tp7\bgi")

function GraphResult: integer - возвращает код завершения предыдущей графической операции (значение grOk соответствует успешному завершению)

procedure CloseGraph - завершает работу с библиотекой, закрывает ее, отменяет графический режим работы.

function GetMaxX: integer; function GetMaxY: integer - возвращают максимальное значение соответственно X и Y- координаты пиксела.

Function GetGraphMode: integer - возвращает текущий графический режим

procedure ClearViewPort - очищает экран.

 

2. Работа с отдельными пикселами

 

Procedure PutPixel(x,y : integer; col : word) - рисует точку с координатами (x,y) цвета col

function GetPixel(x,y: integer) : word - возвращает цвет пиксела с координатами (x,y).

 

3. Рисование линейных объектов

procedure SetColor(col:word) - устанавливает цвет линии.

procedure SetLineStyle(style,pattern,width: word) - определяет тип (style) и толщину (width) линии.

По умолчанию линия сплошная (style=SolidLn) и ее толщина равна одному пикселу. Если стандартные параметры не устраивают, можно задать style=UserBitLn, тогда шаблон рисования линии определяется пользователем, задается вторым параметром (pattern= имя восьмибитовой переменной, в которой значение бита 1 означает, что точка ставится, 0 - нет).

procedure Line(x1,y1,x2,y2 : integer) - рисует линию от точки с координатами (x1,y1) до точки с (x2,y2).

procedure Circle(x,y,r : integer) - рисует окружность радиуса r с центром в точке (x,y).

procedure Arc(x, y, StartAngle, EndAngle, r: integer) - рисует дугу окружности радиуса r с центром в точке (x,y), начиная с угла StatrAngle и заканчивая углом EndAngle.

procedure Ellipse(x, y, StartAngle, EndAngle, rx, ry: integer) -рисует эллипс с центром в точке (x,y) и полуосями rx, ry, начиная с угла StatrAngle и заканчивая угломEndAngle.

 

4. Рисование сплошных объектов

 

procedure SetFillStyle(pattern, col: word) - задает шаблон и цвет закраски (по умолчанию белый).

procedure SetFillPattern (pattern: FillPatternType, col: word) -задает пользовательский шаблон и цвет закраски (по умолчанию белый). Тип FillPatternType: typeFillPatternType = array [1..8] of byte; Стандартные шаблоны для закраски: SolidFill (по умолчанию), LineFill, SlashFill и т.д. Если pattern=UserFill - шаблон задает пользователь с помощью процедуры SetFillPattern.

procedure Bar(x1,y1,x2,y2 : integer) - закрашивает прямоугольник с левым верхним (x1,y1) и правым нижним (x2,y2) углами.

procedure FloodFill(x,y: integer, BordCol: word) - закрашивает связную область, ограниченную цветом BordCol и содержащую внутри себя точку с координатами (x,y).

 

5. Вывод текста

 

procedure SetTextStyle (font, direction, size: word) – выбирает шрифт и его параметры. font - задает идентификатор одного из стандартных шрифтов: DefaultFont - растровый шрифт 8*8 пикселов из ПЗУ видеоадаптера. TriplexFont, GothicFont, SansSerifFont, SmallFont - пропорциональные векторные шрифты, входящие в комплект Turbo Pascal (каждый шрифт хранится в файле типа CHR, подгружается в оперативную память по вызову данной процедуры с этим шрифтом). direction - может принимать значения:HorizDir - вывод по горизонтали и VertDir - по вертикали. size - масштабный множитель (1,2,...,10), задает во сколько раз нужно увеличить размер шрифта перед выводом на экран.

procedure OutTextXY(x,y: integer; text: string) - выводит строку текста (text) так, что точка (x,y) оказывается вершиной левого верхнего угла первого символа.

 

6. Изменение палитры

Палитра используется для отображения на экране большего ко­личества цветов, чем имеется в видеопамяти у изображения.

procedure SetPalette (col: word; ColVal: ShortInt) - устанавливает для логического цвета col физический ColVal).

procedure SetRGBPalette (col, RedVal, GreenVal, BlueVal: integer) - устанавливает для логического цвета col значения его RGB-составляющих).

7. Работа с видеостраницами

procedure SetVisualPage (page: word) - устанавливает видимой (изображаемой на экране) страницу номер page (по умолчанию 0).

procedure SetActivePage (page: word) - устанавливает активной (с которой работает библиотека в данный момент и куда происходит весь вывод) страницу номер page (по умолчанию 0).

 

Пример программы с выводом изображения деревьев:

uses Graph,crt;

var

grDriver: Integer; grMode: Integer;

procedure derevo(x,y:integer);{Рисование дерева}

begin

setfillstyle(1,4); bar(x,y,x+10,y-100); { прямоугольник}

setcolor(green); ellipse(x+5,y-160,0,360,20,60); ellipse(x+5,y-160,0,360,19,59);

setfillstyle(1,10); floodfill(x+5,y-160,green);

end;

begin

grDriver := Detect;

InitGraph(grDriver, grMode,'c:\kg\tp7\bgi');{ Инициализация графики }

setcolor(15); { цвет рисования контуров }

setlinestyle(0,0,1); { стиль линий}

line(0,300,640,300);{линия от (0,300) до (640,300)}

setfillstyle(9,10); floodfill(10,400,15); {закраска}

setfillstyle(1,1); floodfill(10,10,15); derevo(50,350); derevo(100,400); derevo(160,310); derevo(200,450); derevo(280,330);setcolor(yellow); circle(540,100,50); {окружность}

setfillstyle(1,yellow); floodfill(540,100,yellow); setfillstyle(1,15); setcolor(15); fillellipse(500,150,25,25);{ закрашенный эллипс}

fillellipse(530,130,30,30); fillellipse(550,150,20,20); fillellipse(530,160,50,20); settextstyle(0,0,2); { стиль текста}

outtextxy(500,450,'Park'); {текст} readkey; {ожидание нажатия клавиши}

end.

Задание на лабораторную работу:

1. Создать рисунок в графическом редакторе Paint с помощью набора инструментов, меню и готовых объектов - рисунков с расширением bmp.

2. Используя примеры из помощи по модулю GRAPH среды TURBO PASCAL написать и выполнить программу на языке PASCAL c основными процедурами библиотеки BGI (можно воспользоваться предложенным примером для вывода деревьев).

 

Требования к защите лабораторной работы

 

Защита лабораторной работы состоит из демонстрации преподавателю результатов выполнения заданий на лабораторную работу и ответов на задаваемые преподавателем вопросы по ходу демонстрации.

 

Требования к отчету

 

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

 

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

 

1. Что такое пиксел, растровое изображение, примитив, палитра, виде­оадаптер видеостраница, режим работы адаптера?

2. Какие основные группы графических объектов предоставляет TurboPascal и в каком виде?

3. Каким образом обеспечивается машинная независимость программы, использующей функции библиотеки BGI?

4. Основное назначение графических редакторов?

5. Основные возможности, предоставляемые пользователям графических редакторов?

 

Литература

 

1. Шикин, Е. В. Компьютерная графика: Динамика, реалист. изображения [текст] / Е. В. Шикин, А. В. Боресков. - М.: ДИАЛОГ-МИФИ, 1996. - 287c.: ил.

2. Боресков, А. В. Компьютерная графика: первое знакомство [текст] / А. В. Боресков, Е. В. Шикин, Г. Е. Шикина; Под ред. Е. В. Шикина. - М.: Финансы и статистика, 1996. - 176c.: ил. - (Диалог с компьютером).

 


Лабораторные работы №2,3.
Реализация алгоритмов растровой развертки линий

Цель работы: закрепить лекционный материал по изучению базовых алгоритмов компьютерной графики - разложению отрезков и окружностей в растр.

 

Краткие теоретические сведения

Поскольку используемые дисплеи - растровые, для представления ге­ометрического объекта на экране необходимо уметь получать его дискретное или растровое представление. Это означает, что заданной геометрической фигуре следует поставить в соответствие множество точек растра, которое в некотором смысле является приближением этой фигуры. Такое представление неоднозначно, т.к. существуют разные понятия и способы приближения непрерывного объекта. Например, растровым приближением круга на плоскости может служить множество внутренних точек круга, а прямой - множество точек - центров ячеек растра, с которыми эта прямая пересекается. Важным является эффективность того или иного представления.

Существуют стандартные процедуры программной или аппаратной реализации алгоритмов генерации линий и закраски многоугольников в различных графических пакетах, но для студентов специальности 220100 необходимо представлять и уметь программно реализовывать такие алгоритмы при работе с устройствами типа дисплея, принтера, плоттера. Необходимость использовать свою версию алгоритма генерации возникает, например, когда атрибуты инициируемого пиксела зависят от каких-либо условий (положения пиксела на прямой или внутри закрашиваемого многоугольника) или когда Вас не устраивает скорость работы "стандартного" алгоритма. Такие ситуации типичны при реализации алгоритмов загораживания (например, растровой реализации одной из версий алгоритма плавающего горизонта или метода буфера глубины).

Разложение отрезка в растр

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

Простой пошаговый алгоритм. Если увеличивать с определенным шагом координату Х, а затем находить координату Y используя уравнение прямой Y=mX+b и подкрашивать пиксел с координатами (Х,ROUND(Y)), то потребуется много времени (на нецелочисленные операции). Если шаг по Х принять равным единице, то m=dY/dX сводится к m=dY, т.е.изменение Х на единицу приведет к изменению углового коэффициента на m. Т.о., если Х(I+1)=X(I)+1,то Y(I+1)=Y(I)+m. Алгоритм корректно работает только для отрезков в первом и восьмом ок­тандах. В остальных случаях требует модификации, что предлагается сделать студентам самостоятельно в ходе выполнения данной лабораторной работы. При модификации следует учесть, что при m>1,единичный шаг по Х пpиведет к такому увеличению Y, при котором две соседние точки на прямой расположатся далеко друг от друга. Поэтому X и Y следует поменять, чтобы увеличивать на единицу Y, а Х - на dX = dY/m = 1/m.

Описание алгоpитма для работы в первом и восьмом октандах :

Дано : m - угловой коэффициент(-1<m<1);

(x1,y1) (x2,y2) - кооpдинаты концов отрезка;

col - цвет для подкрашивания точек отрезка;

Нарисовать_точку (x,y,col) - процедура для подкрашивания цветом col пиксела с координатами(x,y);

Round(x) - функция округления х до ближайшего целого.

Требуется : разложить отрезок в pастp.

1.Если х1 # x2 идти к 2 иначе к 4.

2.m=(y2-y1)/(x2-x1); y=y1;

3.Для x от х1 до х2 выполнить:

начало

Нарисовать_точку(x,Round(y),col);

y=y+m;

конец

4.Если y1=y2 идти к 5 иначе к 6.

5.Нарисовать_точку(x1,y1,col). Идти к 7.

6.Вывести сообщение об ошибке (вертикаль).

7.Закончить.

Целочисленные алгоритмы Брезенхема

Основной недостаток простейшего алгоритма - использование вещественных вычислений. В 1965 году Брезенхемом был предложен целочисленный алгоритм растрового построения отрезка, первоначально предназначенный для графопостроителей. Суть алгоритма в следующем: в процессе работы одна из координат либо х, либо y (в зависимости от углового коэффициента) изменяется на единицу. Изменение другой координаты (на 0 или 1) зависит от расстояния - (е) между действительным положением отрезка и ближайшими координатами растра (е назовем управляющей переменной). Алгоритм построен так, что на каждом шаге проверяется лишь знак е и корректируется ее значение после каждого изменения очередной координаты. Значение исходной управляющей переменной:

е=2*(y2-y1)-(x2-x1),

где x1,y1,x2,y2 - координаты начальной и конечной точек отрезка. В каждом шаге при e>=0 значение y от предыдущего увеличивается на единицу, а е уменьшается на 2*(x2-x1), в противном случае - y не меняется, а значение e увеличивается на 2*(y2-y1). В обоих случаях координата х следующего пиксела увеличивается на единицу от предыдущего значения.

Описание общего алгоритма Брезенхема:

Для восьмисвязной развертки:

Дано: (x1,y1,x2,y2)-координаты начальной и конечной точек отрезка; резка

col - цвет пикселов отрезка;

Нарисовать_точку(x,y,col) - процедура для подкрашивания цветом col пиксела с координатами(x,y);

sign(x) - функция, возвращающая 1,если х>=0 и -1,если x<0;

round(x)- функция округления х до ближайшего целого;

abs(x) - функция, возвращающая целое от х.

Требуется : разложить отрезок в pастp.

1.Присвоить: x=x1; y=y1; dx=abs(x2-x1); dy=abs(y2-y1);

s1=sign(x2-x1); s2=sign(y2-y1);

2.Если dy>dx идти к 3, иначе к 4.

3.Поменять ролями dx и dy.Переменной l присвоить значение "истина". Идти к 5.

4.l присвоить значение "ложь". Идти к 5.

5.Присвоить е исходное значение 2*dy-dx.

6.Для i от 1 до dx выполнить:

начало

Нарисовать_точку(x,y,col); Пока e>=0 выполнить:

начало если l="истина" то x=x+s1 иначе y=y+s2;

e=e-2*dx

конец

Если l="истина" то y=y+s2 иначе x=x+s1; e=e+2*dy

конец

7.Нарисовать_точку(x,y,col).

8.Закончить.

Для четырехсвязной развертки:

Дано: (x1,y1,x2,y2)-координаты начальной и конечной точек отрезка;

сol - цвет пикселов отрезка;

Нарисовать_точку (x,y,col) - процедура для подкрашивания цветом col пиксела с координатами(x,y);

sign(x) - функция, возвращающая 1,если х>=0 и -1,если х<0;

round(x) - функция округления х до ближайшего целого;

abs(x) - функция, возвращающая целое от х;

Требуется : разложить отрезок в pастp.

1.Присвоить: x=x1; y=y1; dx=abs(x2-x1); dy=abs(y2-y1);

s1=sign(x2-x1); s2=sign(y2-y1);

2.Если dy<dx то присвоить переменной l значение "ложь" и идти к 4 иначе идти к 3.

3.Поменять ролями dx и dy. Переменной l присвоить значение "истина". Идти к 4.

4.Присвоить е исходное значение 2*dy-dx.

5.Для i от 1 до dx+dy выполнить:

начало

Нарисовать_точку(x,y,col);

Если e<0 выполнить: начало

если l="истина" то y=y+s2 иначе x=x+s1;

e=e+2*dy

конец иначе выполнить:

начало

если l="истина" то х=х+s1 иначе y=y+s2;

e=e-2*dx

конец

конец

6.Нарисовать_точку(x,y,col).

7.Закончить.

Растровая развертка окружностей

Существуют несколько простых способов преобразования окружности в растровую форму. Например, по формуле X*X+Y*Y=R*R для окружности с центром в начале координат. Чтобы изобразить четверть такой ок ­ружности, на каждом шаге следует поменять Х от 0 до R на единицу и вычислить Y как SQRT(R*R-X*X). Остальные четверти изображают симметрично. Этот метод содержит операции умножения и извлечения корня, потому не эффективен. Кроме того, при Х близких к R, в окружности появляются заметные промежутки, так как при таких Х тангенс угла наклона касательной к окружности стремится к бесконечности. Процесс можно улучшить, если вычислять одну восьмую часть окружности, а остальные семь частей отображать симметрично (в предыдущем случае Х менять от 0 до R/SQRT(2)). Но необходимый эффект можно получить только при работе с целыми числами (алгоритмами, подобными рассмотренным выше). Для генерации окружностей Брезенхем предложил следующий алгоритм:

Дано: rad - радиус окружности

col - цвет пикселов окружности

e - управляющая переменная

Нарисовать_точку(x,y,col) - процедура для подкрашивания цветом col пиксела с координатами(x,y)

Требуется: разложить окружность в растр.

 

1.Присвоить:x=0;y=rad;e=3-2*rad;

2.Пока x<y выполнить:

Нарисовать_точку(x,y,col);

Нарисовать_точку(y,x,col);

Нарисовать_точку(y,-x,col);

Нарисовать_точку(x,-y,col);

Нарисовать_точку(-x,-y,col);

Нарисовать_точку(-y,-x,col);

Нарисовать_точку(-y,x,col);

Нарисовать_точку(-x,y,col)

3.Если е<0 то e=e+4*x+6 и идти к 5 иначе идти к 4.

4.Выполнить: e=e+4*(x-y)+10; y=y-1

5.x=x+1 идти к 2 пока x<y иначе к 6.

6.Если x=y то идти к 7 иначе к 8.

7.Выполнить:

Нарисовать_точку(x,y,col);

Нарисовать_точку(y,x,col);

Нарисовать_точку(y,-x,col);

Нарисовать_точку(x,-y,col);

Нарисовать_точку(-x,-y,col);

Нарисовать_точку(-y,-x,col);

Нарисовать_точку(-y,x,col);

Нарисовать_точку(-x,y,col).

8.Закончить.

Задание на лабораторную работу

1. Написать на языке PASCAL программу, реализующую алгоритмы построения прямой: простой пошаговый алгоритм и алгоритмы Брезенхема для четырех- и восьмисвязной развертки.

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

3. Написать и отладить программу, реализующую два алгоритма построения окружности: по формуле Y=+-SQRT(r*r-x*x) и Брезенхема. В обоих случаях использовать свойство симметрии окружности (в первом - найдя точки четверти окружности, остальные - отразив симметрично; во втором - свойство симметрии использовать полностью).

Дополнительное задание

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

Пример программы работы с мышью:

{

Пример использования мыши в программах на языке Паскаль. Работу с мышью обеспечивает драйвер, отслеживающий перемещения ее курсора, нажатие и отпускание кнопок. Реализация работы идет через механизм прерываний. Номер прерывания - 33h. В регистры помещаются входные и выходные параметры. В языке Паскаль для этих целей используют процедуру Intr(IntNo:Byte;varRegs:Registers) модуля Dos. Нельзя выводить изображение поверх курсора мыши. В случае необходимости нужно убрать курсор, вывести изображение, затем вывести курсор.

}

program mouse;

uses Crt,Graph,Dos;

var

grDriver: Integer;

grMode: Integer;

ErrCode: Integer;

X,Y,X1,Y1:Integer;

L,M,R:Boolean;

BL:Boolean;

{

Инициализация и проверка наличия мыши. Возвращает истину (есть) или ложь (нет) }

function ReadMouse : Boolean;

var

r: Registers;

begin

r.ax:=0;

intr($33,r);

ReadMouse:=r.ax=$ffff;

end;

 

{Визуализировать курсор мыши}

procedure ShowMouseCursor;

var

r:registers;

begin

r.ax:=1;

intr($33,r);

end;

 

{Сделать курсор мыши невидимым (перемещение отслеживается)}

procedure HideMouseCursor;

var

r:registers;

begin

r.ax:=2;

intr($33,r);

end;

 

{Возврат координат положения курсора и нажатой клавиши мыши}

procedure ReadMouseStatus(var x,y:integer;var LB,MB,RB :boolean);

var

r:Registers;

begin

r.ax:=3;

intr($33,r);

x:=r.cx;

y:=r.dx;

LB:=(r.bx And 1) <> 0;

RB:=(r.bx And 2) <> 0;

MB:=(r.bx And 4) <> 0;

end;

 

{Перемещение курсора мыши к указанным координатам}

procedure MoveMouseCursor(x,y:integer);

var r:registers;

begin

r.ax:=4;

r.cx:=x;

r.dx:=y;

intr($33,r);

end;

{

Основная программа. Рисует линию по двум точкам, задаваемым щелчком левой кнопки мыши. По щелчку правой кнопки мыши - выходит из программы

}

begin

grDriver := detect;

InitGraph(grDriver, grMode,'d:\tp7\bgi');

ErrCode := GraphResult;

if ErrCode = grOk then

begin { Do graphics }

L:=false;M:=false;R:=false;Bl:=true;

SetColor(Cyan);

SetBKColor(LightGray);

if ReadMouse then begin

ShowMouseCursor;

While true do

begin

Repeat ReadMouseStatus (X,Y,L,M,R) Until L or R;

If R then begin

CloseGraph;

Exit end;

While L do ReadMouseStatus(X,Y,L,M,R);

if BL then

begin

X1:=X;Y1:=Y;

Bl:=false

end

else

begin

HideMouseCursor;

Line(X1,Y1,X,Y);

ShowMouseCursor;

Bl:=true

end;

end;

end

else

 

begin

RestoreCrtMode;Writeln('error');Halt;

end;

end

else

Writeln('Graphics error:', GraphErrorMsg(ErrCode));

end.

 

Требования к защите лабораторной работы

Защита лабораторной работы состоит из демонстрации препода­вателю результатов выполнения заданий на лабораторную работу и ответов на задаваемые преподавателем вопросы по ходу демонстрации.

 

Требования к отчету

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

 


Вопросы для самоподготовки

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

2. Как избавиться от этого эффекта?

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

4. Каков визуальный эффект при нахождении координаты Y всех точек или одной четверти окружности по формуле Х^2+Y^2=R^2? Как избавиться от этого эффекта?

5. Каким образом в алгоритмах Брезенхема удается избежать нежелательных эффектов при построении точек линий?

 

Литература

1. Фоли, Дж. Основы интерактивной машинной графики [текст]: В 2 кн. кн. 2 / Дж. Фоли, А. Дэм; под ред. Ю. М. Баяковского; пер. с англ. В. А. Галактионова и др. - М.: Мир, 1985. - 368c.: ил.

2. Роджерс, Д. Ф. Алгоритмические основы машинной графики [текст] / Д. Ф. Роджерс; пер. с англ. С. А. Вичеса и др.; Под ред. Ю. М. Баяковского, В. А. Галактионова. - М.: Мир, 1989. - 503c.

3. Шикин, Е. В. Компьютерная графика: Динамика, реалист. изображения [текст] / Е. В. Шикин, А. В. Боресков. - М.: ДИАЛОГ-МИФИ, 1996. - 287c.: ил.

4. Боресков, А. В. Компьютерная графика: первое знакомство [текст] / А. В. Боресков, Е. В. Шикин, Г. Е. Шикина; Под ред. Е. В. Шикина. - М.: Финансы и статистика, 1996. - 176c.: ил. - (Диалог с компьютером).

 


Лабораторные работы № 4,5
Реализация алгоритмов растровой графики для заполнения сплошных областей

Цель работы: Закрепить лекционный материал по изучению базовых алгоритмов компьютерной графики алгоритмов закраски.

 

Краткие теоретические сведения

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

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

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

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

Растровая развертка многоугольников

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

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

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

2. Отсортировать найденные точки по возрастанию координаты х.

3. Закрасить все пикселы между парами точек пересечений. Алгоритм работает только в случае существенных пересечений и четного количества точек пересечений. Нечетное количество получается при пересечении сканирующей строки с локальными минимумами и максимумами, когда Y - координаты предыдущей и последующей вершин больше (меньше) чем у рассматриваемой. В этом случае такие пересечения учитываются как два. После такой корректировки алгоритм будет работать правильно при любой форме многоугольника.

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

Алгоритмы заполнения с затравкой

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

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

 

 

Построчный алгоритм заливки

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

Описание алгоритма:

Дано : Pop(x,y) -процедура извлечения из стека координат (x,y) очередного пиксела

Push(x,y) - процедура помещения в стек координат (x,y) очередного пиксела

Нарисовать_точку(x,y,col) - процедура для подкрашивания цветом col пиксела с координатами(x,y)

с(x,y) - цвет пиксела с координатами (x,y)

cb - цвет для подкрашивания пикселов границы области

ci - цвет для подкрашивания пикселов внутри области

(х0,y0) - координаты затравочного пиксела

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

1.Инициализировать стек:Push(x0,y0).

2.Пока стек не пуст выполнить: начало

Извлечь пиксел из стека и закрасить его в цвет области:

Pop(x,y);

Нарисовать_точку(x,y,ci);

3.Присвоить: xw=x; x=x+1.

4.Пока c(x,y) # cb заполняем интервал справа от затравки:

Нарисовать_точку(x,y,ci); x=x+1;по окончанию идти к 5.

5.Присвоить: xr=x-1; x=xw; x=x-1.

6.Пока c(x,y) # cb заполнть интервал слева от затравки: Нарисовать_точку(x,y,ci);x=x-1; по окончанию идти к 7.

7.Сохранить крайний слева пиксел: xl=x+1;

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

Для j от -1 до 2 с шагом 3 выполнить: начало

x=xl; y=y+j;

Пока x <= xr искать затравку на строке ниже(выше): начало

fl="ложь";

Пока ( c(x,y)#cb and c(x,y)#ci and x<xr ) заполнить точки внутри:

начало

Увеличить х на единицу.

Если (not fl) = "истина" то присвоить fl="истина". конец

Если fl="истина" то крайний справа пиксел - в стек: начало

Если ( x=xr and c(x,y)#cb and c(x,y)#ci ) то Push(x,y) иначе Push(x-1,y).

Присвоить fl="ложь". конец

Продолжить проверку,если интервал был прерван: Присвоить xb=x.

Пока (c(x,y)=cb or c(x,y)=ci and x<xr) увеличить x на 1. Если x=xb то присвоить: x=x+1.

конец

конец

конец пункта 2.

6.Закончить.

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

Задание на лабораторную работу:

1. Написать на языке PASCAL программу, реализующую алгоритм заливки многоугольника любой формы.

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

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

Дополнительное задание

Пункты 2,3 задания выполнить с помощью программ работы с мышью.

Требования к защите лабораторной работы

Защита лабораторной работы состоит из демонстрации преподавателю результатов выполнения заданий на лабораторной работы и ответов на задаваемые преподавателем вопросы по ходу де­монстрации.

Требования к отчету

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

Вопросы для самоподготовки

1. Каким образом можно заполнить многоугольник?

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

3. Как при заполнении сплошных областей можно использовать стек?

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

5. Чем отличаются алгоритмы построчного сканирования от алгоритмов заливки?

Литература

1. Фоли, Дж. Основы интерактивной машинной графики [текст]: В 2 кн. кн. 2 / Дж. Фоли, А. Дэм; под ред. Ю. М. Баяковского; пер. с англ. В. А. Галактионова и др. - М.: Мир, 1985. - 368c.: ил.

2. Роджерс, Д. Ф. Алгоритмические основы машинной графики [текст] / Д. Ф. Роджерс; пер. с англ. С. А. Вичеса и др.; Под ред. Ю. М. Баяковского, В. А. Галактионова. - М.: Мир, 1989. - 503c.

5. Шикин, Е. В. Компьютерная графика: Динамика, реалист. изображения [текст] / Е. В. Шикин, А. В. Боресков. - М.: ДИАЛОГ-МИФИ, 1996. - 287c.: ил.

6. Боресков, А. В. Компьютерная графика: первое знакомство [текст] / А. В. Боресков, Е. В. Шикин, Г. Е. Шикина; Под ред. Е. В. Шикина. - М.: Финансы и статистика, 1996. - 176c.: ил. - (Диалог с компьютером).

 


Лабораторная работа № 6
Реализация двумерного алгоритма отсечения отрезка Сазерленда-Коэна

 

Цель работы: Закрепить лекционный материал по изучению материала темы "Отсечение". Реализовать двумерный алгоритм Сазерленда - Коэна для отсечения отрезка окном прямоугольной формы.

 

Краткие теоретические сведения

Необходимость отсечь выводимое изображение по границам некоторой области (окна) встречается довольно часто, особенно в многооконных диалоговых графических системах. В простейших случаях в качестве отсекающей области выступает прямоугольник. Существует много алгоритмов отсечения для 2D- и 3D-случаев, ориентированных как на программную, так и аппаратную реализацию. Рассмотрим простой и эффективный алгоритм отсечения отрезков границами произвольного прямоугольника. Вся плоскость вывода разбивается прямыми, образующими прямоугольник на девять подплоскостей; каждой из них присваивается четырехбитовый код, в котором единица

в нулевом бите означает, что конец отрезка лежит левее окна,

в первом бите - выше окна,

во втором бите - правее окна,

в третьем бите - ниже окна.

Например, если один конец отсекаемого отрезка лежит в правом верхнем относительно окна углу экрана, он получает код этого угла равный 0110 по схеме:

 

Описание алгоритма Сазерленда - Коэна:

Дано: прямоугольное окно с координатами (xl,ya),(xr,yb) верхнего левого и нижнего правого углов прямоугольника; отрезок с координатами концов (x1,y1) и (x2,y2).

Найти: новые координаты отрезка (x1,y1) и нарисовать его целиком или частично в случае попадания в область окна и не рисовать в противном случае.

1. Присвоить коды (р1 и р2) концам отрезка.

2. Если отрезок полностью невидим(p1 and p2 <> 0), идти к 9, иначе идти к 3.

3. Если отрезок видим полностью (p1 = 0 and p2 = 0) - нарисовать его (провести линию от точки с координатами (х1,y1) до точки - (x2,y2) и идти к 9, иначе идти к 4.

4. Если р1=0 - поменять местами точки (x1,y1) и (x2,y2),чтобы обработка шла каждый раз с точки, находящейся вне окна: х=х1,х1=х2,х2=х,y=y1,y1=y2,y2=y,p1=p2 и идти к 5, иначе идти к 5.

5. Если точка (x1,y1) - слева от окна - найти ее новые координаты по фор­мулам: y1=y1+(y2-y1)*(xl-х1)/(х2-х1), x1=xl и идти к 1, иначе идти к 6.

6. Если точка (x1,y1) - выше окна - найти ее новые координаты по формулам: х1=х1+(х2-х1)*(ya-y1)/(y2-y1), y1=ya и идти к 1, иначе идти к 7.

7. Если точка (x1,y1)- справа от окна - найти ее новые координаты по формулам: y1=y1+(y2-y1)*(xr-х1)/(х2-х1), х1=xr и идти к 1, иначе идти к 8.

8. Если точка (x1,y1) - ниже окна - найти ее новые координаты по формулам: х1=х1+(х2-х1)*(yb-y1)/(y2-y1),y1=yb и идти к 1, иначе идти к 1.

9. Закончить.

Присваивание кода точке с координатами (x,y) (пункт 1 данного алгоритма) можно выполнить, например, следующей программой:

function kod(x,y,xl,ya,xr,yb:integer):byte;

var

kp:byte;

begin

kp:=0;

if x<xl kp:=kp or $01;

if y<ya kp:=kp or $02;

if x>xr kp:=kp or $04;

if y>yb kp:=kp or $08;

kod:=kp

end;

Здесь (xl,ya),(xr,yb) - координаты левого верхнего и пра­вого нижнего углов окна, kod - результирующий код.

Задание на лабораторную работу

Написать на языке PASCAL программу, реализующую алгоритм Сазерленда-Коэна, отсекающий отрезок по границам прямоугольного окна. Для показа результатов работы программы нарисовать на экране окно прямоугольной формы. Задав координаты окна и отрезка, продемонстрировать отсечение отрезка по границам окна. Рассмотреть все возможные случаи расположения отрезка относительно окна.

Дополнительно

Для демонстрации работы алгоритма использовать мышь.

Требования к защите лабораторной работы

Защита лабораторной работы состоит из демонстрации преподавателю результатов выполнения задания на лабораторную работу и ответов на задаваемые преподавателем вопросы по ходу демонстрации.

 

 

Требования к отчету

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

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

1. Что такое отсечение и для чего оно применяется?

2. Какие алгоритмы отсечения Вы знаете?

3. Что является границей отсечения для 2D- 3D- случаев?

4. Можно ли реализовать отсечение аппаpатно, если можно, то в каких случаях это делают?

Литература

7. Роджерс, Д. Ф. Алгоритмические основы машинной графики [текст] / Д. Ф. Роджерс; пер. с англ. С. А. Вичеса и др.; Под ред. Ю. М. Баяковского, В. А. Галактионова. - М.: Мир, 1989. - 503c.

8. Шикин, Е. В. Компьютерная графика: Динамика, реалист. изображения [текст] / Е. В. Шикин, А. В. Боресков. - М.: ДИАЛОГ-МИФИ, 1996. - 287c.: ил.

 

 


Лабораторная работа № 7
Аффинные преобразования на плоскости

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

Краткие теоретические сведения

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

В компьютерной графике чаще всего используют аффинную и декартовую систему координат. Это прямоугольная координатная система, в которой выбирается точка О - начало координат и два приложенных к ней неколлинеарных единичных вектора ex и ey, которые задают оси координат. Если единичные отрезки на осях не равны, система называется аффинной, если равны и угол между осями координат прямой - прямоугольной декартовой.

Однородным представлением n-мерного объекта является его пред­ставление в (n+1)-мерном пространстве, полученное добавлением еще одной координаты - скалярного множителя. При решении задач компью­терной графики однородные координаты обычно вводятся так: произвольной точке М(x,y) на плоскости ставится в соответствие точка M(x,y,1) в пространстве.

Если нам необходимо преобразовать точку на плоскости с координатами (x,y) в другую точку то задача сводится к поиску новых координат для этой точки - (x). В случае аффинных преобразований такой поиск сведется к решению уравнений

где a, b, c, d, m, n - произвольные числа, причем: .

В случае, когда m и n не равны нулю, для представления преобразования в матричной форме нужно исходные и преобразованные координаты точки записать в однородных координатах (x,y,1) и ( ). Тогда в матричной форме общий вид преобразования будет следующим

Наибольшее распространение получили частные случаи аффинных преобразований:

1. Единичное преобразование. Единичная матрица оставляет точку неподвижной.

2. Сдвиг или плоско-параллельный перенос. Матрица переводит точку на m единиц вдоль оси x и на n -вдоль оси y: .

3. Вращение вокруг начала координат. Его матрица осуществляет поворот точки объекта на угол g против часовой стрелки:

4. Вращение вокруг произвольного центра осуществляет поворот вокруг точки (m,n) на угол g против часовой стрелки. Преобразование выполняется как последовательность трех элементарных:

· сдвиг центра вращения (m,n) в начало координат с помощью матрицы сдвига

· поворот на угол g вокруг начала координат с помощью матрицы вращения

· сдвиг точки (m,n) в исходное положение, используя матрицу сдвига

Итоговое преобразование будет выглядеть так:

5.Симметрия относительно оси, проходящей через начало координат осуществляется преобразованием вида

 

При этом, если угол между осью симметрии и осью Ох = w, то угол g=2*w.

Согласно этому, симметрия относительно оси Ох

 

 

оси Оy

 

оси y=x

 

оси y=-x .

6.Масштабирование – увеличение (уменьшение размеров изображения) - в общем случае изменяет форму объекта. Назначается точка, относительно которой производится преобразование.

Масштабирование относительно точки О - начала координат

где kx ,ky - коэффициенты искажения по осям Ox, Oy соответственно.

При kx=ky=k осуществляется преобразование подобия, при kx # ky изображение искажается. Изображение увеличивается при k > 1 и уменьшается при k < 1.

Масштабирование относительно произвольной точки с координатами (m, n)

 

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

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

Для возвращения к исходному состоянию следует использовать матрицу обратную той, что использовалась при преобразовании.

Для эффективной работы с преобразованиями следует руководствоваться следующими рекомендациями :

- лучше умножение на результирующую матрицу, чем последовательность умножений

- лучше масштабировать, а потом поворачивать, чем поворачивать, а затем масштабировать

- если комбинированное преобразование содержит поворот, то его следует делать отдельно и последним

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

В уравнении для поворота, например, если угол поворота g равен нескольким градусам, то cos g можно принять равным единице, тогда Еще лучше

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

Задание на лабораторную работу:

Написать на языке PASCAL программу:

1. Рисующую многоугольник.

2. Смещающую его на n пикселов вправо и m вниз.

3. Зеркально отражающую его относительно осей координат.

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

5. Вращающую его относительно центра с координатами (k,l) по часовой стрелке с увеличением размеров, против - с уменьшением.

Дополнительно

Задание выполнить с помощью программ работы с мышью.

 

Требования к защите лабораторной работы

Защита лабораторной работы состоит из демонстрации преподавателю результатов выполнения задания на лабораторную работу и ответов на задаваемые преподавателем вопросы по ходу демонстрации.

 

Требования к отчету

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

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

1. Что такое аффинные преобразования и однородные координаты? Где и для чего однородные координаты используются в компьютерной графике?

2. Можно ли и каким образом, при помощи троек однородных координат и матриц третьего порядка описать любое аффинное преобразование плоскости?

3. Какие системы координат используются в компьютерной графике? Чем различаются мировая и приборная системы координат? Что такое абсолютные и относительные координаты, когда применяются те и другие?

4. Перечислите основные свойства аффинных преобразований, снискавшие им широкое распространение,

5. Чем характерна декартова система координат?

Литература

1. Фоли, Дж. Основы интерактивной машинной графики [текст]: В 2 кн. кн. 2 / Дж. Фоли, А. Дэм; под ред. Ю. М. Баяковского; пер. с англ. В. А. Галактионова и др. - М.: Мир, 1985. - 368c.: ил.

2. Роджерс, Д. Ф. Алгоритмические основы машинной графики [текст] / Д. Ф. Роджерс; пер. с англ. С. А. Вичеса и др.; Под ред. Ю. М. Баяковского, В. А. Галактионова. - М.: Мир, 1989. - 503c.

3. Шикин, Е. В. Компьютерная графика: Динамика, реалист. изображения [текст] / Е. В. Шикин, А. В. Боресков. - М.: ДИАЛОГ-МИФИ, 1996. - 287c.: ил.

4. Боресков, А. В. Компьютерная графика: первое знакомство [текст] / А. В. Боресков, Е. В. Шикин, Г. Е. Шикина; Под ред. Е. В. Шикина. - М.: Финансы и статистика, 1996. - 176c.: ил. - (Диалог с компьютером).

 


Лабораторная работа № 8.
Представление и проецирование трехмерных объектов

Цель работы: Научиться применять математический аппарат проекций для визуализации объемных геометрических тел.

Краткие теоретические сведения

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

· центра проецирования в бесконечности,

· вектора проецирования и проецирующих лучей, параллельных данному вектору,

· проецирующей (картинной) плоскости.

При центральном проецировании явно задаются:

· координаты точки - центра проецирования,

· картинная плоскость.

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

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

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

Матрицы проецирования

1. Одноточечные (имеющие одну точку схода) центральные проекции характеризуются следующим: плоскость проекции совпадает с координатной Z=0, центр проекции имеет координаты (0,0,-d). Матрица проецирования имеет вид .

 

 

Для получения проекции точки в пространстве с координатами (x,y,z,1) необходимо найти ее новые однородные, а затем - новые координаты ( ) так

2. Ортографические (вид спереди, сверху, сбоку) параллельные проекции: картинная плоскость совпадает с одной из координатных, направление проецирования - с одной из главных осей.

Матрица проецирования вдоль оси Х на плоскость YOZ

При построении вида сбоку х – координату точки проекции заменяют координатой z, y - координата остается без изменения.

 

Вдоль оси Y на плоскость XOZ:

При построении вида сверху y – координату точки проекции заменяют координатой z. x - координата остается без изменения.

Вдоль оси Z на XOY:

При построении вида спереди координаты z точек проекции отбрасываются.

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

Общий вид матрицы таких проекций: ,

где p и f - углы, которые нормаль к картинной плоскости образует с ортами координатных осей (соответственно OY и OX).

Для построения стандартной изометрии следует взять p равным 45, f - 35.264 градусам. Для стандартной диметpии: p=22.208,f=20.705 градусов. При других значениях углов получается тpиметpию. Значения углов в матрицу подставляются в радианах.

4. Косоугольная параллельная аксонометрия - проекторы не перпендикулярны картинной плоскости, которая совпадает (параллельна) с одной из координатных плоскостей. Самые простые и наглядные из косоугольных - фронтальные проекции (картинная плоскость параллельна XOZ).Из них - косоугольная фронтальная диметрия (кабине) и косоугольная фронтальная изометрия (кавалье). Матрицы для этих двух проекций выглядят так: ,

где l = 1 для кавалье и 0.5 для кабине, π=3.14159.

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

.

В данной лабораторной работе достаточно описать 3D-объект координатами его вершин. Например, брусок с длинами сторон по Х,Y,Z = (30,50,70) пикселов:

type

TXYZ=record x,y,z:integer; end;

const V:array[0..7] of TXYZ= (

(x:-15;y: 25;z:-35),

(x:-15;y:-25;z:-35),

(x: 15;y:-25;z:-35),

(x: 15;y: 25;z:-35),

(x: 15;y: 25;z: 35),

(x: 15;y:-25;z: 35),

(x:-15;y:-25;z: 35),

(x:-15;y: 25;z: 35)

);


Задание на лабораторную работу: