bresenham.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import time
  2. t0 = time.time()
  3. def log(*msg):
  4. print("{} - ".format(str(time.time() - t0)[:5]), *msg)
  5. obstacles = [(1, 0), (1, 1)]
  6. # Version serveur
  7. def can_see_trough(pos):
  8. return pos not in obstacles
  9. def line(start, target, strict=True):
  10. """
  11. adapted from https://github.com/fragkakis/bresenham/blob/master/src/main/java/org/fragkakis/Bresenham.java
  12. if strict is true, None is return if an obstacle interrupted the line; else a partial line is returned (from start to obstacle)
  13. """
  14. line = []
  15. x0, y0 = start
  16. x1, y1 = target
  17. dx = abs(x1 - x0)
  18. dy = abs(y1 - y0)
  19. sx = 1 if x0 < x1 else -1
  20. sy = 1 if y0 < y1 else -1
  21. err = dx - dy
  22. x, y = x0, y0
  23. while 1:
  24. line.append((x, y))
  25. if x == x1 and y == y1:
  26. break
  27. e2 = 2 * err
  28. if e2 > (-1 * dy):
  29. err -= dy
  30. x += sx
  31. if e2 < dx:
  32. err += dx
  33. y += sy
  34. if not can_see_trough((x, y)):
  35. return None if strict else line
  36. return line
  37. log(line((0, 2), (4, 3))) # test droite / bas
  38. log(line((0, 5), (4, 3))) # test droite / haut
  39. log(line((8, 1), (4, 3))) # test gauche / bas
  40. log(line((8, 5), (4, 3))) # test gauche / haut
  41. #
  42. # def bresenhamForward(start, target):
  43. # x0, y0 = start
  44. # x1, y1 = target
  45. #
  46. # dx = abs(x1 - x0)
  47. # dy = abs(y1 - y0)
  48. #
  49. # sx = 1 if x0 < x1 else -1
  50. # sy = 1 if y0 < y1 else -1
  51. #
  52. # err = dx - dy
  53. # x, y = x0, y0
  54. #
  55. # while 1:
  56. # e2 = 2 * err
  57. # if e2 > (-1 * dy):
  58. # err -= dy
  59. # x += sx
  60. #
  61. # if e2 < dx:
  62. # err += dx
  63. # y += sy
  64. #
  65. # if x == x1 and y == y1:
  66. # break
  67. #
  68. # if can_see_trough((x, y)):
  69. # return []
  70. #
  71. # return []
  72. #
  73. #
  74. # def bresenhamBackward(start, target):
  75. # pass
  76. #
  77. #
  78. # def checkBulletPath(start, target):
  79. # if start[1] > target[1]:
  80. # return bresenhamForward(start, target)
  81. # else:
  82. # return bresenhamBackward(start, target)