visualizations

Programmatic visualizations
git clone git://git.laack.co/visualizations.git
Log | Files | Refs | README

commit fc8bad7c10fb842742d86441fbedf60991138cb0
parent 446876a6f2912e63807ed7ad11f49aa8d55da089
Author: Andrew Laack <andrew@laack.co>
Date:   Sat, 12 Sep 2026 16:51:15 -0500

Updated sizing for prim, added bfs as continuous space graph traversal

Diffstat:
Agraph/bfs.py | 110+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mgraph/prim.py | 60++++++++++++++++++++++++++----------------------------------
2 files changed, 136 insertions(+), 34 deletions(-)

diff --git a/graph/bfs.py b/graph/bfs.py @@ -0,0 +1,110 @@ +import pygame +import time +import heapq +import random +import math + +pygame.init() + +display = pygame.display.set_mode((5120,1440)) + +VERTICES = 1000 +EDGES = 1000 + +white = (255, 255, 255) +red = (255, 0, 0) +black = (0, 0, 0) +grey = (100,100,100) +light_grey = (0,0,0) + + +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() * 5120 + y = random.random() * 1440 + graph[Vertex(x,y)] = [] + + +edge_list = [] +for i in range(0,EDGES): + k1 = None + k2 = None + while k1 == k2: + k1 = random.choice(list(graph.keys())) + k2 = random.choice(list(graph.keys())) + + edge = Edge(k1,k2) + graph[k1].append(edge) + graph[k2].append(edge) + edge_list.append(edge) + +done = False + + + +start_node = list(graph.keys())[0] +start_node.visited = True + +to_visit = [] +next_visit = [start_node] + +visited_edges = [] +already_seen = set() + + +while True: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + quit() + + display.fill(black) + for vertex in graph: + vertex.draw_vertex(display) + for edge in edge_list: + edge.draw_edge(display, light_grey) + for edge in visited_edges: + edge.draw_edge(display, white) + + if done: + pygame.display.update() + pygame.image.save(display, "out.jpg") + break + + to_visit = next_visit + next_visit = [] + for next_node in to_visit: + next_node.visited = True + for edge in graph[next_node]: + visited_edges.append(edge) + if not edge.v2 in already_seen: + next_visit.append(edge.v2) + already_seen.add(edge.v2) + + time.sleep(1) + pygame.display.update() diff --git a/graph/prim.py b/graph/prim.py @@ -9,7 +9,7 @@ pygame.init() display = pygame.display.set_mode((5120,1440)) VERTICES = 100 -EDGES = 200 +EDGES = 1000 white = (255, 255, 255) red = (255, 0, 0) @@ -71,6 +71,12 @@ while True: mst = [] + start = random.choice(list(graph.keys())) + start.visited = True + visited_vertices.add(start) + for edge in graph[start]: + heapq.heappush(edge_heap, edge) + while True: for event in pygame.event.get(): if event.type == pygame.QUIT: @@ -78,46 +84,32 @@ while True: quit() display.fill(black) - for vertex in graph: vertex.draw_vertex(display) - for edge in edge_list: edge.draw_edge(display, light_grey) - for edge in mst: edge.draw_edge(display, white) + 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 len(edge_heap) == 0: - start = random.choice(list(graph.keys())) - visited_vertices.add(start) - edges = graph[start] - for edge in edges: - heapq.heappush(edge_heap, edge) - else: - item = None - while True: - if len(edge_heap) > 0: - item = heapq.heappop(edge_heap) - v1_visited = item.v1 in visited_vertices - v2_visited = item.v2 in visited_vertices - if v1_visited != v2_visited: - break - else: - item = None - break - - if item != None: - new_vertex = item.v2 if item.v1 in visited_vertices else item.v1 - visited_vertices.add(new_vertex) - new_vertex.visited = True - mst.append(item) - edges = graph[new_vertex] - for edge in edges: - heapq.heappush(edge_heap, edge) - else: + if item is None: + pygame.display.update() + if len(visited_vertices) == VERTICES: pygame.image.save(display, "out.jpg") - break - time.sleep(.1) + break + + new_vertex = item.v2 if item.v1 in visited_vertices else item.v1 + visited_vertices.add(new_vertex) + new_vertex.visited = True + mst.append(item) + for edge in graph[new_vertex]: + heapq.heappush(edge_heap, edge) + + time.sleep(.1) pygame.display.update()