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