Point Cloud Library (PCL) 1.13.0
geometry.h
1/*
2Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho
3All rights reserved.
4
5Redistribution and use in source and binary forms, with or without modification,
6are permitted provided that the following conditions are met:
7
8Redistributions of source code must retain the above copyright notice, this list of
9conditions and the following disclaimer. Redistributions in binary form must reproduce
10the above copyright notice, this list of conditions and the following disclaimer
11in the documentation and/or other materials provided with the distribution.
12
13Neither the name of the Johns Hopkins University nor the names of its contributors
14may be used to endorse or promote products derived from this software without specific
15prior written permission.
16
17THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
18EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES
19OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
20SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
21INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
22TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
25ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
26DAMAGE.
27*/
28
29#ifndef GEOMETRY_INCLUDED
30#define GEOMETRY_INCLUDED
31
32#if defined __GNUC__
33# pragma GCC system_header
34#endif
35
36#include <pcl/pcl_macros.h>
37#include <math.h>
38#include <vector>
39#include <unordered_map>
40
41namespace pcl
42{
43 namespace poisson
44 {
45
46 template<class Real>
47 Real Random(void);
48
49 template< class Real >
50 struct Point3D
51 {
53 Point3D( void ) { coords[0] = coords[1] = coords[2] = Real(0); }
54 inline Real& operator[] ( int i ) { return coords[i]; }
55 inline const Real& operator[] ( int i ) const { return coords[i]; }
56 inline Point3D& operator += ( Point3D p ){ coords[0] += p.coords[0] , coords[1] += p.coords[1] , coords[2] += p.coords[2] ; return *this; }
57 inline Point3D& operator -= ( Point3D p ){ coords[0] -= p.coords[0] , coords[1] -= p.coords[1] , coords[2] -= p.coords[2] ; return *this; }
58 inline Point3D& operator *= ( Real r ){ coords[0] *= r , coords[1] *= r , coords[2] *= r ; return *this; }
59 inline Point3D& operator /= ( Real r ){ coords[0] /= r , coords[1] /= r , coords[2] /= r ; return *this; }
60 inline Point3D operator + ( Point3D p ) const { Point3D q ; q.coords[0] = coords[0] + p.coords[0] , q.coords[1] = coords[1] + p.coords[1] , q.coords[2] = coords[2] + p.coords[2] ; return q; }
61 inline Point3D operator - ( Point3D p ) const { Point3D q ; q.coords[0] = coords[0] - p.coords[0] , q.coords[1] = coords[1] - p.coords[1] , q.coords[2] = coords[2] - p.coords[2] ; return q; }
62 inline Point3D operator * ( Real r ) const { Point3D q ; q.coords[0] = coords[0] * r , q.coords[1] = coords[1] * r , q.coords[2] = coords[2] * r ; return q; }
63 inline Point3D operator / ( Real r ) const { return (*this) * ( Real(1.)/r ); }
64 };
65
66 template<class Real>
67 Point3D<Real> RandomBallPoint(void);
68
69 template<class Real>
70 Point3D<Real> RandomSpherePoint(void);
71
72 template<class Real>
73 double Length(const Point3D<Real>& p);
74
75 template<class Real>
76 double SquareLength(const Point3D<Real>& p);
77
78 template<class Real>
79 double Distance(const Point3D<Real>& p1,const Point3D<Real>& p2);
80
81 template<class Real>
82 double SquareDistance(const Point3D<Real>& p1,const Point3D<Real>& p2);
83
84 template <class Real>
85 void CrossProduct(const Point3D<Real>& p1,const Point3D<Real>& p2,Point3D<Real>& p);
86
87 class Edge
88 {
89 public:
90 double p[2][2];
91 double Length(void) const
92 {
93 double d[2];
94 d[0]=p[0][0]-p[1][0];
95 d[1]=p[0][1]-p[1][1];
96
97 return sqrt(d[0]*d[0]+d[1]*d[1]);
98 }
99 };
101 {
102 public:
103 double p[3][3];
104 double Area(void) const
105 {
106 double v1[3] , v2[3] , v[3];
107 for( int d=0 ; d<3 ; d++ )
108 {
109 v1[d] = p[1][d] - p[0][d];
110 v2[d] = p[2][d] - p[0][d];
111 }
112 v[0] = v1[1]*v2[2] - v1[2]*v2[1];
113 v[1] = -v1[0]*v2[2] + v1[2]*v2[0];
114 v[2] = v1[0]*v2[1] - v1[1]*v2[0];
115 return sqrt( v[0]*v[0] + v[1]*v[1] + v[2]*v[2] ) / 2;
116 }
117 double AspectRatio(void) const
118 {
119 double d=0;
120 int i,j;
121 for(i=0;i<3;i++){
122 for(i=0;i<3;i++)
123 for(j=0;j<3;j++){d+=(p[(i+1)%3][j]-p[i][j])*(p[(i+1)%3][j]-p[i][j]);}
124 }
125 return Area()/d;
126 }
127
128 };
130 {
131 public:
132 int index;
133 char inCore;
134
135 int operator == (const CoredPointIndex& cpi) const {return (index==cpi.index) && (inCore==cpi.inCore);};
136 int operator != (const CoredPointIndex& cpi) const {return (index!=cpi.index) || (inCore!=cpi.inCore);};
137 };
139 public:
140 int idx[2];
141 };
143 public:
145 };
147 public:
148 int idx[3];
149 };
150
152 {
153 public:
155 int pIndex[2];
156 int tIndex[2];
157 };
158
160 {
161 public:
163 int eIndex[3];
164 };
165
166 template<class Real>
168 {
169 public:
170
171 std::vector<Point3D<Real> > points;
172 std::vector<TriangulationEdge> edges;
173 std::vector<TriangulationTriangle> triangles;
174
175 int factor( int tIndex,int& p1,int& p2,int& p3);
176 double area(void);
177 double area( int tIndex );
178 double area( int p1 , int p2 , int p3 );
179 int flipMinimize( int eIndex);
180 int addTriangle( int p1 , int p2 , int p3 );
181
182 protected:
183 std::unordered_map<long long,int> edgeMap;
184 static long long EdgeIndex( int p1 , int p2 );
185 double area(const Triangle& t);
186 };
187
188
189 template<class Real>
190 void EdgeCollapse(const Real& edgeRatio,std::vector<TriangleIndex>& triangles,std::vector< Point3D<Real> >& positions,std::vector<Point3D<Real> >* normals);
191 template<class Real>
192 void TriangleCollapse(const Real& edgeRatio,std::vector<TriangleIndex>& triangles,std::vector<Point3D<Real> >& positions,std::vector<Point3D<Real> >* normals);
193
195 {
196 int idx;
197 bool inCore;
198 };
200 {
201 public:
202 std::vector<Point3D<float> > inCorePoints;
203
204 virtual ~CoredMeshData() = default;
205 virtual void resetIterator( void ) = 0;
206
207 virtual int addOutOfCorePoint( const Point3D<float>& p ) = 0;
208 virtual int addPolygon( const std::vector< CoredVertexIndex >& vertices ) = 0;
209
211 virtual int nextPolygon( std::vector< CoredVertexIndex >& vertices ) = 0;
212
213 virtual int outOfCorePointCount(void)=0;
214 virtual int polygonCount( void ) = 0;
215 };
216 // Stores the iso-span of each vertex, rather than it's position
218 {
219 public:
220 struct Vertex
221 {
223 float value;
224 Vertex( void ) { ; }
225 Vertex( Point3D< float > s , Point3D< float > e , float v ) { start = s , end = e , value = v; }
227 {
228 start = s , end = e;
229 // < p , e-s > = < s + v*(e-s) , e-s >
230 // < p , e-s > - < s , e-s > = v || e-s || ^2
231 // v = < p-s , e-s > / || e-s ||^2
232 Point3D< float > p1 = p-s , p2 = e-s;
233 value = ( p1[0] * p2[0] + p1[1] * p2[1] + p1[2] * p2[2] ) / ( p2[0] * p2[0] + p2[1] * p2[1] + p2[2] * p2[2] );
234 }
235 };
236
237 virtual ~CoredMeshData2() = default;
238
239 std::vector< Vertex > inCorePoints;
240 virtual void resetIterator( void ) = 0;
241
242 virtual int addOutOfCorePoint( const Vertex& v ) = 0;
243 virtual int addPolygon( const std::vector< CoredVertexIndex >& vertices ) = 0;
244
245 virtual int nextOutOfCorePoint( Vertex& v ) = 0;
246 virtual int nextPolygon( std::vector< CoredVertexIndex >& vertices ) = 0;
247
248 virtual int outOfCorePointCount( void )=0;
249 virtual int polygonCount( void ) = 0;
250 };
251
253 {
254 std::vector<Point3D<float> > oocPoints;
255 std::vector< std::vector< int > > polygons;
256 int polygonIndex;
257 int oocPointIndex;
258 public:
260
261 void resetIterator(void);
262
264 int addPolygon( const std::vector< CoredVertexIndex >& vertices );
265
267 int nextPolygon( std::vector< CoredVertexIndex >& vertices );
268
270 int polygonCount( void );
271 };
273 {
274 std::vector< CoredMeshData2::Vertex > oocPoints;
275 std::vector< std::vector< int > > polygons;
276 int polygonIndex;
277 int oocPointIndex;
278 public:
280
281 void resetIterator(void);
282
284 int addPolygon( const std::vector< CoredVertexIndex >& vertices );
285
287 int nextPolygon( std::vector< CoredVertexIndex >& vertices );
288
290 int polygonCount( void );
291 };
293 {
294 FILE *oocPointFile , *polygonFile;
295 int oocPoints , polygons;
296 public:
299
300 void resetIterator(void);
301
303 int addPolygon( const std::vector< CoredVertexIndex >& vertices );
304
306 int nextPolygon( std::vector< CoredVertexIndex >& vertices );
307
309 int polygonCount( void );
310 };
312 {
313 FILE *oocPointFile , *polygonFile;
314 int oocPoints , polygons;
315 public:
318
319 void resetIterator( void );
320
322 int addPolygon( const std::vector< CoredVertexIndex >& vertices );
323
325 int nextPolygon( std::vector< CoredVertexIndex >& vertices );
326
328 int polygonCount( void );
329 };
330 }
331}
332
333#include "geometry.hpp"
334
335
336
337
338#endif // GEOMETRY_INCLUDED
CoredPointIndex idx[2]
Definition: geometry.h:144
int nextOutOfCorePoint(CoredMeshData2::Vertex &v)
int addPolygon(const std::vector< CoredVertexIndex > &vertices)
int addOutOfCorePoint(const CoredMeshData2::Vertex &v)
int nextPolygon(std::vector< CoredVertexIndex > &vertices)
int nextOutOfCorePoint(Point3D< float > &p)
int nextPolygon(std::vector< CoredVertexIndex > &vertices)
int addPolygon(const std::vector< CoredVertexIndex > &vertices)
int addOutOfCorePoint(const Point3D< float > &p)
virtual int nextPolygon(std::vector< CoredVertexIndex > &vertices)=0
virtual int nextOutOfCorePoint(Vertex &v)=0
virtual void resetIterator(void)=0
virtual int addPolygon(const std::vector< CoredVertexIndex > &vertices)=0
virtual int addOutOfCorePoint(const Vertex &v)=0
std::vector< Vertex > inCorePoints
Definition: geometry.h:239
virtual int polygonCount(void)=0
virtual int outOfCorePointCount(void)=0
virtual ~CoredMeshData2()=default
virtual void resetIterator(void)=0
std::vector< Point3D< float > > inCorePoints
Definition: geometry.h:202
virtual int nextPolygon(std::vector< CoredVertexIndex > &vertices)=0
virtual int nextOutOfCorePoint(Point3D< float > &p)=0
virtual int addOutOfCorePoint(const Point3D< float > &p)=0
virtual int polygonCount(void)=0
virtual ~CoredMeshData()=default
virtual int outOfCorePointCount(void)=0
virtual int addPolygon(const std::vector< CoredVertexIndex > &vertices)=0
int nextPolygon(std::vector< CoredVertexIndex > &vertices)
int addPolygon(const std::vector< CoredVertexIndex > &vertices)
int addOutOfCorePoint(const CoredMeshData2::Vertex &v)
int nextOutOfCorePoint(CoredMeshData2::Vertex &v)
int addPolygon(const std::vector< CoredVertexIndex > &vertices)
int nextPolygon(std::vector< CoredVertexIndex > &vertices)
int nextOutOfCorePoint(Point3D< float > &p)
int addOutOfCorePoint(const Point3D< float > &p)
double p[2][2]
Definition: geometry.h:90
double Length(void) const
Definition: geometry.h:91
double p[3][3]
Definition: geometry.h:103
double AspectRatio(void) const
Definition: geometry.h:117
double Area(void) const
Definition: geometry.h:104
int flipMinimize(int eIndex)
Definition: geometry.hpp:375
std::vector< TriangulationEdge > edges
Definition: geometry.h:172
std::unordered_map< long long, int > edgeMap
Definition: geometry.h:183
std::vector< TriangulationTriangle > triangles
Definition: geometry.h:173
static long long EdgeIndex(int p1, int p2)
Definition: geometry.hpp:292
std::vector< Point3D< Real > > points
Definition: geometry.h:171
int factor(int tIndex, int &p1, int &p2, int &p3)
Definition: geometry.hpp:299
int addTriangle(int p1, int p2, int p3)
Definition: geometry.hpp:336
double area(const Triangle &t)
double Distance(const Point3D< Real > &p1, const Point3D< Real > &p2)
Definition: geometry.hpp:71
double SquareDistance(const Point3D< Real > &p1, const Point3D< Real > &p2)
Definition: geometry.hpp:66
void CrossProduct(const Point3D< Real > &p1, const Point3D< Real > &p2, Point3D< Real > &p)
Definition: geometry.hpp:74
Real Random(void)
Definition: geometry.hpp:36
Point3D< Real > RandomSpherePoint(void)
Definition: geometry.hpp:50
double SquareLength(const Point3D< Real > &p)
Definition: geometry.hpp:60
void TriangleCollapse(const Real &edgeRatio, std::vector< TriangleIndex > &triangles, std::vector< Point3D< Real > > &positions, std::vector< Point3D< Real > > *normals)
Definition: geometry.hpp:177
void EdgeCollapse(const Real &edgeRatio, std::vector< TriangleIndex > &triangles, std::vector< Point3D< Real > > &positions, std::vector< Point3D< Real > > *normals)
Definition: geometry.hpp:81
Point3D< Real > RandomBallPoint(void)
Definition: geometry.hpp:39
double Length(const Point3D< Real > &p)
Definition: geometry.hpp:63
bool operator==(const PCLHeader &lhs, const PCLHeader &rhs)
Definition: PCLHeader.h:37
Defines all the PCL and non-PCL macros used.
#define PCL_EXPORTS
Definition: pcl_macros.h:323
Vertex(Point3D< float > s, Point3D< float > e, float v)
Definition: geometry.h:225
Vertex(Point3D< float > s, Point3D< float > e, Point3D< float > p)
Definition: geometry.h:226
Point3D & operator/=(Real r)
Definition: geometry.h:59
Point3D operator+(Point3D p) const
Definition: geometry.h:60
Point3D operator-(Point3D p) const
Definition: geometry.h:61
Real & operator[](int i)
Definition: geometry.h:54
Point3D operator/(Real r) const
Definition: geometry.h:63
Point3D & operator-=(Point3D p)
Definition: geometry.h:57
Point3D operator*(Real r) const
Definition: geometry.h:62
Point3D & operator*=(Real r)
Definition: geometry.h:58
Point3D & operator+=(Point3D p)
Definition: geometry.h:56