blog

Personal blog
git clone git://git.laack.co/blog.git
Log | Files | Refs

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()