Add function for check existence of triangle in define radius
This commit is contained in:
parent
eaaff4e707
commit
fb24d8167a
@ -692,6 +692,40 @@ inline typename VectorType::Scalar squared_distance_to_indexed_triangle_set(
|
|||||||
detail::squared_distance_to_indexed_triangle_set_recursive(distancer, size_t(0), Scalar(0), std::numeric_limits<Scalar>::infinity(), hit_idx_out, hit_point_out);
|
detail::squared_distance_to_indexed_triangle_set_recursive(distancer, size_t(0), Scalar(0), std::numeric_limits<Scalar>::infinity(), hit_idx_out, hit_point_out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Decides if exists some triangle in defined radius on a 3D indexed triangle set using a pre-built AABBTreeIndirect::Tree.
|
||||||
|
// Closest point to triangle test will be performed with the accuracy of VectorType::Scalar
|
||||||
|
// even if the triangle mesh and the AABB Tree are built with floats.
|
||||||
|
// Returns true if exists some triangle in defined radius, false otherwise.
|
||||||
|
template<typename VertexType, typename IndexedFaceType, typename TreeType, typename VectorType>
|
||||||
|
inline bool is_any_triangle_in_radius(
|
||||||
|
// Indexed triangle set - 3D vertices.
|
||||||
|
const std::vector<VertexType> &vertices,
|
||||||
|
// Indexed triangle set - triangular faces, references to vertices.
|
||||||
|
const std::vector<IndexedFaceType> &faces,
|
||||||
|
// AABBTreeIndirect::Tree over vertices & faces, bounding boxes built with the accuracy of vertices.
|
||||||
|
const TreeType &tree,
|
||||||
|
// Point to which the closest point on the indexed triangle set is searched for.
|
||||||
|
const VectorType &point,
|
||||||
|
// Maximum distance in which triangle is search for
|
||||||
|
typename VectorType::Scalar &max_distance)
|
||||||
|
{
|
||||||
|
using Scalar = typename VectorType::Scalar;
|
||||||
|
auto distancer = detail::IndexedTriangleSetDistancer<VertexType, IndexedFaceType, TreeType, VectorType>
|
||||||
|
{ vertices, faces, tree, point };
|
||||||
|
|
||||||
|
size_t hit_idx;
|
||||||
|
VectorType hit_point = VectorType::Ones() * (std::nan(""));
|
||||||
|
|
||||||
|
if(tree.empty())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
detail::squared_distance_to_indexed_triangle_set_recursive(distancer, size_t(0), Scalar(0), max_distance, hit_idx, hit_point);
|
||||||
|
|
||||||
|
return hit_point.allFinite();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace AABBTreeIndirect
|
} // namespace AABBTreeIndirect
|
||||||
} // namespace Slic3r
|
} // namespace Slic3r
|
||||||
|
|
||||||
|
@ -152,7 +152,7 @@ void FillAdaptive::expand_cube(
|
|||||||
triangleMesh.its.vertices, triangleMesh.its.indices, distanceTree, child_center_transformed,
|
triangleMesh.its.vertices, triangleMesh.its.indices, distanceTree, child_center_transformed,
|
||||||
closest_triangle_idx,closest_point);
|
closest_triangle_idx,closest_point);
|
||||||
|
|
||||||
if(distance_squared <= cube_radius_squared) {
|
if(AABBTreeIndirect::is_any_triangle_in_radius(triangleMesh.its.vertices, triangleMesh.its.indices, distanceTree, child_center_transformed, cube_radius_squared)) {
|
||||||
cube->children.push_back(new Cube{child_center_transformed, cube->depth - 1, cubes_properties[cube->depth - 1]});
|
cube->children.push_back(new Cube{child_center_transformed, cube->depth - 1, cubes_properties[cube->depth - 1]});
|
||||||
FillAdaptive::expand_cube(cube->children.back(), cubes_properties, rotation_matrix, distanceTree, triangleMesh);
|
FillAdaptive::expand_cube(cube->children.back(), cubes_properties, rotation_matrix, distanceTree, triangleMesh);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user