@@ -469,6 +469,68 @@ void BVH::nearest_facet_recursive(
469469 }
470470}
471471
472+ void BVH::facet_in_envelope_recursive (
473+ const VectorMax3d& p,
474+ double sq_epsilon,
475+ int & nearest_f,
476+ VectorMax3d& nearest_point,
477+ double & sq_dist,
478+ int n,
479+ int b,
480+ int e) const
481+ {
482+ assert (e > b);
483+
484+ if (sq_dist <= sq_epsilon) {
485+ return ;
486+ }
487+
488+ // If node is a leaf: compute point-facet distance
489+ // and replace current if nearer
490+ if (b + 1 == e) {
491+ VectorMax3d cur_nearest_point;
492+ double cur_sq_dist;
493+ leaf_callback (p, new2old[b], cur_nearest_point, cur_sq_dist);
494+ if (cur_sq_dist < sq_dist) {
495+ nearest_f = b;
496+ nearest_point = cur_nearest_point;
497+ sq_dist = cur_sq_dist;
498+ }
499+ return ;
500+ }
501+ int m = b + (e - b) / 2 ;
502+ int childl = 2 * n;
503+ int childr = 2 * n + 1 ;
504+
505+ assert (childl < boxlist.size ());
506+ assert (childr < boxlist.size ());
507+
508+ double dl = point_box_signed_squared_distance (p, boxlist[childl]);
509+ double dr = point_box_signed_squared_distance (p, boxlist[childr]);
510+
511+ // Traverse the "nearest" child first, so that it has more chances
512+ // to prune the traversal of the other child.
513+ if (dl < dr) {
514+ if (dl < sq_dist && dl <= sq_epsilon) {
515+ facet_in_envelope_recursive (
516+ p, sq_epsilon, nearest_f, nearest_point, sq_dist, childl, b, m);
517+ }
518+ if (dr < sq_dist && dr <= sq_epsilon) {
519+ facet_in_envelope_recursive (
520+ p, sq_epsilon, nearest_f, nearest_point, sq_dist, childr, m, e);
521+ }
522+ } else {
523+ if (dr < sq_dist && dr <= sq_epsilon) {
524+ facet_in_envelope_recursive (
525+ p, sq_epsilon, nearest_f, nearest_point, sq_dist, childr, m, e);
526+ }
527+ if (dl < sq_dist && dl <= sq_epsilon) {
528+ facet_in_envelope_recursive (
529+ p, sq_epsilon, nearest_f, nearest_point, sq_dist, childl, b, m);
530+ }
531+ }
532+ }
533+
472534void BVH::leaf_callback (
473535 const VectorMax3d& p, int f, VectorMax3d& np, double & sq_d) const
474536{
0 commit comments