//function scans for pixels that are not colour col between two points //uses Bresenham algorithm see: // void bline(int x1, int y1, int x2, int y2, int col){ int xd = x2 - x1; int yd = y2 - y1; int octant = -1; //establish octant (algorithm works using a measurement of gradient if (x2 > x1 && y2 > y1 && abs(yd) < abs(xd)) octant = 0; if (x2 > x1 && y2 > y1 && abs(yd) > abs(xd)) octant = 1; if (x2 < x1 && y2 > y1 && abs(yd) > abs(xd)) octant = 2; if (x2 < x1 && y2 > y1 && abs(yd) < abs(xd)) octant = 3; if (x2 < x1 && y2 < y1 && abs(yd) < abs(xd)) octant = 4; // reversal of octant 0 if (x2 < x1 && y2 < y1 && abs(yd) > abs(xd)) octant = 5; // reversal of octant 1 if (x2 > x1 && y2 < y1 && abs(yd) > abs(xd)) octant = 6; // reversal of octant 2 if (x2 > x1 && y2 < y1 && abs(yd) < abs(xd)) octant = 7; // reversal of octant 3 int error = 0; //flip co-ords of octants above 3 if (octant > 3){ int tempx = x1; int tempy = y1; x1 = x2; y1 = y2; x2 = tempx; y2 = tempy; xd = x2 - x1; yd = y2 - y1; } int x = x1; int y = y1; octantLocale = "octant: "+octant; stroke(255,0,0); switch(octant){ case 4: case 0: y = y1; for (x = x1; x <= x2; x++){ drawScan(x,y,col); if((error + yd)<<1 < xd){ error += yd; } else{ y++; error += yd - xd; } } break; case 5: case 1: x = x1; for (y = y1; y <= y2; y++){ drawScan(x,y,col); if((error + xd)<<1 < yd){ error += xd; } else{ x++; error += xd - yd; } } break; case 6: case 2: x = x1; xd = abs(xd); for (y = y1; y <= y2; y++){ //flip reading point - algorithm doesn't work backwards drawScan(x1-(x-x1),y,col); if((error + xd)<<1 < yd){ error += xd; } else{ x++; error += xd - yd; } } break; case 7: case 3: y = y1; yd = abs(yd); xd = abs(xd); for (x = x2; x <= x1; x++){ //flip reading point - algorithm doesn't work backwards drawScan(x1-(x-x2),y,col); if((error + yd)<<1 < xd){ error += yd; } else{ y++; error += yd - xd; } } break; default: //line must be on division of octants if (y1 == y2){ y = y1; if (x1 > x2){ int tempx = x1; x1 = x2; x2 = tempx; } for(x = x1; x <= x2; x++){ drawScan(x,y,col); } octantLocale = "horizontal"; } if (x1 == x2){ x = x1; if (y1 > y2){ int tempy = y1; y1 = y2; y2 = tempy; } for(y = y1; y <= y2; y++){ drawScan(x,y,col); } octantLocale = "vertical"; } if (abs(yd) == abs(xd)){ x = x1; y = y1; for(int i = 0; i <= abs(xd); i++){ drawScan(x,y,col); if (x2 > x1){ x++; } else { x--; } if (y2 > y1){ y++; } else{ y--; } } octantLocale = "diagonal"; } break; } } //replace drawScan with point() for simple drawing. void drawScan(int x, int y, int col){ if(pixels[x + y*width] != col){ stroke(255,255,0); scanCount++; } else { stroke(255,0,255); } //test accuracy by multiplying drawing by 3 rect((x*3)-50,(y*3)-50,3,3); point(x,y); }