Министерство общего и профессионального образования Российской Федерации Уфимский государственный авиационный технически...
4 downloads
226 Views
347KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Министерство общего и профессионального образования Российской Федерации Уфимский государственный авиационный технический университет Кафедра технической кибернетики
МЕТОДИЧЕСКИЕ УКАЗАНИЯ к лабораторным работам по курсу "Интерактивная машинная графика" для подготовки инженеров по специальности 220200 "Автоматизированные системы обработки информации и управления" Часть 2 "Линейчатые графические образы"
Уфа 1997
2
Составитель: О.В. Трушин УДК 681.3.06
Методические указания к лабораторным работам по курсу "Интерактивная машинная графика" для подготовки инженеров по специальности 220200 "Автоматизированные системы обработки информации и управления" Часть 2. "Линейчатые графические образы" / Уфимск. гос. авиац. техн. унив-т; Сост. О. В. Трушин. - Уфа, 1997. - 35 с.
Приведены задания для лабораторных работ по второй части курса "Интерактивная машинная графика", где рассматриваются приемы и методы синтеза линейчатых графических образов с использованием как простых, так и достаточно сложных алгоритмов. Рассматриваемые алгоритмы реализованы на языке Turbo-Pascal_7 в форме, позволяющей при необходимости легко адаптировать их для других систем программирования. Ил. 6 . Библиогр.: 10 наимен.
Рецензенты:
В. Н. Мукасеева М. Е. Сидоров
3
Содержание Стр. Введение ........................................................................................ 4 Лабораторная работа № 1. Алгоритмы синтеза фигур из отрезков прямых ............................ 6 Лабораторная работа № 2. Приемы синтеза линейчатых графических узоров ....................... 12 Лабораторная работа № 3. Применение рекурсии при синтезе графических образов ............. 19 Лабораторная работа № 4. Растровые алгоритмы ................................................................... 26 Список литературы ....................................................................... 34
4 Введение Большинство компьютерных графических образов при ограниченности вычислительных ресурсов чаще всего создается как набор отрезков прямых линий, отображающий обычно каркас моделируемого объекта. Подобные модели объектов легко и быстро можно отображать и при необходимости трансформировать как для статических, так и для динамических сцен, в особенности трехмерных. Объекты при этом кодируются как совокупность набора координат вершин и последовательности обхода контура по этим вершинам. При работе с линиями можно определять их режимы вывода и стили. Для отрезков прямых линий режим построения задается оператором SetWriteMode( N ) N=0 ( режим CopyPut ) - замещение линией изображения на экране, этот режим используется по умолчанию, N=1 ( режим XorPut ). - изображение комбинируется. По логической операции Xor ("исключающее ИЛИ") исходное значение цвета пиксела на экране побитово складывается с цветом пиксела выводимой линии. Результирующий бит равен единице при различных значениях соответствующих бит, иначе - равен нулю. Например, при выводе красной линии на желтом фоне в режиме XorPut получим 0100 ( красный ) Xor 1110 ( желтый ) 1010 ( светло-зеленый) Функция Xor, примененная к одной переменной дважды, восстанавливает ее исходное значение ( J xor I ) xor I = J . При повторном проведении линии на том же месте в режиме XorPut изображение этой линии уничтожается, а цвет пикселов экрана становится исходным Xor
1010 ( светло-зеленый) 0100 ( красный ) 1110 ( желтый )
Этот прием удобно использовать при создании движущихся линейчатых изображений без порчи фонового изображения. Толщину и форму ( стиль ) линий отрезков прямых, прямоугольников, окружностей, эллипсов можно задать оператором SetLineStyle( F, P, T ) , где F - форма, Р - стиль, T - толщина линии.
5 Форма линии задается как: F=0 - сплошная, F=1 - пунктирная, F=2 - штрих-пунктирная, F=3 - штриховая, F=4 - форма линии определится параметром Р, причем при F=max then begin plot:=true; dec( y,max);
inc( p_X,dx)
end;
inc( p_Y,dy)
end;
if plot then putpixel( p_X,p_Y,color); {***} end
end;
При необходимости построения прерывистой линии несложно доработать алгоритм Брезенхейма путем задания маски чередования вывода пикселов. Маску удобно задавать двоичной формой числа, единичные биты которого обозначают вывод, нулевые - пропуск очередного пиксела. Например, добавим после {***} в приведенную выше подпрограмму операторы j:=i mod 16; { выделение очередного бита в маске ( с конца двухбайтового числа) } if (mask shr j) and 1 =0 then plot:=false; При этом удобно определять маску одним из параметров подпрограммы. На рисунке 2 приведено семейство выходящих из одной точки отрезков прямых, полученных при задании маски двухбайтовым числом mask=$0AA8.
Рисунок 2
29 Алгоритм Брезенхейма построения окружности также основан на наращивании контрольных величин и корректировке координат последовательно выводимых пикселов в зависимости от поведения контрольных величин. При этом строится восьмая часть окружности в секторе от 0 до 45 градусов, которая затем восьмикратно отражается для получения полной окружности. PROCEDURE SIM8(xc,yc, p_X,p_Y, color: integer); begin { восьмикратное отображение точки вокруг центра xc,yc } putpixel( xc+p_X, yc+p_Y, color); putpixel( xc+p_X, yc-p_Y, color); { симметрия относительно } putpixel( xc-p_X, yc+p_Y, color); { осей X , Y и центра} putpixel( xc-p_X, yc-p_Y, color); putpixel( xc+p_Y, yc+p_X, color); putpixel( xc+p_Y, yc-p_X, color); { симметрия относительно } о putpixel( xc-p_Y, yc+p_X, color); { осей, повернутых на 45 } putpixel( xc-p_Y, yc-p_X, color) end; {---------------------------------------------------------} PROCEDURE Circle_B(xc,yc,r,color: integer); { Построение окружности по алгоритму Брезенхейма } var p_X, p_Y, d: integer; begin p_Y:=r; p_X:=0; { начальная точка рисования } d:=3-2*r; { начальное значение параметра, по которому корректируем Y } while p_X