Compare commits
	
		
			2 Commits
		
	
	
		
			ff2c184c65
			...
			509c7fec8a
		
	
	| 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