code: func (l *Line) Intersection(line *Line) *Point {
  	den := (line.b[1]-line.a[1])*(l.b[0]-l.a[0]) - (line.b[0]-line.a[0])*(l.b[1]-l.a[1])
  	U1 := (line.b[0]-line.a[0])*(l.a[1]-line.a[1]) - (line.b[1]-line.a[1])*(l.a[0]-line.a[0])
  	U2 := (l.b[0]-l.a[0])*(l.a[1]-line.a[1]) - (l.b[1]-l.a[1])*(l.a[0]-line.a[0])
  
  	if den == 0 {
  		// collinear, all bets are off
  		if U1 == 0 && U2 == 0 {
  			return InfinityPoint
  		}
  
  		return nil
  	}
  
  	if U1/den < 0 || U1/den > 1 || U2/den < 0 || U2/den > 1 {
  		return nil
  	}
  
  	return l.Interpolate(U1 / den)
  }
docs: // Intersection finds the intersection of the two lines or nil,
  // if the lines are collinear will return NewPoint(math.Inf(1), math.Inf(1)) == InfinityPoint