#define pop() stx[--deep]
#define push(x) stx[deep++] = x
//отрезок симметричным ЦДА
int x0, y0; //Координаты центра системы координат относит. лев. верх.
int hx=3, hy=3; //размер половины пиксела
int sign (int r) //функция определения знака
{
if (r>0) return 1;
else if (r<0) return -1;
else return 0;
}
// Програмирование на Си/С
//Вывод "крупного" пиксела на экран
void point(int ix, int iy, int color)
{
setfillstyle(SOLID_FILL, color);
bar(
x0+hx*2*ix-hx+1,
y0-hy*2*iy-hy+1,
x0+hx*2*ix+hx-1,
y0-hy*2*iy+hy-1);
}
// Построение отрезка методом симметричного ЦДА
void symcda(int x0, int y0, int x1, int y1)
{
int res_x=512, res_y=512; //начальные значения аккумуляторов
int x=x0, y=y0; //начальные координаты точки
int dx=x1-x0, dy=y1-y0; //приращения по осям
int ex=sign(dx), ey=sign(dy);
point (x,y,2); //вывод первого пиксела
while (!(x==x1 && y==y1)) //пока не конец отрезка...
{
res_x+=dx; //добавить к аккумулятору res_x приращение по x
if (res_x>=1024 || res_x<0) //если аккумулятор переполнен или меньше нуля
{
x+=ex; //добавить к x значение функции sign()
point(x,y,2); //и вывести точку на экран
res_x-=ex*1024; //скорректировать содержимое аккумулятора res_x
};
res_y+=dy; //добавить к аккумулятору res_y приращение по y
if (res_y>=1024 || res_y<0)//если аккумулятор переполнен или меньше нуля
{
y+=ey; //добавить к y значение функции sign()
point(x,y,2); //и вывести точку на экран
res_y-=ey*1024; //скорректировать содержимое аккумулятора res_y
}
}
}