/* line2.c - two different implementations of a line drawing function */ #include #include /* this version profiles slightly better than line1() */ #define SWAP(a,b) { (a)^=(b); (b)^=(a); (a)^=(b); } static void line2(int w, char d[][w], char c, int x, int y, int x2, int y2) { int dx, dy, p; dx=2*abs(x2-x); dy=2*abs(y2-y); if(dx>dy) { if(x>x2) { SWAP(x,x2); SWAP(y,y2); } p=dy-dx; if(y=0) { y++; p-=dx; } x++; p+=dy; } } else { /* long X slope going up */ while(x!=x2) { d[y][x]=c; if(p>=0) { y--; p-=dx; } x++; p+=dy; } } } else { if(y>y2) { SWAP(x,x2); SWAP(y,y2); } p=dx-dy; if(x=0) { x++; p-=dy; } y++; p+=dx; } } else { /* long Y slope going left */ while(y!=y2) { d[y][x]=c; if(p>=0) { x--; p-=dy; } y++; p+=dx; } } } } static void line1(int w, char d[][w], char c, int x, int y, int x2, int y2) { int ddx, ddy; int sx, sy; ddx=2*abs(x2-x); ddy=2*abs(y2-y); sx = (x2x) ? 1 : 0; sy = (y2y) ? 1 : 0; if(ddx>=ddy) { int ydp; ydp=ddy-ddx; while(d[y][x]=c, x!=x2) { if(ydp>=0) { y+=sy; ydp-=ddx; } x+=sx; ydp+=ddy; } } else { int xdp; xdp=ddx-ddy; while(d[y][x]=c, y!=y2) { if(xdp>=0) { x+=sx; xdp-=ddy; } y+=sy; xdp+=ddx; } } } static void test1(int w, int h, int n) { char d[h][w]; int x1, y1, x2, y2; do { for(x1=0;x1