let the Point scale itself
not so nice:
Point(
int(p.x * self.scale.scale_width),
int(p.y * self.scale.scale_height),
)
would be nicer:
Point.scale(scale: Dimensions)
or Point.scale(width: float, height: float)
...
Maybe also helpers like Point.scale(scale: Scale, average: bool = False)
.