Пусть на растре заданы две точки
и
с целочисленными координатами (рис. 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);
}
}///
}