40 #ifndef PERIODIC_DELAUNAY_TRIANGULATION_3D
41 #define PERIODIC_DELAUNAY_TRIANGULATION_3D
56 class PeriodicDelaunay3dThread;
79 std::stack<index_t> S;
86 incident_tets_set.resize(0);
94 incident_tets_set.push_back(t);
105 for(
index_t i=0; i<incident_tets_set.
size(); ++i) {
106 if(incident_tets_set[i] == t) {
114 return incident_tets_set.begin();
118 return incident_tets_set.end();
140 index_t nb_vertices,
const double* vertices
167 convex_cell_exact_predicates_ = x;
181 return vec3(vertices_ + 3*v);
183 index_t instance = v/nb_vertices_non_periodic_;
184 v = v%nb_vertices_non_periodic_;
185 vec3 result(vertices_ + 3*v);
186 result.x += double(translation[instance][0]) * period_.x;
187 result.y += double(translation[instance][1]) * period_.y;
188 result.z += double(translation[instance][2]) * period_.z;
199 if(weights_ ==
nullptr) {
202 return periodic_ ? weights_[periodic_vertex_real(v)] : weights_[v] ;
254 copy_Laguerre_cell_from_Delaunay(i,C,W);
266 return has_empty_cells_;
352 bool use_instance[27],
353 bool& cell_is_on_boundary,
354 bool& cell_is_outside_cube,
378 return reinterpret_cast<PeriodicDelaunay3dThread*
>(
388 return index_t(threads_.size());
392 friend class PeriodicDelaunay3dThread;
397 const double* weights_;
416 bool verbose_debug_mode_;
421 bool benchmark_mode_;
430 bool update_periodic_v_to_cell_;
437 bool has_empty_cells_;
448 bool convex_cell_exact_predicates_;
#define geo_debug_assert(x)
Verifies that a condition is met.
An array of cell status codes associates to each tetrahedron in a Delaunay tetrahedralization.
Abstract interface for Delaunay triangulation in Nd.
Multithreaded implementation of Delaunay in 3d with optional periodic boundary conditions.
PeriodicDelaunay3d(const vec3 &period)
Constructs a new PeriodicDelaunay3d.
PeriodicDelaunay3d(bool periodic, double period=1.0)
Constructs a new PeriodicDelaunay3d.
void check_volume()
Checks the volume of Laguerre cells.
void compute()
Computes the Delaunay triangulation.
void use_exact_predicates_for_convex_cell(bool x)
Use exact predicates in convex cell computations.
void handle_periodic_boundaries()
Duplicates the points with Voronoi cells that cross the boundary.
void save_cells(const std::string &basename, bool clipped)
Saves the cells in an Alias-Wavefront file.
void set_BRIO_levels(const vector< index_t > &levels) override
Specifies the bounds of each level to be used when hierarchic ordering is specified from outside.
void insert_vertices(index_t b, index_t e)
Insert vertices from reorder_[b] to reorder_[e-1].
index_t compress(bool shrink=true)
Removes unused tetrahedra.
double weight(index_t v) const
Gets a weight by index.
PeriodicDelaunay3dThread * thread(index_t t)
Gets a thread by index.
void update_v_to_cell() override
Stores for each vertex v a cell incident to v.
void update_cicl() override
Updates the circular incident cell lists.
void get_incident_tets(index_t v, IncidentTetrahedra &W) const
computes the set of tetrahedra that are incident to a vertex.
void copy_Laguerre_cell_from_Delaunay(GEO::index_t i, ConvexCell &C, IncidentTetrahedra &W) const
Copies a Laguerre cell from the triangulation.
index_t nb_threads() const
Gets the number of threads.
index_t nearest_vertex(const double *p) const override
Computes the nearest vertex from a query point.
void copy_Laguerre_cell_from_Delaunay(GEO::index_t i, ConvexCell &C) const
Copies a Laguerre cell from the triangulation.
index_t get_periodic_vertex_instances_to_create(index_t v, ConvexCell &C, bool use_instance[27], bool &cell_is_on_boundary, bool &cell_is_outside_cube, IncidentTetrahedra &W)
Computes the periodic vertex instances that should be generated.
vec3 vertex(index_t v) const
Gets a vertex by index.
bool has_empty_cells() const
Tests whether the Laguerre diagram has empty cells.
GEO::index_t copy_Laguerre_cell_facet_from_Delaunay(GEO::index_t i, const GEO::vec3 &Pi, double wi, double Pi_len2, GEO::index_t t, ConvexCell &C, IncidentTetrahedra &W) const
Copies a Laguerre cell facet from the triangulation.
void set_weights(const double *weights)
Sets the weights.
void set_vertices(index_t nb_vertices, const double *vertices) override
Sets the vertices of this Delaunay, and recomputes the cells.
Utilities for managing 3D periodic space.
index_t size() const
Gets the number of elements.
Computes the intersection between a set of halfplanes using Bowyer-Watson algorithm.
Class to compute the intersection of a set of half-spaces in 3D.
Abstract interface for Delaunay.
Synchronization primitives for parallel Delaunay.
Common include file, providing basic definitions. Should be included before anything else by all head...
Geometric functions in 2d and 3d.
Global Vorpaline namespace.
std::vector< Thread_var > ThreadGroup
Collection of Threads.
vecng< 3, Numeric::float64 > vec3
Represents points and vectors in 3d.
geo_index_t index_t
The type for storing and manipulating indices.
Manipulation of indices for 3D periodic space.
Function and classes for process manipulation.
Gathers some structures used by some algorithms, makes multithreading more efficient by avoiding dyna...
void add_incident_tet(index_t t)
Inserts a tet into the set of incident tets.
void clear_incident_tets()
Clears the set of incident tets.
bool has_incident_tet(index_t t) const
Tests whether a tet belongs to the set of incident tets.