def nearestIntersection(c0, c1, q): p = c1.position v = c1.orientation rp = p - c0.position k0 = vec.lengthSq(rp) - c0.getRadius() * c0.getRadius() k1 = vec.dot(v, rp) roots = [] k = k1 * k1 - k0 if util.isAlmostZero(k): roots.append(-k1) elif 0.0 < k: kSqrt = math.sqrt(k) roots.append(-k1 - kSqrt) roots.append(-k1 + kSqrt) assert roots[0] < roots[1] vec.set(Inf, q) for root in roots: if util.isAlmostZero(root) or 0 < root: q = vec.scale(v, root, q) q = q + p break return q
def isTouching(c0, c1): return vec.lengthSq(c0.position - c1.position) <= (c0.radius + c1.radius)*(c1.radius + c1.radius)