Geogram  Version 1.9.1-rc
A programming library of geometric algorithms
mesh_reorder.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2000-2022 Inria
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * * Redistributions of source code must retain the above copyright notice,
9  * this list of conditions and the following disclaimer.
10  * * Redistributions in binary form must reproduce the above copyright notice,
11  * this list of conditions and the following disclaimer in the documentation
12  * and/or other materials provided with the distribution.
13  * * Neither the name of the ALICE Project-Team nor the names of its
14  * contributors may be used to endorse or promote products derived from this
15  * software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27  * POSSIBILITY OF SUCH DAMAGE.
28  *
29  * Contact: Bruno Levy
30  *
31  * https://www.inria.fr/fr/bruno-levy
32  *
33  * Inria,
34  * Domaine de Voluceau,
35  * 78150 Le Chesnay - Rocquencourt
36  * FRANCE
37  *
38  */
39 
40 #ifndef GEOGRAM_MESH_MESH_REORDER
41 #define GEOGRAM_MESH_MESH_REORDER
42 
43 #include <geogram/basic/common.h>
44 #include <geogram/basic/numeric.h>
45 #include <geogram/basic/memory.h>
46 #include <geogram/basic/geometry.h>
47 
53 namespace GEO {
54 
55 
56 #ifndef GEOGRAM_PSM
57  class Mesh;
58 
62  enum MeshOrder {
73  };
74 
82  void GEOGRAM_API mesh_reorder(
84  );
85 
86 #endif
87 
108  void GEOGRAM_API compute_Hilbert_order(
109  index_t total_nb_vertices, const double* vertices,
110  vector<index_t>& sorted_indices,
111  index_t first,
112  index_t last,
113  index_t dimension, index_t stride = 3
114  );
115 
135  void GEOGRAM_API compute_BRIO_order(
136  index_t nb_vertices, const double* vertices,
137  vector<index_t>& sorted_indices,
138  index_t dimension,
139  index_t stride = 3,
140  index_t threshold = 64,
141  double ratio = 0.125,
142  vector<index_t>* levels = nullptr
143  );
144 
160  void GEOGRAM_API Hilbert_sort_periodic(
161  index_t nb_vertices, const double* vertices,
162  vector<index_t>& sorted_indices,
163  index_t dimension,
164  index_t stride,
167  const vec3& period
168  );
169 
170  inline void Hilbert_sort_periodic(
171  index_t nb_vertices, const double* vertices,
172  vector<index_t>& sorted_indices,
173  index_t dimension,
174  index_t stride,
177  double period = 1.0
178  ) {
180  nb_vertices, vertices,
181  sorted_indices,
182  dimension,
183  stride,
184  first,
185  last,
186  vec3(period, period, period)
187  );
188  }
189 
190 
191 
192 }
193 
194 #endif
Represents a mesh.
Definition: mesh.h:2693
Common include file, providing basic definitions. Should be included before anything else by all head...
Geometric functions in 2d and 3d.
Types and functions for memory manipulation.
Global Vorpaline namespace.
Definition: basic.h:55
void mesh_reorder(Mesh &M, MeshOrder order=MESH_ORDER_HILBERT)
Reorders all the elements of a mesh.
vecng< 3, Numeric::float64 > vec3
Represents points and vectors in 3d.
Definition: geometry.h:65
geo_index_t index_t
The type for storing and manipulating indices.
Definition: numeric.h:329
MeshOrder
Strategy for spatial sorting.
Definition: mesh_reorder.h:62
@ MESH_ORDER_MORTON
Definition: mesh_reorder.h:72
@ MESH_ORDER_HILBERT
Definition: mesh_reorder.h:67
void compute_Hilbert_order(index_t total_nb_vertices, const double *vertices, vector< index_t > &sorted_indices, index_t first, index_t last, index_t dimension, index_t stride=3)
Computes the Hilbert order for a set of 3D points.
void compute_BRIO_order(index_t nb_vertices, const double *vertices, vector< index_t > &sorted_indices, index_t dimension, index_t stride=3, index_t threshold=64, double ratio=0.125, vector< index_t > *levels=nullptr)
Computes the BRIO order for a set of 3D points.
void Hilbert_sort_periodic(index_t nb_vertices, const double *vertices, vector< index_t > &sorted_indices, index_t dimension, index_t stride, vector< index_t >::iterator first, vector< index_t >::iterator last, const vec3 &period)
Spatially sort a set of vertices in periodic space.
Types and functions for numbers manipulation.