blog

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

commit 8baf41652228462bd6033ce1b0e4d419577a56df
parent e445c11b428e2a8d24e8767906692a7ded1dcc96
Author: Andrew Laack <andrew@laack.co>
Date:   Sat, 19 Sep 2026 20:40:39 -0500

Added resources

Diffstat:
Apython/pygame-vs-raylib/prim-rlib.py | 133+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Apython/pygame-vs-raylib/prim.py | 131+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 264 insertions(+), 0 deletions(-)

diff --git a/python/pygame-vs-raylib/prim-rlib.py b/python/pygame-vs-raylib/prim-rlib.py @@ -0,0 +1,133 @@ +import pyray as pr +import heapq +import random +import math + +VERTICES = 10000 +EDGES = 100000 +RADIUS = 5 + +pr.init_window(5120,1440, "prim") + +EDGEGRAY =( 20, 20, 20, 255 ) + + +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.DARKGRAY) +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(EDGEGRAY) + 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() diff --git a/python/pygame-vs-raylib/prim.py b/python/pygame-vs-raylib/prim.py @@ -0,0 +1,131 @@ +import pygame +import heapq +import random +import math + +pygame.init() + +display = pygame.display.set_mode((1920,1080)) + +VERTICES = 250 +EDGES = 1000 + +white = (255, 255, 255) +red = (255, 0, 0) +black = (0, 0, 0) +grey = (100,100,100) +light_grey = (50,50,50) + + +class Vertex(): + def __init__(self, x, y): + self.x = x + self.y = y + self.visited = False + def draw_vertex(self,display): + if self.visited: + pygame.draw.circle(display, white, (self.x,self.y), 5) + else: + pygame.draw.circle(display, grey, (self.x,self.y), 5) +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,display, c): + pygame.draw.line(display, c, (self.v1.x,self.v1.y), (self.v2.x,self.v2.y), 1) + + def __lt__(self,otr): + return self.dist < otr.dist + + +graph = {} + +for i in range(0,VERTICES): + x = random.random() * 1920 + y = random.random() * 1080 + 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 = [] + +#itr = 0 +while True: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + quit() + + if first: + display.fill(black) + + for edge in edge_list: + edge.draw_edge(display, light_grey) + first = False + + for vertex in graph: + vertex.draw_vertex(display) + + for edge in to_draw_edge: + edge.draw_edge(display, white) + for vert in to_draw_vert: + vert.draw_vertex(display) + + 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) + #pygame.image.save(display,"out"+str(itr)+".jpg") + #itr += 1 + + pygame.display.update()