def intersect_circle_plane(center, radius, direction, triangle): # let n be the normal to the plane n = triangle.normal if n.dot(direction) == 0: return (None, None, INFINITE) # project onto z=0 n2 = Point(n.x, n.y, 0) if n2.norm == 0: (cp, d) = triangle.plane.intersect_point(direction, center) ccp = cp.sub(direction.mul(d)) return (ccp, cp, d) n2 = n2.normalized() # the cutter contact point is on the circle, where the surface normal is n ccp = center.add(n2.mul(-radius)) # intersect the plane with a line through the contact point (cp, d) = triangle.plane.intersect_point(direction, ccp) return (ccp, cp, d)