Код на C++ #include <graphics.h> #include <math.h> #include <conio.h> #include <stdio.h> #include <dos.h> /*метод простого ЦДА void point(int x,int y){ Form1->canvas->pixel[x][y]; } */ int color=0; sign(int r) { if(r>0) return 1; else if(r<0) return -1; else return 0; } void point(int x,int y){ putpixel(x,y,color); } //Рисование линии методом простого ЦДА void line_cda(int x0,int y0,int x1,int y1) { int i,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); //последняя точка } int oldx,oldy,ox=299;//xпред, yпред //Функция сравнивает текущую точку обхода периметра //с предыдущей и выполняет соответствующие действия //в качестве параметров передаются координаты текущей точки //закраска методом XOR_PUT void XorLine(int x, int y) { if (y>oldy) line(x,y,300,y); if (y<oldy) { line(oldx,oldy,ox--,oldy); } oldx=x; oldy=y; //текущая точка становится предыдущей } void main() { int graphdriver=DETECT, graphmode; initgraph(&graphdriver,&graphmode,""); color=12; setcolor(12); line_cda(99,99,300,300); line_cda(99,99,99,300); line_cda(99,300,300,300); getch(); setcolor(WHITE); //установка белого цвета setwritemode(XOR_PUT); //установка режима вывода XOR_PUT oldx=100; oldy=100; //инициализируем предыдущие координаты //проход по левой стороне квадрата с задержкой int i; for(i=100;i<=299;i++) {XorLine(100,i); delay(10);} //проход по нижней стороне квадрата for(i=100;i<=299;i++) XorLine(i,299); //проход по правой стороне квадрата с задержкой for(i=299;i>=100;i--) {XorLine(300,i); delay(10);} //проход по верхней стороне квадрата с задержкой for(i=299;i>=100;i--) XorLine(i,100); getch(); closegraph(); }
|