Пример со страницы 16:
//Генерация точек отрезка методом симметричного ЦДА
#include <conio.h>
#include <graphics.h>
int x0, y0; //Координаты центра системы координат относит. лев. верх. угла
int hx=3, hy=3; //1/2 ширины и длины пиксела
//Функция определения знака целого числа
int sign (int r)
{
if (r>0) return 1;
else if (r<0) return -1;
else return 0;
}
//Вывод "крупного" пиксела на экран
void point( int ix, int iy )
{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); //Выводим первый пиксел
while (!(x==x1 && y==y1)) //Цикл пока не дойдем до конца отрезка
{
res_x+=dx;
//Проверка аккумулятора
if (res_x>=1024 || res_x <0)
{
x+=ex;
point(x,y);//Вывод очередного пиксела
res_x-=ex*1024;
}
res_y+=dy;
//Проверка аккумулятора
if (res_y>=1024 || res_y<0)
{
y+=ey;
point(x,y);//Вывод очередного пиксела
res_y-=ey*1024;
}
}
}
void main()
{
int gdriver=DETECT, gmode;
initgraph (&gdriver, &gmode, "");
x0=getmaxx()/2; y0=getmaxy()/2;
moveto(0,y0); linerel(getmaxx(),0);
moveto(x0,0); linerel(0, getmaxy());
symcda(0,0,5,3); //Вывод отрезка
getch(); //Ожидание нажатия клавиши
closegraph(); //Выключение графического режима
}
Пример со страницы 17:
//Метод простого ЦДА
#include<conio.h>
#include<graphics.h>
#include<math.h>
int x0, y0; //Координаты центра системы координат относит. лев. верх. угла
int hx=3, hy=3; //1/2 ширины и длины пиксела
//Функция определения знака целого числа
sign(int r)
{
if(r>0) return 1;
else if(r<0) return -1;
else return 0;
}
//Вывод "крупного" пиксела на экран
void point(int ix, int iy)
{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 line_cda(int x0,int y0,int x1,int y1)
{
int l,x,y;
if(abs(x1-x0)>abs(y1-y0)) l=abs(x1-x0);
else l=abs(y1-y0);
if(l==0) {point(x0,y0); return;}
float hhx=1, hhy=1;
float dx=(float)((x1-x0)/float(l));
float dy=(float)((y1-y0)/float(l));
int ex=sign(x1-x0), ey=sign(y1-y0);
float rez=0.5; //аккумулятор
x=x0; y=y0;
int flagx=0, flagy=0; //флаги для проверки на конечную точку
do
{
if(abs(dx)<abs(dy))
{
//приращение всегда по у, а по х при условии rez<=0 rez>=1
point(x,y);
rez+=dx;
if(rez>=1||rez<=0)
{
x+=ex*hhx;
rez-=ex;
}
if(!flagx) flagx=x==x1?1:0;
y+=ey*hhy;
if(!flagy) flagy=y==y1?1:0;
}
else
{
//всегда по х, а по у при условии rez<=0 rez>=1
point(x,y);
x+=ex*hhx;
if(!flagx)flagx=x==x1?1:0;
rez+=dy;
if(rez>=1||rez<=0) {y+=ey*hhy; rez-=ey;}
if(!flagy)flagy=y==y1?1:0;
}
}
while(!(flagx==1 && flagy==1));
point(x1,y1); //последняя точка
}
void main()
{
int gdriver=DETECT, gmode;
initgraph (&gdriver, &gmode, "");
x0=getmaxx()/2; y0=getmaxy()/2;
moveto(0,y0); linerel(getmaxx(),0);
moveto(x0,0); linerel(0, getmaxy());
line_cda(0,0,5,3); //Вывод отрезка
getch(); //Ожидание нажатия клавиши
closegraph(); //Выключение графического режима
}
Пример со страницы 20:
//Метод Брезенхема
#include<conio.h>
#include<graphics.h>
#include<math.h>
int x0, y0; //Координаты центра системы координат относит. лев. верх. угла
int hx=3, hy=3; //1/2 ширины и длины пиксела
//Вывод "крупного" пиксела на экран
void point(int ix, int iy)
{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 bresenham(int ix0, int iy0, int ix1, int iy1)
{
int ix, iy, delta_x, delta_y, esh, sx, sy;
int register temp, swab, i;
ix=ix0; iy=iy0;
delta_x=abs(ix1-ix0); delta_y=abs(iy1-iy0);
if (ix1-ix0>=0) sx=1; else sx=-1;
if (iy1-iy0>=0) sy=1; else sy=-1;
if (ix1==ix0) sx=0;
if (iy1==iy0) sy=0;
//Обмен значений delta_x delta_y в зависимости от угла
if (delta_y > delta_x)
{
temp=delta_x;
delta_x=delta_y;
delta_y=temp;
swab=1;
}
else swab=0;
//Инициализация Е с поправкой на половину пиксела
esh=2*delta_y-delta_x;
for(i=0;i<=delta_x;i++)
{
point(ix,iy);
while(esh>=0)
{
if (swab==1) ix=ix+sx; else iy=iy+sy;
esh=esh-2*delta_x;
}
if (swab==1)iy=iy+sy; else ix=ix+sx;
esh=esh+2*delta_y;
}
}
void main()
{
int gdriver=DETECT, gmode;
initgraph (&gdriver, &gmode, "");
x0=getmaxx()/2; y0=getmaxy()/2;
moveto(0,y0); linerel(getmaxx(),0); //Вывод осей координат
moveto(x0,0); linerel(0, getmaxy());
bresenham(0,0,5,3); //Вывод отрезка
getch(); //Ожидание нажатия клавиши
closegraph(); //Выключение графического режима
}
Пример со страницы 22:
#include <conio.h>
#include <graphics.h>
#include <math.h>
int x0, y0 , 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)
{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 line4 (int x0, int y0, int x1, int y1)
{
int x=x0, y=y0;
int dx=x1-x0, dy=y1-y0;
int delta=0, ex=sign(dx), ey=sign(dy);
point (x,y);
//Если dx = 0, то выводится вертикальный отрезок
if (dx==0)
{while (y!=y1) point (x, ++y); return;}
//Если dy = 0, то выводится горизонтальный отрезок
if (dy==0)
{while (x!=x1) point (++x, y); return;}
//Если abs(dx) = abs(dy):
if (abs(dx)==abs(dy))
{
while (x!=x1) {x+=ex; y+=ey; point(x,y);}
return;
}
//Основной цикл
while (!(x==x1 && y==y1))
{
if (delta<=0)
{
if (dy*ex-dx*ey>0)
{
x+=ex; y+=ey; delta+=dy*ex-dx*ey;
point(x,y);
}
else
if (abs(dx)>abs(dy))
{
x+=ex; delta+=dy*ex;
point(x,y) ;
}
else
{
y+=ey; delta -=dx*ey;
point(x,y);
}
}
else
{
if (dy*ex-dx*ey<0)
{
x+=ex; y+=ey; delta+=dy*ex-dx*ey;
point(x,y);
}
else
if (abs(dx)>abs(dy))
{
x+=ex; delta+=dy*ex;
point(x,y);
}
else
{
y+=ey; delta-=dx*ey;
point(x,y) ;
}
}
}
}
void main()
{
int gdriver=DETECT, gmode;
initgraph(&gdriver, &gmode, "");
x0=getmaxx()/2; y0=getmaxy()/2;
moveto(0,y0); linerel(getmaxx(),0);
moveto(x0,0); linerel(0, getmaxy());
line4(0,0,5,3);
getch();
closegraph();
}
Пример со страницы 24:
//Метод приращений использующий четыре перемещения
#include<conio.h>
#include<graphics.h>
#include<math.h>
int x0, y0; //Координаты центра системы координат относит. лев. верх. угла
int hx=3, hy=3; //1/2 ширины и длины пиксела
//Вывод "крупного" пиксела на экран
void point(int ix, int iy)
{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 line4(int x0, int y0, int x1, int y1)
{
int dx=abs(x1-x0), dy=abs(y1-y0);
int ex, ey;
if (x1>x0) ex=1; else ex=-1;
if (y1>y0) ey=1; else ey=-1;
int E=0, x=x0, y=y0;
while((y!=y1) || (x!=x1))
{
point(x,y);
if (E>0) {E-=dx; y+=ey;} else {E+=dy; x+=ex;}
}
point(x,y);
}
void main()
{
int gdriver=DETECT, gmode;
initgraph (&gdriver, &gmode, "");
x0=getmaxx()/2; y0=getmaxy()/2;
moveto(0,y0); linerel(getmaxx(),0); //Вывод осей координат
moveto(x0,0); linerel(0, getmaxy());
line4(0,0,5,3); //Вывод отрезка
getch(); //Ожидание нажатия клавиши
closegraph(); //Выключение графического режима
}
Пример со страницы 25:Построение границы многоугольника с использованием алгоритма Брезенхема и закраски многоугольника с использованием алгоритма с запоминанием точек границы в стек.
#include <math.h>
#include <conio.h>
#include <graphics.h>
#define pop() stx[--deep]
#define push(x) stx[deep++]=x
void horline (int y, int x0, int x1)
{
int i;
if (x0>x1) {i=x1; x1=x0; x0=i;}
for (i=x0; i<=x1; i++) putpixel(i, y,15 );
}
void fl(int *arx, int *ary, int dimar)
{
int deep=0;
int stx[1000];
int i0, iglob, ix0, iy0, ix1, iy1;
int ymin;
int ix, iy, deltax , deltay, esh, sx, sy;
int temp, swab, i;
//Находим наименьший ary[i]
i0=0; ymin=ary[0];
for (i=0;i<dimar;i++)
if (ary[i]<ymin) {i0=i; ymin=ary[i];}
//на отрезке (i, i+1) проводим прямую линию от
//arx[i], ary[i] до arx[i+1], ary[i+1]
iglob=i0;
do
{
ix0=arx[iglob]; iy0=ary[iglob];
iglob++; if (iglob==dimar) iglob=0;
ix1=arx[iglob]; iy1=ary[iglob];
//Основной цикл - вывод отрезка по алгоритму Брезенхема
ix=ix0; iy=iy0;
deltax=abs(ix1-ix0);
deltay=abs(iy1-iy0);
if (ix1-ix0>=0) sx=1;
else sx=-1;
if (iy1-iy0>=0) sy=1;
else sy = -1;
if (deltay>deltax)
{
temp=deltax;
deltax=deltay;
deltay=temp;
swab=1;
}
else
swab = 0;
esh=2*deltay-deltax;
for (i=1;i<=deltax;i++)
{
while (esh>=0)
{
if (swab==1) ix = ix + sx;
else
{
iy=iy+sy;
if (sy==1) push (ix);
if (sy==-1)
{
temp=pop();
horline(iy,ix,temp);
}
}
esh=esh-2*deltax;
}
if (swab==1)
{
iy=iy+sy;
if (sy==1) push(ix);
if (sy==-1)
{
temp=pop();
horline(iy,ix,temp);
}
}
else ix=ix+sx;
esh=esh+2*deltay;
}
}
while (i0!=iglob);
}
void main()
{
int gd=DETECT, gm;
int arx[3]={200,150,100};
int ary[3]={120,180,60};
initgraph (&gd, &gm, "");
fl(arx,ary,3);
getch();
closegraph() ;
}
Пример со страницы 28: Закрасить квадрат со стороной 40 пикселов, используя алгоритм заполнения с установкой режима XOR_PUT. Левой верхней вершиной квадрата является точка с координатами (20,20). В качестве перегородки использовать вертикальную линию x=80.
#include<conio.h>
#include<graphics.h>
#include<math.h>
#include<dos.h>
//xпред, yпред
int oldx,oldy;
//Функция сравнивает текущею точку обхода периметра
//с предыдущей и выполняет соответствующие действия
//в качестве параметров передаются координаты текущей точки
void XorLine(int x, int y)
{
if (y>oldy) line(x,y,80,y);
if (y<oldy) line(oldx,oldy,80,oldy);
oldx=x; oldy=y; //текущая точка становится предыдущей
}
void main()
{
int i, gdriver=DETECT, gmode;
//иницализация графического режима
initgraph (&gdriver, &gmode, "");
setcolor(RED); //установка красного цвета
rectangle(19,20,60,61); //рисование периметра квадрата (необязательно)
line(80,20,80,60); //рисование перегородки (необязательно)
setcolor(WHITE); //установка белого цвета
setwritemode(XOR_PUT); //установка режима вывода XOR_PUT
oldx=20; oldy=20; //инициализируем предыдущие координаты
//проход по левой стороне квадрата с задержкой
for(i=20;i<=60;i++) {XorLine(20,i); delay(200);}
//проход по нижней стороне квадрата
for(i=20;i<=60;i++) XorLine(i,60);
//проход по правой стороне квадрата с задержкой
for(i=60;i>=20;i--) {XorLine(60,i); delay(200);}
//проход по верхней стороне квадрата с задержкой
for(i=60;i>=20;i--) XorLine(i,20);
getch(); //Ожидание нажатия клавиши
closegraph(); //Выключение графического режима
}
Пример со страницы 30:
#include <conio.h>
#include <graphics.h>
#define pop() x=stx[--deep];y=sty[deep]
#define push(a,b) stx[deep]=a;sty[deep++]=b
int deep=0, stx[1000], sty[1000] ;
int xmax, xmin=0, ymax, ymin=0 ;
void flstr(int color, int x, int y)
{
int tempx;
int xleft, xright;
int xenter;
int flag, i ;
push(x,y) ;
while(deep>0)
{
pop() ;
if(getpixel(x,y)!=color)
{
putpixel(x,y,color) ;
tempx=x; //сохранение текущей коорд. x
x++; //перемещение вправо
while(getpixel(x,y)!=color && x<=xmax)
putpixel(x++, y, color);
xright=x-1;
x=tempx; x--; //перемещение влево
while(getpixel(x,y)!=color && x>=xmin)
putpixel(x--, y, color);
xleft=x+1;
x=tempx;
for(i=0;i<2;i++)
{
//при i=0 проверяем нижнюю,
//а при i=1 - верхнюю строку
if(y<ymax && y>ymin)
{
x=xleft; y+=1-i*2;
while(x<=xright)
{
flag=0;
while(getpixel(x,y)!=color && x<xright)
{
if(flag==0) flag=1;
x++;
}
if (flag==1)
{
if(x==xright &&
getpixel(x,y)!=color)
{
push(x,y);
}
else
{push(x-1,y);}
flag=0;
}
xenter=x;
while(getpixel(x,y)==color && x<xright)
x++;
if(x==xenter) x++;
}
}
y-- ;
}
}
}
}
void main()
{
int gd=DETECT , gm;
initgraph (&gd, &gm, "") ;
moveto (280, 110);
lineto (250, 180);
lineto (50, 20);
lineto (280, 110);
xmax=getmaxx();ymax=getmaxy();
flstr (WHITE, 270, 110);
getch();
closegraph();
}
Пример со страницы 32:
#include <conio.h>
#include <graphics.h>
int xmax, xmin=0, ymax, ymin=0;
void flrec( int color, int x, int y)
{
int xleft=x, xright=x, yy;
if (getpixel(x,y)==color) return;
if (y>ymax||y<ymin) return;
if (x>xmax||x<xmin) return;
while (getpixel(xleft,y)!=color&& xleft>=xmin)
putpixel(xleft--, y, color);
xright++;
while (getpixel(xright,y)!=color&& xright<=xmax)
putpixel (xright++,y,color);
for (yy=y-1;yy<=y+1;yy+=2)
{
x=xleft+1;
while (x<xright&&x<xmax)
{
if (getpixel(x,yy)!=color) flrec(color,x,yy);
x++;
}
}
}
void main()
{
int gd=DETECT, gm;
initgraph (&gd, &gm, "");
moveto (280, 110);
lineto (250, 180);
lineto (50, 20);
lineto (280, 110);
xmax=getmaxx();ymax=getmaxy();
flrec(WHITE, 280, 110);
getch();
closegraph();
}
Пример со страницы 36:
#include <graphics.h>
#include <conio.h>
int x0, y0; //экранные координаты начала координат
int hx, hy; //половины ширины и высоты пиксела
void point(int ix, int iy)
{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 main()
{
int gdriver = DETECT, gmode;
int x, y, a=30, b=20;
float delta;
long a2, b2;
hx=3; hy=3;
//Инициализация графического режима
initgraph ( &gdriver, &gmode, "") ;
x0 = getmaxx()/2; y0 = getmaxy()/2;
moveto(0,y0); linerel(getmaxx(),0);
moveto(x0,0); linerel(0, getmaxy());
a2=a*a; b2=b*b;
x=a; y=0; delta=0; //начальная точка (x0,y0))
while (b2*x>a2*y) //пока вектор касательной принадлежит третьей
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.