Skip to content

Commit 2b08a67

Browse files
author
Teseo Schneider
committed
added envelope stuff
1 parent d7c3f07 commit 2b08a67

File tree

2 files changed

+101
-0
lines changed

2 files changed

+101
-0
lines changed

src/SimpleBVH/BVH.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
472534
void BVH::leaf_callback(
473535
const VectorMax3d& p, int f, VectorMax3d& np, double& sq_d) const
474536
{

src/SimpleBVH/BVH.hpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,35 @@ class BVH {
8080
p, nearest_facet, nearest_point, sq_dist, 1, 0, n_corners);
8181
}
8282

83+
int facet_in_envelope(
84+
const VectorMax3d& p,
85+
double sq_epsilon,
86+
VectorMax3d& nearest_point,
87+
double& sq_dist) const
88+
{
89+
int nearest_facet;
90+
get_nearest_facet_hint(p, nearest_facet, nearest_point, sq_dist);
91+
facet_in_envelope_recursive(
92+
p, sq_epsilon, nearest_facet, nearest_point, sq_dist, 1, 0,
93+
n_corners);
94+
return nearest_facet;
95+
}
96+
97+
void facet_in_envelope_with_hint(
98+
const VectorMax3d& p,
99+
double sq_epsilon,
100+
int& nearest_facet,
101+
VectorMax3d& nearest_point,
102+
double& sq_dist) const
103+
{
104+
if (nearest_facet < 0) {
105+
get_nearest_facet_hint(p, nearest_facet, nearest_point, sq_dist);
106+
}
107+
facet_in_envelope_recursive(
108+
p, sq_epsilon, nearest_facet, nearest_point, sq_dist, 1, 0,
109+
n_corners);
110+
}
111+
83112
void set_leaf_distance_callback(const LeafCallback& callback)
84113
{
85114
leafCallback = callback;
@@ -120,6 +149,16 @@ class BVH {
120149
int b,
121150
int e) const;
122151

152+
void facet_in_envelope_recursive(
153+
const VectorMax3d& p,
154+
double sq_epsilon,
155+
int& nearest_f,
156+
VectorMax3d& nearest_point,
157+
double& sq_dist,
158+
int n,
159+
int b,
160+
int e) const;
161+
123162
bool box_intersects_box(
124163
const VectorMax3d& bbd0, const VectorMax3d& bbd1, int index) const;
125164

0 commit comments

Comments
 (0)