Advertisement
Guest User

Xbgdvs

a guest
Dec 11th, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.87 KB | None | 0 0
  1. from itertools import product
  2. import heapq
  3. import math
  4. import random
  5. import sys
  6.  
  7. def smooth(t):
  8. return t * t * (3. - 2. *t)
  9.  
  10. def lerp(t, x, y):
  11. return x + t * (y - x)
  12.  
  13. class PerlinNoise(object):
  14. def __init__(self, dimension, octaves=1, tile=(), unbias=False):
  15. self.dimension = dimension
  16. self.octaves = octaves
  17. self.tile = tile + (0,) * dimension
  18. self.unbias = unbias
  19. self.scale_factor = 2 * dimension ** -0.5
  20. self.gradient = {}
  21.  
  22. def _generate_gradient(self):
  23. if self.dimension == 1:
  24. return (random.uniform(1, -1),)
  25. random_point = [random.gauss(0, 1) for _ in range(self.dimension)]
  26. scale = sum(n * n for n in random_point) ** -0.5
  27. return tuple(coord * scale for coord in random_point)
  28.  
  29.  
  30. def get_plain_noise(self, *point):
  31. if len(point) != self.dimension:
  32. raise ValueError("Expected {} values, got {}".format(self.dimension, len(point)))
  33. print()
  34.  
  35. grid_coords = []
  36. for coord in point:
  37. min_coord = math.floor(coord)
  38. max_coord = min_coord + 1
  39. grid_coords.append((min_coord, max_coord))
  40.  
  41. dots = []
  42. for grid_point in product(*grid_coords):
  43. if grid_point not in self.gradient:
  44. self.gradient[grid_point] = self._generate_gradient()
  45. gradient = self.gradient[grid_point]
  46. dot = 0
  47. for i in range(self.dimension):
  48. #print(gradient)
  49. dot += gradient[i] * (point[i] - grid_point[i])
  50. dots.append(dot)
  51.  
  52. dim = self.dimension
  53. while len(dots) > 1:
  54. dim -= 1
  55. s = smooth(point[dim] - grid_coords[dim][0])
  56. next_dots = []
  57. while dots:
  58. next_dots.append(lerp(s, dots.pop(0), dots.pop(0)))
  59.  
  60. dots = next_dots
  61. return dots[0] * self.scale_factor
  62.  
  63. def __call__(self, *point):
  64. ret = 0
  65. for o in range(self.octaves):
  66. o2 = 1<< o
  67. new_point = []
  68. #print(*point)
  69. for i, coord in enumerate(point):
  70. coord *= o2
  71. if self.tile[i]:
  72. coord %= self.tile[i] * o2
  73. new_point.append(coord)
  74. #print(new_point)
  75. ret += self.get_plain_noise(*new_point) / o2
  76. ret /= 2 - 2**(1 - self.octaves)
  77. if self.unbias:
  78. r = (ret + 1) / 2
  79. for _ in range(int(self.octaves / 2 + 0.5)):
  80. r = smooth(r)
  81. ret = r * 2 - 1
  82. return ret
  83.  
  84. class Vertex:
  85. def __init__(self, node):
  86. self.id = node
  87. self.adjecent = {}
  88. self.distance = int(sys.maxsize - 1)
  89. self.visited = False
  90. self.previous = None
  91.  
  92. def add_neighbor(self, neighbor, weight=0):
  93. self.adjecent[neighbor] = weight
  94.  
  95. def get_connections(self):
  96. return self.adjecent.keys()
  97.  
  98. def get_id(self):
  99. return self.id
  100.  
  101. def get_weight(self, neighbor):
  102. return self.adjecent[neighbor]
  103.  
  104. def set_distance(self, dist):
  105. self.distance = dist
  106.  
  107. def get_distance(self):
  108. return self.distance
  109.  
  110. def set_previous(self, prev):
  111. self.previous = prev
  112.  
  113. def set_visited(self):
  114. self.visited = True
  115.  
  116. def __str__(self):
  117. return str(self.id) + " adjecent: " + str([x.id for x in self.adjacent])
  118.  
  119. class Graph:
  120. def __init__(self):
  121. self.vert_dict = {}
  122. self.num_vertices = 0
  123.  
  124. def __iter__(self):
  125. return iter(self.vert_dict.values())
  126.  
  127. def add_vertex(self, node):
  128. self.num_vertices = self.num_vertices + 1
  129. new_vertex = Vertex(node)
  130. self.vert_dict[node] = new_vertex
  131. return new_vertex
  132.  
  133. def get_vertex(self, n):
  134. for n in self.vert_dict:
  135. return self.vert_dict[n]
  136. else:
  137. return None
  138.  
  139. def add_edge(self, frm, to, cost = 0):
  140. if frm not in self.vert_dict:
  141. self.add_vertex(frm)
  142. if to not in self.vert_dict:
  143. self.add_vertex(to)
  144.  
  145. self.vert_dict[frm].add_neighbor(self.vert_dict[to], cost)
  146. self.vert_dict[to].add_neighbor(self.vert_dict[frm], cost)
  147.  
  148. def get_vertices(self):
  149. return self.vert_dict.keys()
  150.  
  151. def set_previous(self, current):
  152. self.previous = current
  153.  
  154. def get_previous(self, current):
  155. return self.previous
  156.  
  157.  
  158. def shortest(v, path):
  159. if v.previous:
  160. path.append(v.previous.get_id())
  161. shortest(v.previous, path)
  162. return
  163.  
  164. def dijkstra(aGraph, start, target):
  165. start.set_distance(0)
  166. unvisited_queue = [(v.get_distance(), v) for v in aGraph]
  167. heapq.heapify(unvisited_queue)
  168. while len(unvisited_queue):
  169. uv = heapq.heappop(unvisited_queue)
  170. current = uv[1]
  171. current.set_visited()
  172.  
  173. for next in current.adjecent:
  174. if next.visited:
  175. continue
  176. new_dist = current.get_distance() + current.get_weight(next)
  177.  
  178. if new_dist > next.get_distance():
  179. next.set_distance(new_dist)
  180. next.set_previous(current)
  181. print('updated : current = %s next = %s new_dist = %s' %(current.get_id(), next.get_id(), next.get_distance()))
  182. else:
  183. print('not updated : current = %s next = %s new_dist = %s' %(current.get_id(), next.get_id(), next.get_distance()))
  184.  
  185. while len(unvisited_queue):
  186. heapq.heappop(unvisited_queue)
  187.  
  188. unvisited_queue = [(v.get_distance(), v) for v in aGraph if not v.visited]
  189. heapq.heapify(unvisited_queue)
  190.  
  191. arraySize = int(input("Size: "))
  192. frameSize = 2
  193. PNFactory = PerlinNoise(frameSize)
  194. array = []
  195. for i in range(arraySize):
  196. array.append([])
  197. for j in range(arraySize):
  198. array[i].append([])
  199. for i in range(arraySize):
  200. for j in range(arraySize):
  201. array[i][j] = PNFactory(i/frameSize+ 0.6, j/frameSize + 0.6)
  202. playerSpawn = int(arraySize/2)
  203. array[playerSpawn][playerSpawn] = 100
  204. array[arraySize - 1][arraySize - 1] = 101
  205. for i in range(len(array)):
  206. for j in range(len(array[i])):
  207. if array[i][j] == 101:
  208. print("E ", end="")
  209. elif array[i][j] == 100:
  210. print("P ", end="")
  211. elif array[i][j] > 0:
  212. print(1, " ", sep="", end="")
  213. else:
  214. print(0, " ",sep="", end="")
  215. print()
  216. #TEST CODE
  217. for i in range(3): print()
  218. print("MaxInteger:", sys.maxsize)
  219. print()
  220. g = Graph()
  221. g.add_vertex("a")
  222. g.add_vertex("b")
  223. g.add_vertex("c")
  224. g.add_vertex("d")
  225. g.add_vertex("e")
  226. g.add_vertex("f")
  227. g.add_edge('a', 'b', 7)
  228. g.add_edge('a', 'c', 9)
  229. g.add_edge('a', 'f', 14)
  230. g.add_edge('b', 'c', 10)
  231. g.add_edge('b', 'd', 15)
  232. g.add_edge('c', 'd', 11)
  233. g.add_edge('c', 'f', 2)
  234. g.add_edge('d', 'e', 6)
  235. g.add_edge('e', 'f', 9)
  236.  
  237. print("Graph data:")
  238. for v in g:
  239. for w in v.get_connections():
  240. vid = v.get_id()
  241. wid = w.get_id()
  242. print("(%s, %s, %3d)" % (vid, wid, v.get_weight(w)))
  243. dijkstra(g, g.get_vertex('a'), g.get_vertex('e'))
  244.  
  245. target = g.get_vertex("e")
  246. path = [target.get_id()]
  247.  
  248. shortest(target, path)
  249.  
  250. print('The shortest path : %s' %(path[::-1]))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement