X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=libctgraphics%2Fbresenham.cpp;h=9d3077b33e3815c913b6e3344e49513302b10c91;hp=7327f6b9afde94985291935c574ba96fbb0e5c1c;hb=ceb0f76ad587384928188f875c2862a3cb66b2dd;hpb=8774e7b513e87e09ba599dfb120c525e2bae2498 diff --git a/libctgraphics/bresenham.cpp b/libctgraphics/bresenham.cpp index 7327f6b..9d3077b 100644 --- a/libctgraphics/bresenham.cpp +++ b/libctgraphics/bresenham.cpp @@ -21,73 +21,71 @@ // Foley & van Dam, "Fundementals of Interactive Computer Graphics", page 433 - -void -bresenham (int x1, int y1, int x2, int y2) -{ - int delta_x = x2 - x1; - int dx_abs = (delta_x >= 0 ? delta_x : -delta_x); - - int delta_y = y2 - y1; - int dy_abs = (delta_y >= 0 ? delta_y : -delta_y); - - // draws a line when abs(dx) >= abs(dy) - if (dx_abs > dy_abs) { - int count = dx_abs + 1; - int major_inc = (x1 <= x2 ? 1 : -1); - int min_inc = (delta_y >= 0 ? 1 : -1); // determine direction of minor axis - - int d = dy_abs * 2 - dx_abs; // Put decision variable in d - int dinc1 = (dy_abs - dx_abs) * 2; - int dinc2 = 2 * dy_abs; - - bresx (x1, y1, major_inc, d, d1, d2); - } else { //For plotting lines with abs(dy) > abs(sx) - int count = dy_abs + 1; - - int major_inc = (y1 <= y2 ? 1 : -1); - int min_inc = (delta_x >= 0 ? 1 : -1); // check direction of minor axis - - int d = dx_abs * 2 - dy_abs; - dinc1 = (dx_abs - dy_abs) * 2; - dinc2 = 2 * dx_abs; - - bresy (x1, y1, major_inc, min_inc, count, d, d1, d2); - } -} - - static void -bresx (int x, int y, int majorinc, int minorinc, int count, int d, int d1, int d2) +bresx (int x, int y, int major_inc, int minor_inc, int count, int d, + int dinc1, int dinc2, void(*fn)(const int, const int)) { do { - setpixel(); - x += majorinc; + (*fn)(x,y); + x += major_inc; if (d < 0) d += dinc2; else { d += dinc1; - y += min_inc; + y += minor_inc; } } while (--count > 0); } static void -bresy (int x, int y, int majorinc, int minorinc, int count, int d, int d1, int d2) +bresy (int x, int y, int major_inc, int minor_inc, int count, int d, + int dinc1, int dinc2, void(*fn)(const int, const int)) { do { - setpixel(); - y += majorinc; + (*fn)(x,y); + y += major_inc; if (d < 0) d += dinc2; else { d += dinc1; - x += min_inc; + x += minor_inc; } } while (--count > 0); } +void +bresenham (int x1, int y1, int x2, int y2, void(*fn)(const int, const int)) +{0000 + int delta_x = x2 - x1; + int dx_abs = (delta_x >= 0 ? delta_x : -delta_x); + + int delta_y = y2 - y1; + int dy_abs = (delta_y >= 0 ? delta_y : -delta_y); + + // draws a line when abs(dx) >= abs(dy) + if (dx_abs > dy_abs) { + int count = dx_abs + 1; + int major_inc = (x1 <= x2 ? 1 : -1); + int minor_inc = (delta_y >= 0 ? 1 : -1); // determine direction of minor axis + + int d = dy_abs * 2 - dx_abs; // Put decision variable in d + int dinc1 = (dy_abs - dx_abs) * 2; + int dinc2 = 2 * dy_abs; + + bresx (x1, y1, major_inc, minor_inc, count, d, dinc1, dinc2, fn); + } else { //For plotting lines with abs(dy) > abs(sx) + int count = dy_abs + 1; + int major_inc = (y1 <= y2 ? 1 : -1); + int minor_inc = (delta_x >= 0 ? 1 : -1); // check direction of minor axis + + int d = dx_abs * 2 - dy_abs; + int dinc1 = (dx_abs - dy_abs) * 2; + int dinc2 = 2 * dx_abs; + + bresy (x1, y1, major_inc, minor_inc, count, d, dinc1, dinc2, fn); + } +}