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