85 return std::numeric_limits<float>::quiet_NaN();
89 std::set<lvr2::VertexHandle>& removed_lethal)
95 std::numeric_limits<float>::infinity());
106 const float& b,
const float& dot,
const float& F)
108 float t = std::numeric_limits<float>::infinity();
109 float r_cos_angle =
dot;
110 float r_sin_angle = sqrt(1 -
dot *
dot);
114 float f2 = a * a + b * b - 2 * a * b * r_cos_angle;
115 float f1 = b * u * (a * r_cos_angle - b);
116 float f0 = b * b * (u * u - F * F * a * a * r_sin_angle);
118 float delta = f1 * f1 - f0 * f2;
124 t = (-f1 - sqrt(delta)) / f2;
125 if (
t < u || b * (
t - u) /
t < a * r_cos_angle || a / r_cos_angle < b * (
t - u) / 2)
127 t = (-f1 + sqrt(delta)) / f2;
137 t = -std::numeric_limits<float>::infinity();
144 t = -std::numeric_limits<float>::infinity();
147 if (u <
t && a * r_cos_angle < b * (
t - u) /
t && b * (
t - u) /
t < a / r_cos_angle)
153 return std::min(b * F + d1, a * F + d2);
174 const float c = edge_weights[e12h.
unwrap()];
175 const float c_sq = c * c;
178 const float b = edge_weights[e13h.
unwrap()];
179 const float b_sq = b * b;
182 const float a = edge_weights[e23h.
unwrap()];
183 const float a_sq = a * a;
185 float dot = (a_sq + b_sq - c_sq) / (2 * a * b);
188 if (!std::isfinite(u3tmp))
191 const float d31 = u3tmp - u1;
192 const float d32 = u3tmp - u2;
194 if (u1 == 0 && u2 == 0)
196 const auto& v1 =
mesh_ptr->getVertexPosition(v1h);
197 const auto& v2 =
mesh_ptr->getVertexPosition(v2h);
198 const auto& v3 =
mesh_ptr->getVertexPosition(v3h);
199 const auto& dir = ((v3 - v2) + (v3 - v1)).
normalized();
200 const auto& face_normals =
map_ptr->faceNormals();
212 distances[v3h] =
static_cast<float>(u3tmp);
214 if (u1 != 0 || u2 != 0)
222 predecessors.
insert(v3h, v1h);
226 predecessors.
insert(v3h, v2h);
230 return u1 <= max_distance && u2 <= max_distance;
237 if (val >
config.inflation_radius)
241 if (val >
config.inscribed_radius)
243 float alpha = (sqrt(val) -
config.inscribed_radius) / (
config.inflation_radius -
config.inscribed_radius) *
M_PI;
244 return config.inscribed_value * (cos(alpha) + 1) / 2.0;
249 return config.inscribed_value;
252 return config.lethal_value;
256 const float inscribed_radius,
const float inscribed_value,
257 const float lethal_value)
275 const auto& edge_distances =
map_ptr->edgeDistances();
276 const auto& face_normals =
map_ptr->faceNormals();
282 for (
auto const& vH :
mesh.vertices())
284 predecessors.
insert(vH, vH);
303 if (current_vh.
idx() >=
mesh.nextVertexIndex())
308 if (
map_ptr->invalid[current_vh])
313 fixed[current_vh] =
true;
315 std::vector<lvr2::VertexHandle> neighbours;
318 mesh.getNeighboursOfVertex(current_vh, neighbours);
322 map_ptr->invalid.insert(current_vh,
true);
327 map_ptr->invalid.insert(current_vh,
true);
331 for (
auto nh : neighbours)
333 std::vector<lvr2::FaceHandle> faces;
336 mesh.getFacesOfVertex(nh, faces);
340 map_ptr->invalid.insert(nh,
true);
344 for (
auto fh : faces)
346 const auto vertices =
mesh.getVerticesOfFace(fh);
353 if (fixed[a] && fixed[b] && fixed[c])
358 else if (fixed[a] && fixed[b] && !fixed[c])
368 else if (fixed[a] && !fixed[b] && fixed[c])
378 else if (!fixed[a] && fixed[b] && fixed[c])
397 map_ptr->invalid.insert(nh,
true);
401 map_ptr->invalid.insert(nh,
true);
409 for (
auto vH :
mesh_ptr->vertices())
424 const std::array<float, 3>& barycentric_coords)
426 if (!
config.repulsive_field)
431 if (distance >
config.inflation_radius)
435 if (distance >
config.inscribed_radius)
440 (cos(alpha) + 1) / 2.0;
455 if (!
config.repulsive_field)
463 if (dist_opt && vector_opt)
465 distance = dist_opt.get();
466 vec = vector_opt.get();
473 if (distance >
config.inflation_radius)
476 if (distance >
config.inscribed_radius)
480 return vec *
config.inscribed_value * (cos(alpha) + 1) / 2.0;
486 return vec *
config.inscribed_value;
490 return vec *
config.lethal_value;
500 const auto& pre = predecessors[current_vertex];
502 if (pre != current_vertex)
505 const auto& v0 =
mesh_ptr->getVertexPosition(current_vertex);
506 const auto& v1 =
mesh_ptr->getVertexPosition(pre);
516 const float inscribed_radius,
const float inscribed_value,
517 const float lethal_value)
539 for (
auto vH :
mesh_ptr->vertices())
545 std::priority_queue<lvr2::VertexHandle, std::vector<lvr2::VertexHandle>, Cmp> pq(cmp);
553 float inflation_radius_squared = inflation_radius * inflation_radius;
554 float inscribed_radius_squared = inscribed_radius * inscribed_radius;
565 std::vector<lvr2::VertexHandle> neighbours;
566 mesh_ptr->getNeighboursOfVertex(vH, neighbours);
567 for (
auto n : neighbours)
571 float n_dist =
mesh_ptr->getVertexPosition(n).squaredDistanceFrom(
mesh_ptr->getVertexPosition(prev[vH]));
572 if (n_dist <
distances[n] && n_dist < inflation_radius_squared)
581 for (
auto vH :
mesh_ptr->vertices())
583 if (
distances[vH] > inflation_radius_squared)
589 else if (
distances[vH] > inscribed_radius_squared)
591 float alpha = (sqrt(
distances[vH]) - inscribed_radius) / (inflation_radius - inscribed_radius) *
M_PI;
592 riskiness.insert(vH, inscribed_value * (cos(alpha) + 1) / 2.0);
632 ROS_INFO_STREAM(
"New inflation layer config through dynamic reconfigure.");
639 if (
config.inflation_radius != cfg.inflation_radius)
643 std::numeric_limits<float>::infinity());
647 if (
config.inscribed_radius != cfg.inscribed_radius ||
config.inflation_radius != cfg.inflation_radius ||
648 config.lethal_value != cfg.lethal_value ||
config.inscribed_value != cfg.inscribed_value)
671 new dynamic_reconfigure::Server<mesh_layers::InflationLayerConfig>(
private_nh));