local function lineIntersection(p1, p2, p3, p4, maxDistance, epsilon) if not maxDistance then maxDistance = 1e-5 end local p13 = p1 - p3 local p43 = p4 - p3 local p21 = p2 - p1 if p43.magnitude < epsilon or p21.magnitude < epsilon then return false end local d1343, d4321, d1321 = p13:Dot(p43), p43:Dot(p21), p13:Dot(p21) local d4343, d2121 = p43:Dot(p43), p21:Dot(p21) local denom = d2121 * d4343 - d4321 * d4321 if math.abs(denom) < epsilon then return false end local numer = d1343 * d4321 - d1321 * d4343 local mua = numer / denom local mub = (d1343 + d4321 * mua) / d4343 local pA = p1 + mua * p21 local pB = p3 + mub * p43 local distance = (pA - pB).magnitude if distance <= maxDistance then if (mua >= 0 and mua <= 1) and (mub >= 0 and mub <= 1) then return true, pA --alternatively (pA + pB)/2 for the midpoint end end return false end