prim-rlib.py (2851B)
1 import pyray as pr 2 import heapq 3 import random 4 import math 5 6 VERTICES = 10000 7 EDGES = 100000 8 RADIUS = 5 9 10 pr.init_window(5120,1440, "prim") 11 12 class Vertex(): 13 def __init__(self, x, y): 14 self.x = x 15 self.y = y 16 self.visited = False 17 def draw_vertex(self): 18 if self.visited: 19 pr.draw_circle(int(self.x),int(self.y), RADIUS, pr.WHITE) 20 else: 21 pr.draw_circle(int(self.x),int(self.y), RADIUS, pr.GRAY) 22 class Edge(): 23 def __init__(self, v1, v2): 24 self.v1 = v1 25 self.v2 = v2 26 self.dist = math.sqrt(((v1.x - v2.x) ** 2) + ((v1.y - v2.y) ** 2)) 27 def draw_edge(self, c): 28 pr.draw_line(int(self.v1.x), int(self.v1.y), int(self.v2.x), int(self.v2.y), c) 29 30 def __lt__(self,otr): 31 return self.dist < otr.dist 32 33 34 graph = {} 35 36 for i in range(0,VERTICES): 37 x = random.random() * 5120 38 y = random.random() * 1440 39 graph[Vertex(x,y)] = [] 40 41 42 edge_list = [] 43 keys = list(graph.keys()) 44 45 for i in range(0,EDGES): 46 k1 = None 47 k2 = None 48 while k1 == k2: 49 k1 = random.choice(keys) 50 k2 = random.choice(keys) 51 52 edge = Edge(k1,k2) 53 graph[k1].append(edge) 54 graph[k2].append(edge) 55 edge_list.append(edge) 56 57 58 edge_heap = [] 59 visited_vertices = set() 60 61 62 start = random.choice(keys) 63 start.visited = True 64 visited_vertices.add(start) 65 for edge in graph[start]: 66 heapq.heappush(edge_heap, edge) 67 68 69 first = True 70 71 to_draw_vert = [] 72 to_draw_edge = [] 73 74 texture = pr.load_render_texture(5120,1440) 75 76 while True: 77 78 pr.begin_texture_mode(texture) 79 80 if first: 81 pr.clear_background(pr.BLACK) 82 83 for edge in edge_list: 84 edge.draw_edge(pr.DARKGRAY) 85 first = False 86 87 for vertex in graph: 88 vertex.draw_vertex() 89 90 for edge in to_draw_edge: 91 edge.draw_edge(pr.WHITE) 92 for vert in to_draw_vert: 93 vert.draw_vertex() 94 95 to_draw_vert = [] 96 to_draw_edge = [] 97 98 99 item = None 100 while edge_heap: 101 candidate = heapq.heappop(edge_heap) 102 if (candidate.v1 in visited_vertices) != (candidate.v2 in visited_vertices): 103 item = candidate 104 break 105 106 if item is None: 107 break 108 109 new_vertex = item.v2 if item.v1 in visited_vertices else item.v1 110 visited_vertices.add(new_vertex) 111 new_vertex.visited = True 112 113 to_draw_vert.append(new_vertex) 114 to_draw_edge.append(item) 115 116 for edge in graph[new_vertex]: 117 if not edge.v1 in visited_vertices or not edge.v2 in visited_vertices: 118 heapq.heappush(edge_heap, edge) 119 120 pr.end_texture_mode() 121 122 source_rec = pr.Rectangle(0, 0, 5120, 1440) 123 dest_rec = pr.Rectangle(0, 0, 5120,1440) 124 125 pr.begin_drawing() 126 pr.draw_texture_pro(texture.texture, source_rec, dest_rec, pr.Vector2(0, 0), 0, pr.WHITE) 127 pr.end_drawing() 128 129 pr.unload_render_texture(texture) 130 pr.close_window()