11496

Алгоритмы растровой графики

Практическая работа

Информатика, кибернетика и программирование

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

Русский

2013-04-08

153 KB

6 чел.

Алгоритмы растровой графики

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

Рис. 28. Растеризация отрезка прямой линии.

Термин “пиксел” образован от английского pixel (picture element - элемент изображения)  - то есть точка на экране. Будем считать, что пикселы имеют целочисленные координаты. На первый взгляд кажется, что эта задача имеет простое решение. Пусть конечные точки отрезка имеют целочисленные координаты, и уравнение прямой, содержащей отрезок: . Не нарушая общности, будем также считать, что тангенс угла наклона прямой лежит в пределах от 0 до 1. Тогда для изображения отрезка на растре достаточно для всех целых , принадлежащих отрезку, выводить на экран точки с координатами . Однако в этом методе присутствует операция умножения . Хотелось бы иметь алгоритм без частого использования операции умножения вещественных чисел. Избавиться от операции умножения можно следующим образом. Поскольку , то один шаг по целочисленной сетке на оси  будет соответствовать . Отсюда получаем, что  будет увеличиваться на величину . Итерационная последовательность выглядит следующим образом:

,  

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

Для вывода формул алгоритма Брезенхема рассмотрим рис. 29.

Рис. 29. Рисование отрезков прямых по методу Брезенхема.

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

, ,

 

.

Поскольку знак  совпадает со знаком разности , то будем проверять знак выражения . Так как  и , то .

Пусть на предыдущем шаге , тогда  и . Если же на предыдущем шаге , то и .

Осталось узнать как вычислить . Так как при :

, .

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

Procedure Bresenham(x1,y1,x2,y2,Color: integer);

var

dx,dy,incr1,incr2,d,x,y,xend: integer;

begin

 dx:= ABS(x2-x1);

 dy:= Abs(y2-y1);

 d:=2*dy-dx;  {начальное значение для d}

 incr1:=2*dy;  {приращение для d<0}

 incr2:=2*(dy-dx); {приращение для d>=0}

  if x1>x2 then  {начинаем с точки с меньшим знач. x}

 begin

 x:=x2;

 y:=y2;

 xend:=x1;

end

else

begin

 x:=x1;

 y:=y1;

 xend:=x2;

end;

PutPixel(x,y,Color); {первая точка отрезка}

 While x<xend do

 begin

x:=x+1;

  if d<0 then

    d:=d+incr1  {выбираем нижнюю точку}

  else

begin

 y:=y+1;

 d:=d+incr2; {выбираем верхнюю точку, y-возрастает}

end;

  PutPixel(x,y,Color);

 end;{while}

end;{procedure}


 

А также другие работы, которые могут Вас заинтересовать

65176. Математик, которого я знаю – Франсуа Виет 77.7 KB
  Франсуа Виет 1540-1603 Родился в 1540 году на юге Франции в небольшом городке Фантенеле Конт французской провинции Пуату Шарант в 60 км от Ла Рошели. Его отец Этьен Виет прокурор. Благодаря связям матери Маргариты Дюпон и браку своей ученицы с принцем...
65178. Математик, которого я знаю – Фалес Милетский 214.65 KB
  Фалес Милетский жил в самом конце 7 первой половине 6 в до н. Фалес Милетский был уроженцем греческого торгового города Милета расположенного в Малой Азии на берегу Эгейского моря.
65179. Математик, которого я знаю – Карл Гаусс 54 KB
  Сам того не подозревая Гаусс переоткрыл формулу для определения суммы членов арифметической прогрессии. Талант юного математика не остался без внимания герцога Брауншвейгского и в 1788 при его поддержке Гаусс поступил в закрытую школу Коллегиум...
65181. Математик, которого я знаю – Леонард Эйлер 38.96 KB
  Леонард Эйлер родился 15 апреля 1707 года в швейцарском городе Базеле. Его отец Павел Эйлер был пастором в Рихене близ Базеля и имел некоторые познания в математике. В 1725 году Эйлер узнает что для него есть место в качестве физиолога при медицинском...
65184. Основание Болонской Академии и творчество Аннибале Каррачи 16.44 KB
  Есть вечный идеал красоты заявляли братья Карраччи он воплощён в искусстве античности Возрождения и прежде всего в творчестве Рафаэля. Его уровень зависел по мнению братьев Карраччи не только от ловкости кисти но и от образования...