diff --git a/src/camera.py b/src/camera.py new file mode 100644 index 0000000..c3c92dd --- /dev/null +++ b/src/camera.py @@ -0,0 +1,43 @@ +from src.vec import Vec + + +class Camera: + UNIT_RATIO = 150 + + def __init__(self) -> None: + self.pos: Vec = Vec() + self.up: Vec = Vec(0, -1) + self.size: Vec = Vec(600, 600) + self.zoom: float = 1 + + def set_pos(self, pos: Vec): + self.pos = pos + + def set_direction(self, up: Vec): + self.up = up.normalized + + def set_size(self, size: Vec): + self.size = size + + @property + def center(self) -> Vec: + return self.size / 2 + + def screen2world(self, screen_pos: Vec) -> Vec: + delta: Vec = screen_pos - self.center + delta /= self.zoom * self.UNIT_RATIO + dx: float = delta.x + dy: float = delta.y + + v1: Vec = self.up.perp * dx + v2: Vec = self.up * dy + + return self.pos + v1 + v2 + + def world2screen(self, world_pos: Vec) -> Vec: + delta: Vec = world_pos - self.pos + dy: float = -delta.dot(self.up) + dx: float = delta.dot(self.up.perp) + screen_delta: Vec = Vec(dx, dy) * self.zoom * self.UNIT_RATIO + screen_pos: Vec = self.center + screen_delta + return screen_pos