diff --git a/arcade/application.py b/arcade/application.py index 44b7d95d0c..a1f3c59182 100644 --- a/arcade/application.py +++ b/arcade/application.py @@ -915,6 +915,30 @@ def on_mouse_leave(self, x: int, y: int): """ pass + def absolute(self, fractional_pos: tuple[float, float]) -> tuple[float, float]: + """Convert a relative fractional pair to absolute screen pixels. + + As in the rest of arcade and OpenGL, the default coordinate system + places the origin at the bottom left. + + :param fractional_pos: A position where the x and y are fractional + values of the window size. + :returns: A tuple of absolute pixel X and Y relative to bottom left. + """ + w, h = self.size + frac_x, frac_y = fractional_pos + return frac_x * w, frac_y * h + + def relative(self, pixel_pos: tuple[float, float]) -> tuple[float, float]: + """Convert absolute screen pixels to a relative fractional pair. + + :param pixel_pos: a tuple of X and Y pixel positions within the window. + :returns: A tuple of fractional X and Y relative to the bottom left. + """ + w, h = self.size + pixel_x, pixel_y = pixel_pos + return pixel_x / w, pixel_y / h + def open_window( width: int,