я не делал линию, потому что она мне была не нужна. :) я делал круг. смысл алгоритма Брезенхема говорит о том, что рисуем ли мы линию или круг, неважно, при смещении (допустим!) по координате Х от одной точки к другой на 1 дискрет (пиксел) вторая координата НЕ ИЗМЕНИТСЯ больше чем на 1 пиксел. Вот это вообщем квинт-эссенция. нарисуй перед собой воображаемые точки, надо провести линию из левого нижнего в правый верхний угол. смещаешься на 1 пиксел вправо - и надо определить, У координата осталась прежней или увеличилась на 1. Других вариантов нет.
Если из левого верхнего угла в правый нижний, то У может либо не измениться либо уменьшиться на 1 пиксел. Ну и тому подобное для остальных квадрантов смотря куда мы движемся (вверх по У или вниз) и справа налево или слева направо.
Это для линий. Для окружностей рассматривается 8 зон по 45 градусов. в пределах которых изменение второй координаты - монотонно.
исходник ниже
<c>
void bres_circle (unsigned int xc, unsigned int yc,
unsigned int r, unsigned char * image,
unsigned int x_size, unsigned int y_size, unsigned short fill)
{
int x,y,d;
y=r;
x=0;
d=3-2*y;
while (x<=y)
{
if ((xc+x)<x_size&&(yc+y)<y_size)
{
*(image+(xc+x)+(yc+y)*x_size)=fill;
}
if ((xc+x)<x_size&&yc>y)
{
*(image+(xc+x)+(yc-y)*x_size)=fill;
}
if ((xc>x)&&(yc>y))
{
*(image+(xc-x)+(yc-y)*x_size)=fill;
}
if ((xc>x)&&(yc+y)<y_size)
{
*(image+(xc-x)+(yc+y)*x_size)=fill;
}
if ((xc+y)<x_size&&(yc+x)<y_size)
{
*(image+(xc+y)+(yc+x)*x_size)=fill;
}
if ((xc+y)<x_size&&(yc>x))
{
*(image+(xc+y)+(yc-x)*x_size)=fill;
}
if ((xc>y)&&(yc>x))
{
*(image+(xc-y)+(yc-x)*x_size)=fill;
}
if ((xc>y)&&(yc+x)<y_size)
{
*(image+(xc-y)+(yc+x)*x_size)=fill;
}
if (d<0)
{
d=d+4*x+6;
}
else
{
y--;
d+=4*(x-y)+10;
}
x++;
}
return;
}
</c>