# Path: pysc2/lib/point.py
# class Point(collections.namedtuple("Point", ["x", "y"])):
# class Rect(collections.namedtuple("Rect", ["t", "l", "b", "r"])):
#   def build(cls, obj):
#   def unit_rand(cls):
#   def assign_to(self, obj):
#   def dist(self, other):
#   def dist_sq(self, other):
#   def round(self):
#   def floor(self):
#   def ceil(self):
#   def abs(self):
#   def len(self):
#   def scale(self, target_len):
#   def scale_max_size(self, max_size):
#   def scale_min_size(self, min_size):
#   def min_dim(self):
#   def max_dim(self):
#   def transpose(self):
#   def rotate_deg(self, angle):
#   def rotate_rad(self, angle):
#   def rotate_rand(self, angle=180):
#   def contained_circle(self, pt, radius):
#   def bound(self, p1, p2=None):
#   def __str__(self):
#   def __neg__(self):
#   def __add__(self, pt_or_val):
#   def __sub__(self, pt_or_val):
#   def __mul__(self, pt_or_val):
#   def __truediv__(self, pt_or_val):
#   def __floordiv__(self, pt_or_val):
#   def __new__(cls, *args):
#   def __str__(self):
#   def center(self):
#   def top(self):
#   def left(self):
#   def bottom(self):
#   def right(self):
#   def width(self):
#   def height(self):
#   def tl(self):
#   def br(self):
#   def tr(self):
#   def bl(self):
#   def diagonal(self):
#   def size(self):
#   def area(self):
#   def round(self):
#   def floor(self):
#   def ceil(self):
#   def contains_point(self, pt):
#   def contains_circle(self, pt, radius):
#   def intersects_circle(self, pt, radius):


import numbers
from pysc2.lib import point



class Transform(object):
  """Base class for coordinate transforms."""

  def fwd_dist(self, dist):
    raise NotImplementedError()

  def fwd_pt(self, pt):
    raise NotImplementedError()

  def back_dist(self, dist):
    raise NotImplementedError()

  def back_pt(self, pt):
    raise NotImplementedError()


class Linear(Transform):
  """A linear transform with a scale and offset."""

  def __init__(self, scale=None, offset=None):
    if scale is None:
      self.scale = point.Point(1, 1)
    elif isinstance(scale, numbers.Number):
      self.scale = point.Point(scale, scale)
    else:
      self.scale = scale
    assert self.scale.x != 0 and self.scale.y != 0

# Path: pysc2/lib/point.py
# class Point(collections.namedtuple("Point", ["x", "y"])):
# class Rect(collections.namedtuple("Rect", ["t", "l", "b", "r"])):
#   def build(cls, obj):
#   def unit_rand(cls):
#   def assign_to(self, obj):
#   def dist(self, other):
#   def dist_sq(self, other):
#   def round(self):
#   def floor(self):
#   def ceil(self):
#   def abs(self):
#   def len(self):
#   def scale(self, target_len):
#   def scale_max_size(self, max_size):
#   def scale_min_size(self, min_size):
#   def min_dim(self):
#   def max_dim(self):
#   def transpose(self):
#   def rotate_deg(self, angle):
#   def rotate_rad(self, angle):
#   def rotate_rand(self, angle=180):
#   def contained_circle(self, pt, radius):
#   def bound(self, p1, p2=None):
#   def __str__(self):
#   def __neg__(self):
#   def __add__(self, pt_or_val):
#   def __sub__(self, pt_or_val):
#   def __mul__(self, pt_or_val):
#   def __truediv__(self, pt_or_val):
#   def __floordiv__(self, pt_or_val):
#   def __new__(cls, *args):
#   def __str__(self):
#   def center(self):
#   def top(self):
#   def left(self):
#   def bottom(self):
#   def right(self):
#   def width(self):
#   def height(self):
#   def tl(self):
#   def br(self):
#   def tr(self):
#   def bl(self):
#   def diagonal(self):
#   def size(self):
#   def area(self):
#   def round(self):
#   def floor(self):
#   def ceil(self):
#   def contains_point(self, pt):
#   def contains_circle(self, pt, radius):
#   def intersects_circle(self, pt, radius):


# Path: pysc2/lib/transform.py
import numbers
from pysc2.lib import point




class Transform(object):
  """Base class for coordinate transforms."""

  def fwd_dist(self, dist):
    raise NotImplementedError()

  def fwd_pt(self, pt):
    raise NotImplementedError()

  def back_dist(self, dist):
    raise NotImplementedError()

  def back_pt(self, pt):
    raise NotImplementedError()


class Linear(Transform):
  """A linear transform with a scale and offset."""

  def __init__(self, scale=None, offset=None):
    if scale is None:
      self.scale = point.Point(1, 1)
    elif isinstance(scale, numbers.Number):
      self.scale = point.Point(scale, scale)
    else:
      self.scale = scale
    assert self.scale.x != 0 and self.scale.y != 0

    self.offset = offset or point.Point(0, 0)