import math ## Euclidean 2D plane point: (x,y). class EPoint: def __init__(self,x,y): self.x=x self.y=y def fromTuple(tup): return EPoint(tup[0],tup[1]) def fromProjective(point): if point.item(0)==0: return None return EPoint(point.item(1)/point.item(0),point.item(2)/point.item(0)) def toProjective(self): return (1,self.x,self.y) def dist(self,a): return math.sqrt((self.x-a.x)**2+(self.y-a.y)**2) def __add__(self,a): return EPoint(self.x+a.x,self.y+a.y) def __sub__(self,a): return EPoint(self.x-a.x,self.y-a.y) def __mul__(self,k): return EPoint(self.x*k,self.y*k) def __rmul__(self,k): return self*k def __truediv__(self,k): return EPoint(self.x/k,self.y/k) def __floordiv__(self,k): return EPoint(self.x//k,self.y//k) def __iadd__(self,a): self.x+=a.x self.y+=a.y return self def __isub__(self,a): self.x-=a.x self.y-=a.y return self def __imul__(self,k): self.x*=k self.y*=k return self def __itruediv__(self,k): self.x/=k self.y/=k return self def __ifloordiv__(self,k): self.x//=k self.y//=k return self def __neg__(self): return EPoint(-self.x,-self.y) def __str__(self): return "({0},{1})".format(round(self.x,3),round(self.y,3)) def __repr__(self): return "EPoint({0},{1})".format(round(self.x,3),round(self.y,3))