Растровая развертка отрезка

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

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

3.1 Растровая развертка отрезка

Достаточно важным понятием для растровой сетки является связность - возможность соединения двух пикселей растровой линией, то есть последовательным набором пикселей. При этом возникает вопрос, когда пиксели(Х11) и (X2,y2) можно считать соседними. Вводится два понятия связности:

- 4-связность, когда пиксели считаются соседними, если либо их х-координаты, либо у-координаты отличаются на единицу, то есть |х1-х2| + |y1-y2|≤1;

 
  Растровая развертка отрезка - student2.ru

Рис.68

- 8-связность, когда пиксели считаются соседними, если их х- и у-координаты отличаются не более чем на единицу, то есть |x1 – x2| ≤ 1, |у1 – У2| ≤ 1

 
  Растровая развертка отрезка - student2.ru

Рис.69

Так как понятие линии базируется на понятии связности, то естественным образом возникает понятие 4- и 8-связных линий. Поэтому, когда мы говорим о растровом представлении, например, отрезка, то следует ясно понимать, о каком именно представлении идет речь. При этом нужно иметь в виду, что растровое представление объекта не является единственным и возможны различные способы построения.

В качестве линии на растровой сетке выступает набор пикселей P1, P2, …, Pn, где любые два пикселя Pi,Pi+1 являются соседними.

             
             
             
             
             

Растровая развертка отрезка - student2.ru Рис.70

Рассмотрим задачу построения растрового изображения отрезка, соединяющего точки (x1,y1) и (x2,y2).

Для простоты будем считать, что 0 ≤ y2-y1 ≤ x2-x1

Растровая развертка отрезка - student2.ru Тогда отрезок описывается следующим уравнением

 
  Растровая развертка отрезка - student2.ru

Рис.71

Простейший алгоритм растрового представления отрезка имеет вид:

//File Linel.cpp

void Line(int xl, int yl, int x2, int y2, int color)

{

double k=(y2-yl)/(x2-xl);

double b=yl-k*xl;

for (int x=xl; x<=x2; x++)

putpixel (x, round (k*x+b), color);

}

Алгоритм Брезенхейма

В 1965 году Брезенхеймом был предложен простой целочисленный алгоритм для растрового построения отрезка, первоначально предназначенный для использования в графопостроителях

При построении растрового изображения отрезка всегда выбирается ближайший по вертикали пиксель. При этомиз двух точек А и В выбирается та, которая ближе к исходной прямой (в данном случае выбирается точка А, так как а<Ь). Для этого вводится число d, равное (x2 – x1)(b — а).

В случае d>0 значение у от предыдущей точки увеличивается на 1, a d -на 2(∆у — ∆х)

В противном случае значение у не изменяется, а значение d заменяется на 2∆у.

//File Line2.cpp

void Line{int xl, int yl, int x2, int y2, int color)

{

int dx=x2-xl;

int dy=y2-yl;

int d=(dy<<l)-dx;

int dl=dy << l;

int d2=(dy-dx) << l;

putpixel (xl, yl, color);

for (int x=x1+1, y=yl; x<=x2; x++)

{

if (d>0)

{

d+=d2;

y+=1;

}

else

d+=d1;

putpixel (x, y, color);

}

}

Наши рекомендации