ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
Geometry.h
Go to the documentation of this file.
1 /*
2 Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho
3 All rights reserved.
4 
5 Redistribution and use in source and binary forms, with or without modification,
6 are permitted provided that the following conditions are met:
7 
8 Redistributions of source code must retain the above copyright notice, this list of
9 conditions and the following disclaimer. Redistributions in binary form must reproduce
10 the above copyright notice, this list of conditions and the following disclaimer
11 in the documentation and/or other materials provided with the distribution.
12 
13 Neither the name of the Johns Hopkins University nor the names of its contributors
14 may be used to endorse or promote products derived from this software without specific
15 prior written permission.
16 
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
18 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES
19 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
20 SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
21 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
22 TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
25 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
26 DAMAGE.
27 */
28 
29 #ifndef GEOMETRY_INCLUDED
30 #define GEOMETRY_INCLUDED
31 
32 #include <math.h>
33 #include <vector>
34 #include <stdlib.h>
35 #include <stdio.h>
36 #include "Hash.h"
37 
38 template<class Real>
39 Real Random(void);
40 
41 template< class Real >
42 struct Point3D
43 {
44  Real coords[3];
45  Point3D( void ) { coords[0] = coords[1] = coords[2] = Real(0); }
46  Point3D( Real v ) { coords[0] = coords[1] = coords[2] = v; }
47  template< class _Real > Point3D( _Real v0 , _Real v1 , _Real v2 ){ coords[0] = Real(v0) , coords[1] = Real(v1) , coords[2] = Real(v2); }
48  template< class _Real > Point3D( const Point3D< _Real >& p ){ coords[0] = Real( p[0] ) , coords[1] = Real( p[1] ) , coords[2] = Real( p[2] ); }
49  inline Real& operator[] ( int i ) { return coords[i]; }
50  inline const Real& operator[] ( int i ) const { return coords[i]; }
51  inline Point3D operator - ( void ) const { Point3D q ; q.coords[0] = -coords[0] , q.coords[1] = -coords[1] , q.coords[2] = -coords[2] ; return q; }
52 
53  template< class _Real > inline Point3D& operator += ( Point3D< _Real > p ){ coords[0] += Real(p.coords[0]) , coords[1] += Real(p.coords[1]) , coords[2] += Real(p.coords[2]) ; return *this; }
54  template< class _Real > inline Point3D operator + ( Point3D< _Real > p ) const { Point3D q ; q.coords[0] = coords[0] + Real(p.coords[0]) , q.coords[1] = coords[1] + Real(p.coords[1]) , q.coords[2] = coords[2] + Real(p.coords[2]) ; return q; }
55  template< class _Real > inline Point3D& operator *= ( _Real r ) { coords[0] *= Real(r) , coords[1] *= Real(r) , coords[2] *= Real(r) ; return *this; }
56  template< class _Real > inline Point3D operator * ( _Real r ) const { Point3D q ; q.coords[0] = coords[0] * Real(r) , q.coords[1] = coords[1] * Real(r) , q.coords[2] = coords[2] * Real(r) ; return q; }
57 
58  template< class _Real > inline Point3D& operator -= ( Point3D< _Real > p ){ return ( (*this)+=(-p) ); }
59  template< class _Real > inline Point3D operator - ( Point3D< _Real > p ) const { return (*this)+(-p); }
60  template< class _Real > inline Point3D& operator /= ( _Real r ){ return ( (*this)*=Real(1./r) ); }
61  template< class _Real > inline Point3D operator / ( _Real r ) const { return (*this) * ( Real(1.)/r ); }
62 
63  static Real Dot( const Point3D< Real >& p1 , const Point3D< Real >& p2 ){ return p1.coords[0]*p2.coords[0] + p1.coords[1]*p2.coords[1] + p1.coords[2]*p2.coords[2]; }
64  template< class Real1 , class Real2 >
65  static Real Dot( const Point3D< Real1 >& p1 , const Point3D< Real2 >& p2 ){ return Real( p1.coords[0]*p2.coords[0] + p1.coords[1]*p2.coords[1] + p1.coords[2]*p2.coords[2] ); }
66 };
67 
68 template< class Real >
69 struct XForm3x3
70 {
71  Real coords[3][3];
72  XForm3x3( void ) { for( int i=0 ; i<3 ; i++ ) for( int j=0 ; j<3 ; j++ ) coords[i][j] = Real(0.); }
73  static XForm3x3 Identity( void )
74  {
75  XForm3x3 xForm;
76  xForm(0,0) = xForm(1,1) = xForm(2,2) = Real(1.);
77  return xForm;
78  }
79  Real& operator() ( int i , int j ){ return coords[i][j]; }
80  const Real& operator() ( int i , int j ) const { return coords[i][j]; }
81  template< class _Real > Point3D< _Real > operator * ( const Point3D< _Real >& p ) const
82  {
84  for( int i=0 ; i<3 ; i++ ) for( int j=0 ; j<3 ; j++ ) q[i] += _Real( coords[j][i] * p[j] );
85  return q;
86  }
87  XForm3x3 operator * ( const XForm3x3& m ) const
88  {
89  XForm3x3 n;
90  for( int i=0 ; i<3 ; i++ ) for( int j=0 ; j<3 ; j++ ) for( int k=0 ; k<3 ; k++ ) n.coords[i][j] += m.coords[i][k]*coords[k][j];
91  return n;
92  }
93  XForm3x3 transpose( void ) const
94  {
95  XForm3x3 xForm;
96  for( int i=0 ; i<3 ; i++ ) for( int j=0 ; j<3 ; j++ ) xForm( i , j ) = coords[j][i];
97  return xForm;
98  }
99  Real subDeterminant( int i , int j ) const
100  {
101  int i1 = (i+1)%3 , i2 = (i+2)%3;
102  int j1 = (j+1)%3 , j2 = (j+2)%3;
103  return coords[i1][j1] * coords[i2][j2] - coords[i1][j2] * coords[i2][j1];
104  }
105  Real determinant( void ) const { return coords[0][0] * subDeterminant( 0 , 0 ) + coords[1][0] * subDeterminant( 1 , 0 ) + coords[2][0] * subDeterminant( 2 , 0 ); }
106  XForm3x3 inverse( void ) const
107  {
108  XForm3x3 xForm;
109  Real d = determinant();
110  for( int i=0 ; i<3 ; i++ ) for( int j=0 ; j<3 ;j++ ) xForm.coords[j][i] = subDeterminant( i , j ) / d;
111  return xForm;
112  }
113 };
114 
115 template< class Real >
116 struct XForm4x4
117 {
118  Real coords[4][4];
119  XForm4x4( void ) { for( int i=0 ; i<4 ; i++ ) for( int j=0 ; j<4 ; j++ ) coords[i][j] = Real(0.); }
120  static XForm4x4 Identity( void )
121  {
122  XForm4x4 xForm;
123  xForm(0,0) = xForm(1,1) = xForm(2,2) = xForm(3,3) = Real(1.);
124  return xForm;
125  }
126  Real& operator() ( int i , int j ){ return coords[i][j]; }
127  const Real& operator() ( int i , int j ) const { return coords[i][j]; }
128  template< class _Real > Point3D< _Real > operator * ( const Point3D< _Real >& p ) const
129  {
131  for( int i=0 ; i<3 ; i++ )
132  {
133  for( int j=0 ; j<3 ; j++ ) q[i] += (_Real)( coords[j][i] * p[j] );
134  q[i] += (_Real)coords[3][i];
135  }
136  return q;
137  }
138  XForm4x4 operator * ( const XForm4x4& m ) const
139  {
140  XForm4x4 n;
141  for( int i=0 ; i<4 ; i++ ) for( int j=0 ; j<4 ; j++ ) for( int k=0 ; k<4 ; k++ ) n.coords[i][j] += m.coords[i][k]*coords[k][j];
142  return n;
143  }
144  XForm4x4 transpose( void ) const
145  {
146  XForm4x4 xForm;
147  for( int i=0 ; i<4 ; i++ ) for( int j=0 ; j<4 ; j++ ) xForm( i , j ) = coords[j][i];
148  return xForm;
149  }
150  Real subDeterminant( int i , int j ) const
151  {
152  XForm3x3< Real > xForm;
153  int ii[] = { (i+1)%4 , (i+2)%4 , (i+3)%4 } , jj[] = { (j+1)%4 , (j+2)%4 , (j+3)%4 };
154  for( int _i=0 ; _i<3 ; _i++ ) for( int _j=0 ; _j<3 ; _j++ ) xForm( _i , _j ) = coords[ ii[_i] ][ jj[_j] ];
155  return xForm.determinant();
156  }
157  Real determinant( void ) const { return coords[0][0] * subDeterminant( 0 , 0 ) - coords[1][0] * subDeterminant( 1 , 0 ) + coords[2][0] * subDeterminant( 2 , 0 ) - coords[3][0] * subDeterminant( 3 , 0 ); }
158  XForm4x4 inverse( void ) const
159  {
160  XForm4x4 xForm;
161  Real d = determinant();
162  for( int i=0 ; i<4 ; i++ ) for( int j=0 ; j<4 ;j++ )
163  if( (i+j)%2==0 ) xForm.coords[j][i] = subDeterminant( i , j ) / d;
164  else xForm.coords[j][i] = -subDeterminant( i , j ) / d;
165  return xForm;
166  }
167 };
168 
169 
170 template<class Real>
172 
173 template<class Real>
175 
176 template<class Real>
177 double Length(const Point3D<Real>& p);
178 
179 template<class Real>
180 double SquareLength(const Point3D<Real>& p);
181 
182 template<class Real>
183 double Distance(const Point3D<Real>& p1,const Point3D<Real>& p2);
184 
185 template<class Real>
186 double SquareDistance(const Point3D<Real>& p1,const Point3D<Real>& p2);
187 
188 template <class Real>
190 
191 
192 class Edge{
193 public:
194  double p[2][2];
195  double Length(void) const{
196  double d[2];
197  d[0]=p[0][0]-p[1][0];
198  d[1]=p[0][1]-p[1][1];
199 
200  return sqrt(d[0]*d[0]+d[1]*d[1]);
201  }
202 };
203 class Triangle{
204 public:
205  double p[3][3];
206  double Area(void) const{
207  double v1[3] , v2[3] , v[3];
208  for( int d=0 ; d<3 ; d++ )
209  {
210  v1[d] = p[1][d] - p[0][d];
211  v2[d] = p[2][d] - p[0][d];
212  }
213  v[0] = v1[1]*v2[2] - v1[2]*v2[1];
214  v[1] = -v1[0]*v2[2] + v1[2]*v2[0];
215  v[2] = v1[0]*v2[1] - v1[1]*v2[0];
216  return sqrt( v[0]*v[0] + v[1]*v[1] + v[2]*v[2] ) / 2;
217  }
218  double AspectRatio(void) const{
219  double d=0;
220  int i,j;
221  for(i=0;i<3;i++){
222  for(i=0;i<3;i++)
223  for(j=0;j<3;j++){d+=(p[(i+1)%3][j]-p[i][j])*(p[(i+1)%3][j]-p[i][j]);}
224  }
225  return Area()/d;
226  }
227 
228 };
230 {
231 public:
232  int index;
233  char inCore;
234 
235  int operator == (const CoredPointIndex& cpi) const {return (index==cpi.index) && (inCore==cpi.inCore);};
236  int operator != (const CoredPointIndex& cpi) const {return (index!=cpi.index) || (inCore!=cpi.inCore);};
237 };
238 class EdgeIndex{
239 public:
240  int idx[2];
241 };
243 {
244 public:
246 };
248 public:
249  int idx[3];
250 };
251 
253 {
254 public:
255  TriangulationEdge(void);
256  int pIndex[2];
257  int tIndex[2];
258 };
259 
261 {
262 public:
263  TriangulationTriangle(void);
264  int eIndex[3];
265 };
266 
267 template<class Real>
269 {
270 public:
271 
272  std::vector<Point3D<Real> > points;
273  std::vector<TriangulationEdge> edges;
274  std::vector<TriangulationTriangle> triangles;
275 
276  int factor( int tIndex,int& p1,int& p2,int& p3);
277  double area(void);
278  double area( int tIndex );
279  double area( int p1 , int p2 , int p3 );
280  int flipMinimize( int eIndex);
281  int addTriangle( int p1 , int p2 , int p3 );
282 
283 protected:
284  hash_map<long long,int> edgeMap;
285  static long long EdgeIndex( int p1 , int p2 );
286  double area(const Triangle& t);
287 };
288 
289 
290 template<class Real>
291 void EdgeCollapse(const Real& edgeRatio,std::vector<TriangleIndex>& triangles,std::vector< Point3D<Real> >& positions,std::vector<Point3D<Real> >* normals);
292 template<class Real>
293 void TriangleCollapse(const Real& edgeRatio,std::vector<TriangleIndex>& triangles,std::vector<Point3D<Real> >& positions,std::vector<Point3D<Real> >* normals);
294 
296 {
297  int idx;
298  bool inCore;
299 };
300 template< class Vertex >
302 {
303 public:
304  std::vector< Vertex > inCorePoints;
305  virtual void resetIterator( void ) = 0;
306 
307  virtual int addOutOfCorePoint( const Vertex& p ) = 0;
308  virtual int addOutOfCorePoint_s( const Vertex& p ) = 0;
309  virtual int addPolygon_s( const std::vector< CoredVertexIndex >& vertices ) = 0;
310  virtual int addPolygon_s( const std::vector< int >& vertices ) = 0;
311 
312  virtual int nextOutOfCorePoint( Vertex& p )=0;
313  virtual int nextPolygon( std::vector< CoredVertexIndex >& vertices ) = 0;
314 
315  virtual int outOfCorePointCount(void)=0;
316  virtual int polygonCount( void ) = 0;
317 };
318 
319 template< class Vertex >
320 class CoredVectorMeshData : public CoredMeshData< Vertex >
321 {
322  std::vector< Vertex > oocPoints;
323  std::vector< std::vector< int > > polygons;
324  int polygonIndex;
325  int oocPointIndex;
326 public:
328 
329  void resetIterator(void);
330 
331  int addOutOfCorePoint( const Vertex& p );
332  int addOutOfCorePoint_s( const Vertex& p );
333  int addPolygon_s( const std::vector< CoredVertexIndex >& vertices );
334  int addPolygon_s( const std::vector< int >& vertices );
335 
337  int nextPolygon( std::vector< CoredVertexIndex >& vertices );
338 
340  int polygonCount( void );
341 };
343 {
344  bool tempFile;
345  FILE* _fp;
346  char *_buffer , _fileName[1024];
347  size_t _bufferIndex , _bufferSize;
348 public:
349  BufferedReadWriteFile( char* fileName=NULL , int bufferSize=(1<<20) );
350  ~BufferedReadWriteFile( void );
351  bool write( const void* data , size_t size );
352  bool read ( void* data , size_t size );
353  void reset( void );
354 };
355 template< class Vertex >
356 class CoredFileMeshData : public CoredMeshData< Vertex >
357 {
358  char pointFileName[1024] , polygonFileName[1024];
359  BufferedReadWriteFile *oocPointFile , *polygonFile;
360  int oocPoints , polygons;
361 public:
364 
365  void resetIterator( void );
366 
367  int addOutOfCorePoint( const Vertex& p );
368  int addOutOfCorePoint_s( const Vertex& p );
369  int addPolygon_s( const std::vector< CoredVertexIndex >& vertices );
370  int addPolygon_s( const std::vector< int >& vertices );
371 
373  int nextPolygon( std::vector< CoredVertexIndex >& vertices );
374 
375  int outOfCorePointCount( void );
376  int polygonCount( void );
377 };
378 #include "Geometry.inl"
379 
380 #endif // GEOMETRY_INCLUDED
int size
double Length(const Point3D< Real > &p)
double Distance(const Point3D< Real > &p1, const Point3D< Real > &p2)
Point3D< Real > RandomBallPoint(void)
double SquareDistance(const Point3D< Real > &p1, const Point3D< Real > &p2)
void CrossProduct(const Point3D< Real > &p1, const Point3D< Real > &p2, Point3D< Real > &p)
Point3D< Real > RandomSpherePoint(void)
double SquareLength(const Point3D< Real > &p)
void TriangleCollapse(const Real &edgeRatio, std::vector< TriangleIndex > &triangles, std::vector< Point3D< Real > > &positions, std::vector< Point3D< Real > > *normals)
Real Random(void)
void EdgeCollapse(const Real &edgeRatio, std::vector< TriangleIndex > &triangles, std::vector< Point3D< Real > > &positions, std::vector< Point3D< Real > > *normals)
#define NULL
BufferedReadWriteFile(char *fileName=NULL, int bufferSize=(1<< 20))
Definition: Geometry.cpp:45
bool read(void *data, size_t size)
Definition: Geometry.cpp:99
~BufferedReadWriteFile(void)
Definition: Geometry.cpp:64
bool write(const void *data, size_t size)
Definition: Geometry.cpp:78
CoredPointIndex idx[2]
Definition: Geometry.h:245
int addOutOfCorePoint_s(const Vertex &p)
int polygonCount(void)
int addPolygon_s(const std::vector< CoredVertexIndex > &vertices)
void resetIterator(void)
int outOfCorePointCount(void)
int addOutOfCorePoint(const Vertex &p)
int addPolygon_s(const std::vector< int > &vertices)
int nextOutOfCorePoint(Vertex &p)
int nextPolygon(std::vector< CoredVertexIndex > &vertices)
virtual int polygonCount(void)=0
virtual int nextPolygon(std::vector< CoredVertexIndex > &vertices)=0
virtual int nextOutOfCorePoint(Vertex &p)=0
virtual int outOfCorePointCount(void)=0
virtual int addPolygon_s(const std::vector< CoredVertexIndex > &vertices)=0
std::vector< Vertex > inCorePoints
Definition: Geometry.h:304
virtual int addOutOfCorePoint_s(const Vertex &p)=0
virtual int addOutOfCorePoint(const Vertex &p)=0
virtual int addPolygon_s(const std::vector< int > &vertices)=0
virtual void resetIterator(void)=0
int operator!=(const CoredPointIndex &cpi) const
Definition: Geometry.h:236
int operator==(const CoredPointIndex &cpi) const
Definition: Geometry.h:235
int polygonCount(void)
void resetIterator(void)
int nextPolygon(std::vector< CoredVertexIndex > &vertices)
int addOutOfCorePoint(const Vertex &p)
int nextOutOfCorePoint(Vertex &p)
int addPolygon_s(const std::vector< CoredVertexIndex > &vertices)
int addPolygon_s(const std::vector< int > &vertices)
int outOfCorePointCount(void)
int addOutOfCorePoint_s(const Vertex &p)
int idx[2]
Definition: Geometry.h:240
int idx[3]
Definition: Geometry.h:249
double Area(void) const
Definition: Geometry.h:206
double p[3][3]
Definition: Geometry.h:205
double AspectRatio(void) const
Definition: Geometry.h:218
TriangulationEdge(void)
Definition: Geometry.cpp:39
static long long EdgeIndex(int p1, int p2)
double area(int p1, int p2, int p3)
double area(void)
double area(const Triangle &t)
std::unordered_map< long long, int > edgeMap
Definition: Geometry.h:284
std::vector< Point3D< Real > > points
Definition: Geometry.h:272
int addTriangle(int p1, int p2, int p3)
int flipMinimize(int eIndex)
double area(int tIndex)
std::vector< TriangulationTriangle > triangles
Definition: Geometry.h:274
int factor(int tIndex, int &p1, int &p2, int &p3)
std::vector< TriangulationEdge > edges
Definition: Geometry.h:273
double normals[3]
double Length(void) const
Definition: Geometry.h:195
double p[2][2]
Definition: Geometry.h:194
Point3D operator+(Point3D< _Real > p) const
Definition: Geometry.h:54
Point3D(void)
Definition: Geometry.h:45
Point3D(const Point3D< _Real > &p)
Definition: Geometry.h:48
Point3D(Real v)
Definition: Geometry.h:46
Point3D operator*(_Real r) const
Definition: Geometry.h:56
static Real Dot(const Point3D< Real > &p1, const Point3D< Real > &p2)
Definition: Geometry.h:63
Point3D operator-(void) const
Definition: Geometry.h:51
Point3D & operator*=(_Real r)
Definition: Geometry.h:55
Point3D(_Real v0, _Real v1, _Real v2)
Definition: Geometry.h:47
Point3D & operator-=(Point3D< _Real > p)
Definition: Geometry.h:58
static Real Dot(const Point3D< Real1 > &p1, const Point3D< Real2 > &p2)
Definition: Geometry.h:65
Real coords[3]
Definition: Geometry.h:44
Point3D operator/(_Real r) const
Definition: Geometry.h:61
Real & operator[](int i)
Definition: Geometry.h:49
Point3D & operator+=(Point3D< _Real > p)
Definition: Geometry.h:53
Point3D & operator/=(_Real r)
Definition: Geometry.h:60
Real subDeterminant(int i, int j) const
Definition: Geometry.h:99
XForm3x3 inverse(void) const
Definition: Geometry.h:106
Real & operator()(int i, int j)
Definition: Geometry.h:79
static XForm3x3 Identity(void)
Definition: Geometry.h:73
Point3D< _Real > operator*(const Point3D< _Real > &p) const
Definition: Geometry.h:81
Real determinant(void) const
Definition: Geometry.h:105
XForm3x3 transpose(void) const
Definition: Geometry.h:93
Real coords[3][3]
Definition: Geometry.h:71
XForm3x3(void)
Definition: Geometry.h:72
Real & operator()(int i, int j)
Definition: Geometry.h:126
XForm4x4 inverse(void) const
Definition: Geometry.h:158
Real subDeterminant(int i, int j) const
Definition: Geometry.h:150
XForm4x4 transpose(void) const
Definition: Geometry.h:144
Real coords[4][4]
Definition: Geometry.h:118
Real determinant(void) const
Definition: Geometry.h:157
XForm4x4(void)
Definition: Geometry.h:119
Point3D< _Real > operator*(const Point3D< _Real > &p) const
Definition: Geometry.h:128
static XForm4x4 Identity(void)
Definition: Geometry.h:120