Compare commits
	
		
			2 Commits
		
	
	
		
			ff2c184c65
			...
			main
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 509c7fec8a | |||
| 68b1496427 | 
| @@ -29,7 +29,8 @@ class Editor: | ||||
|         self.running: bool = False | ||||
|         self.image_handler: ImageHandler = ImageHandler(self.MAPS_DIR, self.MAP_SIZE) | ||||
|         self.clock: pygame.time.Clock = pygame.time.Clock() | ||||
|         self.drag_pos: Optional[tuple[int, int]] = None | ||||
|         self.left_drag_pos: Optional[tuple[int, int]] = None | ||||
|         self.mid_drag_pos: Optional[tuple[int, int]] = None | ||||
|         self.font: pygame.font.Font = pygame.font.SysFont("Ubuntu", 20) | ||||
|         self.loading_font: pygame.font.Font = pygame.font.SysFont("Ubuntu", 30) | ||||
|         self.zooms_texts: list[pygame.Surface] = list(map( | ||||
| @@ -54,6 +55,7 @@ class Editor: | ||||
|     def process_events(self) -> None: | ||||
|         events = pygame.event.get() | ||||
|  | ||||
|         keys = pygame.key.get_pressed() | ||||
|         for event in events: | ||||
|             if event.type == pygame.QUIT: | ||||
|                 self.state = State.STOPPING | ||||
| @@ -69,12 +71,19 @@ class Editor: | ||||
|                     self.zoom_out() | ||||
|             elif event.type == pygame.MOUSEBUTTONDOWN: | ||||
|                 if event.button == 2: | ||||
|                     self.drag_pos = event.pos | ||||
|                     self.mid_drag_pos = event.pos | ||||
|                 elif event.button == 1 and keys[pygame.K_LCTRL]: | ||||
|                     self.left_drag_pos = event.pos | ||||
|                 elif event.button == 4: | ||||
|                     self.zoom_in() | ||||
|                 elif event.button == 5: | ||||
|                     self.zoom_out() | ||||
|             elif event.type == pygame.MOUSEBUTTONUP: | ||||
|                 if event.button == 2: | ||||
|                     self.drag_pos = None | ||||
|                     self.mid_drag_pos = None | ||||
|                 elif event.button == 1: | ||||
|                     self.left_drag_pos = None | ||||
|  | ||||
|         keys = pygame.key.get_pressed() | ||||
|         if keys[pygame.K_LEFT]: | ||||
|             self.center[0] -= 4 / self.zoom | ||||
|         if keys[pygame.K_RIGHT]: | ||||
| @@ -86,12 +95,16 @@ class Editor: | ||||
|  | ||||
|         mbtns = pygame.mouse.get_pressed() | ||||
|         mpos = pygame.mouse.get_pos() | ||||
|         if mbtns[1]: | ||||
|             dx = mpos[0] - self.drag_pos[0] | ||||
|             dy = mpos[1] - self.drag_pos[1] | ||||
|         if mbtns[1] or (mbtns[0] and keys[pygame.K_LCTRL]): | ||||
|             drag_pos = self.mid_drag_pos if mbtns[1] else self.left_drag_pos | ||||
|             dx = mpos[0] - drag_pos[0] | ||||
|             dy = mpos[1] - drag_pos[1] | ||||
|             self.center[0] -= dx / self.zoom | ||||
|             self.center[1] -= dy / self.zoom | ||||
|             self.drag_pos = mpos | ||||
|             if mbtns[0] and keys[pygame.K_LCTRL]: | ||||
|                 self.left_drag_pos = mpos | ||||
|             if mbtns[1]: | ||||
|                 self.mid_drag_pos = mpos | ||||
|  | ||||
|     def render(self) -> None: | ||||
|         self.win.fill((0, 0, 0)) | ||||
|   | ||||
| @@ -1,38 +1,41 @@ | ||||
| from math import inf | ||||
| from typing import Iterator, Optional | ||||
|  | ||||
| class Edge: | ||||
|  | ||||
|     length = 0 | ||||
|  | ||||
|     def __init__(self, start, end, length): | ||||
|         self.length = length | ||||
|         self.start = start | ||||
|         self.end = end | ||||
|  | ||||
| class Node: | ||||
|     def __init__(self, x: int, y: int): | ||||
|         self.x: int = x | ||||
|         self.y: int = y | ||||
|  | ||||
|  | ||||
| class Edge: | ||||
|     def __init__(self, start: int, end: int, length: float): | ||||
|         self.length: float = length | ||||
|         self.start: int = start | ||||
|         self.end: int = end | ||||
|  | ||||
|     def __init__(self, xpos, ypos): | ||||
|         self.xpos = xpos | ||||
|         self.ypos = ypos | ||||
|  | ||||
| class Graph: | ||||
|  | ||||
|     def __init__(self): | ||||
|         self.edges = list() | ||||
|         self.nodes = list() | ||||
|         self.edges: list[Edge] = [] | ||||
|         self.nodes: list[Node] = [] | ||||
|  | ||||
|     def add_node(self, xpos, ypos): | ||||
|         self.nodes.append(Node(xpos, ypos)) | ||||
|     def add_node(self, x: int, y: int) -> None: | ||||
|         self.nodes.append(Node(x, y)) | ||||
|  | ||||
|     def add_edge(self, start_index, end_index, length): | ||||
|     def add_edge(self, start_index: int, end_index: int, length: float) -> None: | ||||
|         self.edges.append(Edge(start_index, end_index, length)) | ||||
|  | ||||
|     def edges_adjacent_to(self, node_i: int) -> Iterator[Edge]: | ||||
|         return filter(lambda e: e.start == node_i or e.end == node_i, self.edges) | ||||
|  | ||||
| def Dijkstra(graph, source_index, target_index): | ||||
|     def dijkstra(self, source_index: int, target_index: int) -> Optional[list[int]]: | ||||
|         n = len(self.nodes) | ||||
|  | ||||
|     n = len(graph.nodes) | ||||
|         if source_index < 0 or source_index >= n: | ||||
|             return None | ||||
|  | ||||
|     if (target_index >= n): | ||||
|         if target_index < 0 or target_index >= n: | ||||
|             return None | ||||
|  | ||||
|         unvisited = list(range(n)) | ||||
| @@ -40,24 +43,18 @@ def Dijkstra(graph, source_index, target_index): | ||||
|         distances_from_start = [inf] * n | ||||
|         distances_from_start[source_index] = 0 | ||||
|  | ||||
|     node_sequences = [list() for i in range(n)] | ||||
|         node_sequences = [[] for _ in range(n)] | ||||
|         node_sequences[source_index] = [source_index] | ||||
|  | ||||
|     while(True): | ||||
|         try: | ||||
|             current_index = min(unvisited, key = lambda i: distances_from_start[i]) | ||||
|         except ValueError: | ||||
|             break | ||||
|         while True: | ||||
|             current_index = min(unvisited, key=lambda i: distances_from_start[i]) | ||||
|  | ||||
|             if current_index == target_index: | ||||
|                 break | ||||
|  | ||||
|             unvisited.remove(current_index) | ||||
|  | ||||
|         for edge in filter( | ||||
|                 lambda e: e.start == current_index or e.end == current_index, | ||||
|                 graph.edges): | ||||
|              | ||||
|             for edge in self.edges_adjacent_to(current_index): | ||||
|                 start = current_index | ||||
|                 end = edge.end if edge.start == current_index else edge.start | ||||
|  | ||||
| @@ -69,18 +66,23 @@ def Dijkstra(graph, source_index, target_index): | ||||
|         return node_sequences[target_index] | ||||
|  | ||||
|  | ||||
| graph = Graph() | ||||
| def main() -> None: | ||||
|     graph = Graph() | ||||
|  | ||||
| graph.add_node(1, 2) | ||||
| graph.add_node(4, 7) | ||||
| graph.add_node(3,1) | ||||
| graph.add_node(-2,0) | ||||
| graph.add_node(0,0) | ||||
|     graph.add_node(1, 2) | ||||
|     graph.add_node(4, 7) | ||||
|     graph.add_node(3, 1) | ||||
|     graph.add_node(-2, 0) | ||||
|     graph.add_node(0, 0) | ||||
|  | ||||
| graph.add_edge(0, 1, 1) | ||||
| graph.add_edge(1, 2, 2) | ||||
| graph.add_edge(2, 3, 3) | ||||
| graph.add_edge(3, 0, 1) | ||||
| graph.add_edge(1, 3, 3) | ||||
|     graph.add_edge(0, 1, 1) | ||||
|     graph.add_edge(1, 2, 2) | ||||
|     graph.add_edge(2, 3, 3) | ||||
|     graph.add_edge(3, 0, 1) | ||||
|     graph.add_edge(1, 3, 3) | ||||
|  | ||||
| print(Dijkstra(graph, 0, 5)) | ||||
|     print(graph.dijkstra(0, 3)) | ||||
|  | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|     main() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user