valhalla / backend /Pathfinder_test.py
Dontcryx_07
final
d660fa9
Raw
History Blame Contribute Delete
2.71 kB
"""Pathfinder_test — interactive CLI tool for verifying pixel pathfinding.
Loads the campus map, computes a BFS path between two pixel coordinates,
and renders it in a matplotlib window.
Architecture: a developer tool, not part of the simulation runtime; it
exercises backend/pathfinder.py against the real walkability map.
Design: keeps the visual debugging loop out of the server code.
"""
import sys
import os
from PIL import Image, ImageDraw, ImageFont
import matplotlib.pyplot as plt
from pathfinder import shortest_path, stats, ROOT
def show_path_on_map(path, start, end, save_path=None):
img = Image.open(os.path.join(ROOT, "frontend", "map.png")).convert("RGBA")
overlay = Image.new("RGBA", img.size, (0, 0, 0, 0))
draw = ImageDraw.Draw(overlay)
if path:
draw.line(path, fill=(255, 30, 30, 255), width=2)
r = 5
sx, sy = start
ex, ey = end
draw.ellipse([sx - r, sy - r, sx + r, sy + r], fill=(0, 220, 0, 255))
draw.ellipse([ex - r, ey - r, ex + r, ey + r], fill=(30, 100, 255, 255))
try:
font = ImageFont.truetype("arial.ttf", 14)
except (IOError, OSError):
font = ImageFont.load_default()
draw.text((sx + 7, sy - 9), "S", fill=(0, 220, 0, 255), font=font)
draw.text((ex + 7, ey - 9), "E", fill=(30, 100, 255, 255), font=font)
composited = Image.alpha_composite(img, overlay).convert("RGB")
if save_path:
composited.save(os.path.join(ROOT, save_path))
print(f"Saved: {save_path}")
else:
plt.figure(figsize=(14, 14))
plt.imshow(composited)
plt.axis("off")
plt.tight_layout(pad=0)
plt.show()
if __name__ == "__main__":
cmds = [a for a in sys.argv[1:] if not a.startswith("--")]
flags = set(a for a in sys.argv[1:] if a.startswith("--"))
if "--help" in flags or "-h" in flags:
print("Usage: python backend/pixel_pathfinder.py [x1 y1 x2 y2]")
print()
print(" x1 y1 x2 y2 pixel coordinates for start and end")
print(" --count count white pixels only")
sys.exit(0)
if "--count" in flags:
s = stats()
print(f"White pixels: {s['white_pixels']} / {s['width']*s['height']}")
sys.exit(0)
if len(cmds) >= 4:
sx, sy, ex, ey = int(cmds[0]), int(cmds[1]), int(cmds[2]), int(cmds[3])
else:
sx, sy = 32, 297
ex, ey = 959, 1205
start = (sx, sy)
end = (ex, ey)
print(f"Path: ({sx},{sy}) -> ({ex},{ey})")
path = shortest_path(start, end)
if path:
print(f"Found: {len(path)} pixels")
show_path_on_map(path, start, end)
else:
print("No path found")