From 7844ad6f2c5499a1dfd9430cd57686ed36d908c9 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Sun, 25 Nov 2007 13:33:28 +0000 Subject: An attempt to implement thick line drawing. svn-id: r29639 --- graphics/primitives.cpp | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) (limited to 'graphics/primitives.cpp') diff --git a/graphics/primitives.cpp b/graphics/primitives.cpp index 9fdcb13b7b..85a0383ea9 100644 --- a/graphics/primitives.cpp +++ b/graphics/primitives.cpp @@ -64,4 +64,59 @@ void drawLine(int x0, int y0, int x1, int y1, int color, void (*plotProc)(int, i } } + +// FIXME: This is a limited version of thick line drawing +// it draws striped lines at some angles. Better algorithm could +// be found here: +// +// http://homepages.enterprise.net/murphy/thickline/index.html +// +// Feel free to replace it with better implementation +void drawThickLine(int x0, int y0, int x1, int y1, int thickness, int color, void (*plotProc)(int, int, int, void *), void *data) { + const bool steep = ABS(y1 - y0) > ABS(x1 - x0); + + if (steep) { + SWAP(x0, y0); + SWAP(x1, y1); + } + + float dx = x1 - x0; + float dy = y1 - y0; + float d = sqrtf(dx * dx + dy * dy); + + if (!d) + return; + + int thickX = (int)((float)thickness * dy / d / 2); + int thickY = (int)((float)thickness * dx / d / 2); + + const int delta_x = ABS(x1 - x0); + const int delta_y = ABS(y1 - y0); + const int delta_err = delta_y; + int x = x0; + int y = y0; + int err = 0; + + const int x_step = (x0 < x1) ? 1 : -1; + const int y_step = (y0 < y1) ? 1 : -1; + + if (steep) + drawLine(y - thickY, x + thickX, y + thickY, x - thickX, color, plotProc, data); + else + drawLine(x - thickX, y + thickY, x + thickX, y - thickY, color, plotProc, data); + + while (x != x1) { + x += x_step; + err += delta_err; + if (2 * err > delta_x) { + y += y_step; + err -= delta_x; + } + if (steep) + drawLine(y - thickY, x + thickX, y + thickY, x - thickX, color, plotProc, data); + else + drawLine(x - thickX, y + thickY, x + thickX, y - thickY, color, plotProc, data); + } +} + } // End of namespace Graphics -- cgit v1.2.3