Compare commits
4 Commits
a8d3aa64a1
...
main
Author | SHA1 | Date | |
---|---|---|---|
509c7fec8a
|
|||
68b1496427
|
|||
ff2c184c65 | |||
075ac738e4
|
@ -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))
|
||||||
|
BIN
utils/2024-06-27_21.01.45_Lycacraft_minecraft~overworld_day.png
Normal file
BIN
utils/2024-06-27_21.01.45_Lycacraft_minecraft~overworld_day.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 20 MiB |
88
utils/dijkstra.py
Normal file
88
utils/dijkstra.py
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
from math import inf
|
||||||
|
from typing import Iterator, Optional
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
class Graph:
|
||||||
|
def __init__(self):
|
||||||
|
self.edges: list[Edge] = []
|
||||||
|
self.nodes: list[Node] = []
|
||||||
|
|
||||||
|
def add_node(self, x: int, y: int) -> None:
|
||||||
|
self.nodes.append(Node(x, y))
|
||||||
|
|
||||||
|
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(self, source_index: int, target_index: int) -> Optional[list[int]]:
|
||||||
|
n = len(self.nodes)
|
||||||
|
|
||||||
|
if source_index < 0 or source_index >= n:
|
||||||
|
return None
|
||||||
|
|
||||||
|
if target_index < 0 or target_index >= n:
|
||||||
|
return None
|
||||||
|
|
||||||
|
unvisited = list(range(n))
|
||||||
|
|
||||||
|
distances_from_start = [inf] * n
|
||||||
|
distances_from_start[source_index] = 0
|
||||||
|
|
||||||
|
node_sequences = [[] for _ in range(n)]
|
||||||
|
node_sequences[source_index] = [source_index]
|
||||||
|
|
||||||
|
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 self.edges_adjacent_to(current_index):
|
||||||
|
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:
|
||||||
|
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]
|
||||||
|
|
||||||
|
|
||||||
|
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_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(graph.dijkstra(0, 3))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
@ -13,7 +13,7 @@ def clamp(mn, value, mx):
|
|||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
# 2024-06-27_21.01.45_Lycacraft_minecraft~overworld_day.png
|
# utils/2024-06-27_21.01.45_Lycacraft_minecraft~overworld_day.png
|
||||||
# 6144,10240
|
# 6144,10240
|
||||||
input_path = input("Input image: ")
|
input_path = input("Input image: ")
|
||||||
output_path = input(f"Output dir (default: {DEFAULT_PATH}): ")
|
output_path = input(f"Output dir (default: {DEFAULT_PATH}): ")
|
||||||
|
Reference in New Issue
Block a user