import math class Line: id=0 def __init__(self,p1,p2): self.id = Line.id Line.id += 1 self.p1 = p1 self.p2 = p2 def __repr__(self): return "Line<%g,%g,%g>-<%g,%g,%g>" % (self.p1.x,self.p1.y,self.p1.z, self.p2.x,self.p2.y,self.p2.z) def dir(self): if not hasattr(self,"_dir"): self._dir = self.p2.sub(self.p1) self._dir.normalize() return self._dir def len(self): if not hasattr(self,"_len"): self._len = self.p2.sub(self.p1).norm() return self._len def point(self, l): return self.p1.add(self.dir().mul(l*self.len())) def closest_point(self, p): v = self.dir() l = self.p1.dot(v)-p.dot(v) return self.p1.sub(v.mul(l)) def dist_to_point_sq(self, p): return p.sub(self.closest_point(p)).normsq() def dist_to_point(self, p): return sqrt(self.dist_to_point_sq(p))