commit 79fb24e2419c6e07296f6562bc75e459f0b9277c
parent 328a47a49ee9f27a9b7ccabcec4e387f3f6cc1a2
Author: Andrew Laack <andrew@laack.co>
Date: Fri, 18 Sep 2026 12:45:04 -0500
Added python raylib
Diffstat:
| A | graph/prim-rlib.py | | | 130 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 130 insertions(+), 0 deletions(-)
diff --git a/graph/prim-rlib.py b/graph/prim-rlib.py
@@ -0,0 +1,130 @@
+import pyray as pr
+import heapq
+import random
+import math
+
+VERTICES = 10000
+EDGES = 100000
+RADIUS = 5
+
+pr.init_window(5120,1440, "prim")
+
+class Vertex():
+ def __init__(self, x, y):
+ self.x = x
+ self.y = y
+ self.visited = False
+ def draw_vertex(self):
+ if self.visited:
+ pr.draw_circle(int(self.x),int(self.y), RADIUS, pr.WHITE)
+ else:
+ pr.draw_circle(int(self.x),int(self.y), RADIUS, pr.GRAY)
+class Edge():
+ def __init__(self, v1, v2):
+ self.v1 = v1
+ self.v2 = v2
+ self.dist = math.sqrt(((v1.x - v2.x) ** 2) + ((v1.y - v2.y) ** 2))
+ def draw_edge(self, c):
+ pr.draw_line(int(self.v1.x), int(self.v1.y), int(self.v2.x), int(self.v2.y), c)
+
+ def __lt__(self,otr):
+ return self.dist < otr.dist
+
+
+graph = {}
+
+for i in range(0,VERTICES):
+ x = random.random() * 5120
+ y = random.random() * 1440
+ graph[Vertex(x,y)] = []
+
+
+edge_list = []
+keys = list(graph.keys())
+
+for i in range(0,EDGES):
+ k1 = None
+ k2 = None
+ while k1 == k2:
+ k1 = random.choice(keys)
+ k2 = random.choice(keys)
+
+ edge = Edge(k1,k2)
+ graph[k1].append(edge)
+ graph[k2].append(edge)
+ edge_list.append(edge)
+
+
+edge_heap = []
+visited_vertices = set()
+
+
+start = random.choice(keys)
+start.visited = True
+visited_vertices.add(start)
+for edge in graph[start]:
+ heapq.heappush(edge_heap, edge)
+
+
+first = True
+
+to_draw_vert = []
+to_draw_edge = []
+
+texture = pr.load_render_texture(5120,1440)
+
+while True:
+
+ pr.begin_texture_mode(texture)
+
+ if first:
+ pr.clear_background(pr.BLACK)
+
+ for edge in edge_list:
+ edge.draw_edge(pr.DARKGRAY)
+ first = False
+
+ for vertex in graph:
+ vertex.draw_vertex()
+
+ for edge in to_draw_edge:
+ edge.draw_edge(pr.WHITE)
+ for vert in to_draw_vert:
+ vert.draw_vertex()
+
+ to_draw_vert = []
+ to_draw_edge = []
+
+
+ item = None
+ while edge_heap:
+ candidate = heapq.heappop(edge_heap)
+ if (candidate.v1 in visited_vertices) != (candidate.v2 in visited_vertices):
+ item = candidate
+ break
+
+ if item is None:
+ break
+
+ new_vertex = item.v2 if item.v1 in visited_vertices else item.v1
+ visited_vertices.add(new_vertex)
+ new_vertex.visited = True
+
+ to_draw_vert.append(new_vertex)
+ to_draw_edge.append(item)
+
+ for edge in graph[new_vertex]:
+ if not edge.v1 in visited_vertices or not edge.v2 in visited_vertices:
+ heapq.heappush(edge_heap, edge)
+
+ pr.end_texture_mode()
+
+ source_rec = pr.Rectangle(0, 0, 5120, 1440)
+ dest_rec = pr.Rectangle(0, 0, 5120,1440)
+
+ pr.begin_drawing()
+ pr.draw_texture_pro(texture.texture, source_rec, dest_rec, pr.Vector2(0, 0), 0, pr.WHITE)
+ pr.end_drawing()
+
+pr.unload_render_texture(texture)
+pr.close_window()