Geogram  Version 1.9.1-rc
A programming library of geometric algorithms
principal_axes.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_POINTS_PRINCIPAL_AXES
41 #define GEOGRAM_POINTS_PRINCIPAL_AXES
42 
43 #include <geogram/basic/common.h>
44 #include <geogram/basic/numeric.h>
45 #include <geogram/basic/geometry.h>
46 #include <geogram/basic/logger.h>
48 
55 namespace GEO {
56 
61  class GEOGRAM_API PrincipalAxes3d {
62  public:
67 
71  void begin();
72 
76  void end();
77 
84  void add_point(const vec3& p, double weight = 1.0);
85 
91  vec3 center() const {
92  return vec3(center_[0], center_[1], center_[2]);
93  }
94 
101  const vec3& axis(index_t i) const {
102  return axis_[i];
103  }
104 
111  double eigen_value(index_t i) const {
112  return eigen_value_[i];
113  }
114 
120  vec3 normal() const {
121  return axis(2);
122  }
123 
124  private:
125  double center_[3] ;
126  vec3 axis_[3] ;
127  double eigen_value_[3] ;
128 
129  double M_[6] ;
130  int nb_points_ ;
131  double sum_weights_ ;
132  };
133 }
134 
135 #endif
double eigen_value(index_t i) const
Gets one of the eigenvalues.
void begin()
Begins a principal axes estimation.
vec3 normal() const
Gets the estimated normal to the point cloud.
PrincipalAxes3d()
PrincipalAxes3d constructor.
void end()
Ends a principal axes estimation.
vec3 center() const
Gets the center.
const vec3 & axis(index_t i) const
Gets one of the axes.
void add_point(const vec3 &p, double weight=1.0)
Adds a point to the current principal axes estimation.
Common include file, providing basic definitions. Should be included before anything else by all head...
Geometric functions in 2d and 3d.
Generic logging mechanism.
Some utilities for matrix manipulation.
Global Vorpaline namespace.
Definition: basic.h:55
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
Types and functions for numbers manipulation.