diff --git a/skais/tests/utils/test_geometry.py b/skais/tests/utils/test_geometry.py new file mode 100644 index 0000000000000000000000000000000000000000..91b0907040fce9c66b933f1d1023e136ae8e77a6 --- /dev/null +++ b/skais/tests/utils/test_geometry.py @@ -0,0 +1,35 @@ +import unittest + +from skais.utils.geometry import bresenham + + +class TestGeometry(unittest.TestCase): + def test_bresenham(self): + result = bresenham(3, 4, 16, 9) + expected = [(3, 4), (4, 4), (5, 5), (6, 5), (7, 6), (8, 6), (9, 6), (10, 7), (11, 7), (12, 7), (13, 8), (14, 8), + (15, 9), (16, 9)] + + self.assertListEqual(result, expected) + + def test_bresenham_inverted(self): + result = bresenham(16, 9, 3, 4) + expected = [(3, 4), (4, 4), (5, 5), (6, 5), (7, 6), (8, 6), (9, 6), (10, 7), (11, 7), (12, 7), (13, 8), + (14, 8), (15, 9), (16, 9)] + + self.assertListEqual(result, expected) + + def test_bresenham_same_line(self): + result = bresenham(3, 4, 10, 4) + expected = [(3, 4), (4, 4), (5, 4), (6, 4), (7, 4), (8, 4), (9, 4), (10, 4)] + + self.assertListEqual(result, expected) + + def test_bresenham_same_column(self): + result = bresenham(3, 4, 3, 10) + expected = [(3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (3, 10)] + + self.assertListEqual(result, expected) + + +if __name__ == '__main__': + unittest.main() diff --git a/skais/utils/geometry.py b/skais/utils/geometry.py new file mode 100644 index 0000000000000000000000000000000000000000..78521b2dee50c79ee96b9eb4c08591c0a9891086 --- /dev/null +++ b/skais/utils/geometry.py @@ -0,0 +1,30 @@ +def bresenham(x1, y1, x2, y2): + if x1 > x2: + tmp = x2 + x2 = x1 + x1 = tmp + if y1 > y2: + tmp = y2 + y2 = y1 + y1 = tmp + + pixels = [(x1, y1)] + if x1 == x2: + x = x1 + for y in range(y1 + 1, y2 + 1): + pixels.append((x, y)) + else: + a = 2*(y2 - y1) + b = a - 2*(x2 - x1) + p = a - (x2 - x1) + + y = y1 + for x in range(x1+1, x2+1): + if p < 0: + p += a + else: + y += 1 + p += b + pixels.append((x, y)) + return pixels +