Алгоритм вывода прямой линии

Пусть на растре заданы две точкии с целочисленными координатами (рис. 4.1).

Запишем уравнение прямой, проходящей через эти точки

или

(4.1)

где

, , ,

 

Рис. 4.1

Будем рассматривать случай для и

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

Запишем выражение для - координаты математической прямой для :

Вычислим разности

Тогда

Выполним замену в

или

Полагая

получим

, (4.2)

где

(4.3)

(4.4)

Так как , то

Вычитая (2) из (4), получим

но , тогда

При этом

Поэтому

Вычислим начальное значение .

Из (4.2) получаем

(4.5)

Значение соответствует точке .

Точка по условию удовлетворяет уравнению прямой (4.1)

Отсюда

Подставляя полученное значение в выражение (4.3) для , получим

Подставляя полученное выражение для в выражение (4.5) для , получим

Ниже приведен возможный вариант функции для рисования линии между точками и для цветом color для работы с использованием библиотеки классов MFC.

 

 

void Line(CDC& dc,int x1,int y1,int x2,int y2,COLORREF color)

// Алгоритм Брезенхема для прямой y=kx+b, при k<1!!!

// dc – ссылка на контекст устройства

// (x1,y1) – координаты начальной точки

// (x2,y2) – координаты конечной точки

// color – цвет линии

{

int dx=x2-x1;

int dy=y2-y1;

int d=2*dy-dx;

int d1=2*dy;

int d2=2*(dy-dx);

int y=y1;

dc.SetPixel(x1,y1,color);

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

{

if(d<0)d+=d1;

else

{

y++;

d+=d2;

}

dc.SetPixel(x,y,color);

}

}

 

Приведенная ниже функция реализует алгоритм Брезенхема для любых .

 

void MyLine(CDC& dc,int x1,int y1,int x2,int y2,COLORREF color)

// Алгоритм Брезенхема для прямой y=kx+b при любых k

{

int dx=abs(x2-x1);

int dy=abs(y2-y1);

int incX=x2>=x1?1:-1;

int incY=y2>=y1?1:-1;

if(dy<=dx) ///

{

int d=2*dy-dx;

int d1=2*dy;

int d2=2*(dy-dx);

dc.SetPixel(x1,y1,color);

int x=x1;

int y=y1;

for(int i=1;i<=dx;i++)

{

x+=incX;

if(d<0)d+=d1;

else

{

y+=incY;

d+=d2;

}

dc.SetPixel(x,y,color);

}

}///

 

else

{///

int d=2*dx-dy;

int d1=2*dx;

int d2=2*(dx-dy);

dc.SetPixel(x1,y1,color);

int x=x1;

int y=y1;

for(int i=1;i<=dy;i++)

{

y+=incY;

if(d<0)d+=d1;

else

{

x+=incX;

d+=d2;

}

dc.SetPixel(x,y,color);

}

}///

}