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 @property def car_screen_pos(self) -> Vec: return Vec(self.size.x / 2, 3 * self.size.y / 4) def screen2world(self, screen_pos: Vec) -> Vec: delta: Vec = screen_pos - self.car_screen_pos 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.car_screen_pos + screen_delta return screen_pos