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