/* CSCI 480 HW 1 Chin-Kai Chang 7557011081 chinkaic@usc.edu Usage: drawline x1 y1 x2 y2 Or for extra point test drawline x1 y1 x2 y2 r1 g1 b1 r2 g2 b2 All number should be in 0~255, There is no number checked */ #include #include #include #include "Drawline.h" using namespace std; Drawline::Drawline() { XRES=256; YRES=256; resize_map(); } Drawline::Drawline(int xres,int yres) { XRES = xres; YRES = yres; resize_map(); } Drawline::~Drawline() { delete_map(); } void Drawline::setRES(int xres,int yres) { XRES = xres; YRES = yres; delete_map(); resize_map(); } void Drawline::drawline1(int x1, int y1, int x2, int y2, int xy, int inc) { int i, start, end, step; if (x1!=x2 && y1!=y2) { (xy==1) ? (start=x1, end=x2, step=y1) : (start=y1, end=y2, step=x1); for (i = start; i <= end; i++) { (xy==1) ? (setpixel(i, step)) : (setpixel(step, i)); (d1<0) ? (d1+=dk1) : (step+=inc, d1+=dk2); } } else { if (x1==x2) { if (y1>y2) swap(&y1, &y2); for (i=y1; i<=y2; i++) setpixel(x1, i); } else { if (x1>x2) swap(&x1, &x2); for (i=x1; i<=x2; i++) setpixel(i, y1); } } } void Drawline::drawline(int x1, int y1, int x2, int y2) { int dx, dy; if (x1 > x2) { swap(&x1, &x2); swap(&y1, &y2); } dx=x2-x1, dy=y2-y1; if (dx==0 || dy==0) drawline1(x1, y1, x2, y2, 0, 0); else { /* 0 < m <= 1 */ if ((abs(dy) <= dx) && dx*dy > 0) { //printf("1)dx=%d, dy=%d\n", dx, dy); d1 = 2*dy-dx; dk1 = 2*dy; dk2 = 2*(dy-dx); drawline1(x1, y1, x2, y2, 1, 1); } /* 0 > m => -1 */ else if ((abs(dy) <= dx) && dx*dy < 0) { //printf("2)dx=%d, dy=%d\n", dx, dy); dy = -dy; d1 = 2*dy-dx; dk1 = 2*dy; dk2 = 2*(dy-dx); drawline1(x1, y1, x2, y2, 1, -1); } /* m > 1 */ else if ((abs(dy) > dx) && dx*dy > 0) { //printf("3)dx=%d, dy=%d\n", dx, dy); d1 = 2*dx-dy; dk1 = 2*dx; dk2 = 2*(dx-dy); drawline1(x1, y1, x2, y2, 0, 1); } /* m < -1 */ else if ((abs(dy) > dx) && dx*dy < 0) { //printf("4)dx=%d, dy=%d\n", dx, dy); dx = -dx; d1 = 2*dx-dy; dk1 = -(2*dx); dk2 = -2*(dx-dy); drawline1(x2, y2, x1, y1, 0, -1); } } //printf("%d %d %d %d\n", x1, y1, x2, y2); } void Drawline::drawline(int x1,int y1,int x2,int y2,int r1,int g1,int b1,int r2,int b2,int g2) { PIXEL start,end; start.r = r1; start.g = g1; start.b = b1; end.r = r2; end.g = g2; end.b = b2; drawline(x1,y1,x2,y2,start,end); } //Draw with Color Change for Extra point void Drawline::drawline(int x1,int y1,int x2,int y2,PIXEL start,PIXEL end) { int dx, dy, d, incE, incNE, x, y, slope; float dr,dg,db,sr,sg,sb,r,g,b; if(x1 > x2) { drawline(x2,y2,x1,y1,end,start); return; } dx = x2 - x1; dy = y2 - y1; r = start.r/255; g = start.g/255; b = start.b/255; dr = start.r - end.r; dg = start.g - end.g; db = start.b - end.b; if(dx != 0){ sr = dr/((float)dx*255); sg = dg/((float)dx*255); sb = db/((float)dx*255); } else{ sr = dr/((float)dy*255); sg = dg/((float)dy*255); sb = db/((float)dy*255); } if(dy < 0) { slope = -1; dy = -dy; }else{ slope = 1; } if(dx==0) { for(int i=0;i<=dy;i++) { setpixel(x1,y1,r,g,b); r -=sr; g -=sg; b -=sb; y1+=slope; } }else{ d = 2*dy - dx; incE = 2*dy; incNE = 2*(dy - dx); y = y1; for (x=x1; x<=x2; x++) { setpixel(x,y,r,g,b); r -=sr; g -=sg; b -=sb; if (d>0) { d += incNE; y +=slope; } else { d += incE; } } } } void Drawline::setpixel(int x,int y) { graph[y][x].r = 0 ; graph[y][x].g = 0 ; graph[y][x].b = 0 ; } void Drawline::setpixel(int x,int y,float r,float g,float b) { graph[y][x].r = (int)(r*255) ; graph[y][x].g = (int)(g*255) ; graph[y][x].b = (int)(b*255) ; } void Drawline::output(void) { output(OUTFILE); } void Drawline::output(char *fileName) { FILE *fp; fp = fopen(fileName, "w"); fprintf(fp,"P3\n") ; fprintf(fp,"%d %d\n",XRES,YRES) ; fprintf(fp,"255\n"); for(int i=0;i