prim.py (2824B)
1 import pygame 2 import heapq 3 import random 4 import math 5 6 pygame.init() 7 8 display = pygame.display.set_mode((1920,1080)) 9 10 VERTICES = 250 11 EDGES = 1000 12 13 white = (255, 255, 255) 14 red = (255, 0, 0) 15 black = (0, 0, 0) 16 grey = (100,100,100) 17 light_grey = (50,50,50) 18 19 20 class Vertex(): 21 def __init__(self, x, y): 22 self.x = x 23 self.y = y 24 self.visited = False 25 def draw_vertex(self,display): 26 if self.visited: 27 pygame.draw.circle(display, white, (self.x,self.y), 5) 28 else: 29 pygame.draw.circle(display, grey, (self.x,self.y), 5) 30 class Edge(): 31 def __init__(self, v1, v2): 32 self.v1 = v1 33 self.v2 = v2 34 self.dist = math.sqrt(((v1.x - v2.x) ** 2) + ((v1.y - v2.y) ** 2)) 35 def draw_edge(self,display, c): 36 pygame.draw.line(display, c, (self.v1.x,self.v1.y), (self.v2.x,self.v2.y), 1) 37 38 def __lt__(self,otr): 39 return self.dist < otr.dist 40 41 42 graph = {} 43 44 for i in range(0,VERTICES): 45 x = random.random() * 1920 46 y = random.random() * 1080 47 graph[Vertex(x,y)] = [] 48 49 50 edge_list = [] 51 keys = list(graph.keys()) 52 53 for i in range(0,EDGES): 54 k1 = None 55 k2 = None 56 while k1 == k2: 57 k1 = random.choice(keys) 58 k2 = random.choice(keys) 59 60 edge = Edge(k1,k2) 61 graph[k1].append(edge) 62 graph[k2].append(edge) 63 edge_list.append(edge) 64 65 66 edge_heap = [] 67 visited_vertices = set() 68 69 70 start = random.choice(keys) 71 start.visited = True 72 visited_vertices.add(start) 73 for edge in graph[start]: 74 heapq.heappush(edge_heap, edge) 75 76 77 first = True 78 79 to_draw_vert = [] 80 to_draw_edge = [] 81 82 #itr = 0 83 while True: 84 for event in pygame.event.get(): 85 if event.type == pygame.QUIT: 86 pygame.quit() 87 quit() 88 89 if first: 90 display.fill(black) 91 92 for edge in edge_list: 93 edge.draw_edge(display, light_grey) 94 first = False 95 96 for vertex in graph: 97 vertex.draw_vertex(display) 98 99 for edge in to_draw_edge: 100 edge.draw_edge(display, white) 101 for vert in to_draw_vert: 102 vert.draw_vertex(display) 103 104 to_draw_vert = [] 105 to_draw_edge = [] 106 107 108 item = None 109 while edge_heap: 110 candidate = heapq.heappop(edge_heap) 111 if (candidate.v1 in visited_vertices) != (candidate.v2 in visited_vertices): 112 item = candidate 113 break 114 115 if item is None: 116 break 117 118 new_vertex = item.v2 if item.v1 in visited_vertices else item.v1 119 visited_vertices.add(new_vertex) 120 new_vertex.visited = True 121 122 to_draw_vert.append(new_vertex) 123 to_draw_edge.append(item) 124 125 for edge in graph[new_vertex]: 126 if not edge.v1 in visited_vertices or not edge.v2 in visited_vertices: 127 heapq.heappush(edge_heap, edge) 128 #pygame.image.save(display,"out"+str(itr)+".jpg") 129 #itr += 1 130 131 pygame.display.update()