Input: manifold mesh T(V,F), vertex dirs D
Output: Hmin[], Hmax[], map Φ
// 1. Shell
BVH bvh(T)
for v in V:
d_hit = bvh.ray_hit(v+1e-6*D[v], D[v])
upper = 0.49*d_hit; lower = -0.49*d_back
binary search max [l,u] s.t. incident prisms disjoint & det>0
Hmin[v]=l; Hmax[v]=u
Build prisms Pi, outer T_out={V+Hmax*D}, inner T_in, close lateral quads
// 2. Validate target S & build Φ
for s in S:
if !point_in_shell(s.v0) or !point_in_shell(centroid) → invalid
p = inverse_map_approx(centroid)
if dot(n_T(p), n_S(s)) <= eps → invalid
else valid
for p in T samples:
ray = {origin=p, dir=D(p)}
hit = bvh_target.ray_intersect(ray) // clamped to [Hmin,Hmax]
Φ[p]=hit
Complexities $O(n\log n + m\log n)$ with exact predicates libigl::triangle_triangle_intersections + point_in_tetrahedron winding.


