bresenham.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import time
  2. t0 = time.time()
  3. def log(*msg):
  4. print("{} - ".format(str(time.time() - t0)[:5]), *msg)
  5. def line(start, target, strict=True):
  6. """
  7. adapted from https://github.com/fragkakis/bresenham/blob/master/src/main/java/org/fragkakis/Bresenham.java
  8. if strict is true, None is return if an obstacle interrupted the line; else a partial line is returned (from start to obstacle)
  9. """
  10. line = []
  11. x0, y0 = start
  12. x1, y1 = target
  13. reversed = y0 > y1
  14. if reversed:
  15. # on fait toujours de bas en haut, du coup on inverse au besoin
  16. x0, y0, x1, y1 = x1, y1, x0, y0
  17. # NB : not reversed = forward ; reversed = backward
  18. dx = abs(x1 - x0)
  19. dy = abs(y1 - y0)
  20. sx = 1 if x0 < x1 else -1
  21. sy = 1 if y0 < y1 else -1
  22. err = dx - dy
  23. x, y = x0, y0
  24. while 1:
  25. e2 = 2 * err
  26. if e2 > -1 * dy:
  27. err -= dy
  28. x += sx
  29. if e2 < dx:
  30. err += dx
  31. y += sy
  32. if x == x1 and y == y1:
  33. break
  34. line.append((x, y))
  35. if reversed:
  36. line = line[::-1]
  37. line = [start] + line + [target]
  38. return line
  39. log(line((4, 4), (7, 6)))
  40. log(line((7, 6), (4, 4)))
  41. # log(line((0, 2), (4, 3))) # test droite / bas
  42. # log(line((0, 5), (4, 3))) # test droite / haut
  43. # log(line((8, 1), (4, 3))) # test gauche / bas
  44. # log(line((8, 5), (4, 3))) # test gauche / haut