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