# Tocke in premice v ravnini

class Tocka():
    def __init__(self, a, b):
        self.x = a
        self.y = b
        
    def __repr__(self):
        return "Tocka({0}, {1})".format(self.x, self.y)
        
    def __str__(self):
        return "({0},{1})".format(self.x, self.y)
        
    def __sub__(self, other):
        return Vektor(self.x - other.x, self.y - other.y)
        
class Vektor():
    def __init__(self, a, b):
        self.x = a
        self.y = b
        
    def __repr__(self):
        return "Vektor({0}, {1})".format(self.x, self.y)
        
    def __str__(self):
        return "({0},{1})".format(self.x, self.y)

    def __abs__(self):
        return (self.x ** 2 + self.y ** 2) ** 0.5
    
    def __add__(self, other):
        return Vektor(self.x + other.x, self.y + other.y) 
        
    def __mul__(self, other):
        if type(other) in [Vektor, Tocka]:
            # skalarni produkt vektorjev self in other
            return self.x * other.x + self.y * other.y
        else:
            # produkt vektorja self in skalarja other
            return Vektor(other * self.x, other * self.y)
            
class Premica():
    """Premica je predstavljena s tocko in normalo."""
    
    def __init__(self, tocka, normala):
        self.tocka = tocka
        self.normala = normala
    
    def __repr__(self):
        return 'Premica({0}, {1})'.format(self.tocka, self.normala)
        
    def enacba(self):
        """Vrni a, b in c, ki dolocajo premico v implicitni obliki a x + b y = c."""
        a, b = self.normala.x, self.normala.y
        c = self.normala * self.tocka
        return (a, b, c)
        
    # premico predstavimo v implicitni obliki
    def __str__(self):
        a, b, c = self.enacba()
        return '{0} * x + {1} * y = {2}'.format(a,b,c)
        
    def vzporednica(self, tocka):
        """Vzporednica na premico self, ki poteka skozi točko tocka."""     
        return Premica(tocka, self.normala)
        
    def smernik(self):
        """Smernik dane premice."""
        return Vektor(-self.normala.y, self.normala.x)  
        
    def pravokotnica(self, tocka=None):
        """Pravokotnica na self in poteka skozi tocka."""
        return Premica(tocka or self.tocka, self.smernik())
        
        
        
        