From 50c2165f37764dfca581da941e623409a36ee831 Mon Sep 17 00:00:00 2001 From: Raphael <raphael.sturgis@gmail.com> Date: Mon, 21 Mar 2022 16:52:39 +0100 Subject: [PATCH] slopes greater than 1 for bresenham algorithm --- skais/tests/utils/test_geometry.py | 7 +++++ skais/utils/geometry.py | 44 ++++++++++++++++++++---------- 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/skais/tests/utils/test_geometry.py b/skais/tests/utils/test_geometry.py index 91b0907..7a0b76d 100644 --- a/skais/tests/utils/test_geometry.py +++ b/skais/tests/utils/test_geometry.py @@ -18,6 +18,13 @@ class TestGeometry(unittest.TestCase): self.assertListEqual(result, expected) + + def test_bresenham_inverted_2(self): + result = bresenham(16, 4, 3, 9) + expected = [(3, 9), (4, 9), (5, 8), (6, 8), (7, 7), (8, 7), (9, 7), (10, 6), (11, 6), (12, 6), (13, 5), (14, 5), + (15, 4), (16, 4)] + 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)] diff --git a/skais/utils/geometry.py b/skais/utils/geometry.py index 78521b2..885aa42 100644 --- a/skais/utils/geometry.py +++ b/skais/utils/geometry.py @@ -3,28 +3,44 @@ def bresenham(x1, y1, x2, y2): tmp = x2 x2 = x1 x1 = tmp - if y1 > y2: + + tmp = y2 y2 = y1 y1 = tmp + + dx = int(x2 - x1) + dy = int(y2 - y1) + + sx = sy = 1 + if dx < 0: + sx = -1 + if dy < 0: + sy = -1 + + x = x1 + y = y1 pixels = [(x1, y1)] - if x1 == x2: - x = x1 - for y in range(y1 + 1, y2 + 1): + if abs(dx) > abs(dy): # slope < 1 + p = (2 * abs(dy)) - abs(dx) + + for x in range(x1 + 1, x2 + 1): + if p < 0: + p += 2 * abs(dy) + else: + y += sy + p += (2 * abs(dy)) - (2 * abs(dx)) 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): + else: # slope >= 1 + p = (2 * abs(dx)) - abs(dy) + for y in range(y1 + 1, y2 + 1): if p < 0: - p += a + p += 2 * abs(dx) else: - y += 1 - p += b + x += sx + p += (2 * abs(dx)) - (2 * abs(dy)) pixels.append((x, y)) + return pixels -- GitLab