29 #ifndef GEOMETRY_INCLUDED
30 #define GEOMETRY_INCLUDED
41 template<
class Real >
45 Point3D(
void ) { coords[0] = coords[1] = coords[2] = Real(0); }
46 Point3D( Real v0 , Real v1 , Real v2 ){ coords[0] = v0 , coords[1] = v1 , coords[2] = v2; }
47 template<
class Real2 >
Point3D(
const Point3D< Real2 >& p ){ coords[0] = Real( p[0] ) , coords[1] = Real( p[1] ) , coords[2] = Real( p[2] ); }
48 inline Real& operator[] (
int i ) {
return coords[i]; }
49 inline const Real& operator[] (
int i )
const {
return coords[i]; }
50 inline Point3D& operator += (
Point3D p ){ coords[0] += p.coords[0] , coords[1] += p.coords[1] , coords[2] += p.coords[2] ;
return *
this; }
51 inline Point3D& operator -= (
Point3D p ){ coords[0] -= p.coords[0] , coords[1] -= p.coords[1] , coords[2] -= p.coords[2] ;
return *
this; }
52 inline Point3D& operator *= ( Real r ){ coords[0] *= r , coords[1] *= r , coords[2] *= r ;
return *
this; }
53 inline Point3D& operator /= ( Real r ){ coords[0] /= r , coords[1] /= r , coords[2] /= r ;
return *
this; }
54 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; }
55 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; }
56 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; }
57 inline Point3D operator / ( Real r )
const {
return (*
this) * ( Real(1.)/r ); }
60 template<
class Real >
64 XForm3x3(
void ) {
for(
int i=0 ; i<3 ; i++ )
for(
int j=0 ; j<3 ; j++ ) coords[i][j] = Real(0.); }
68 xForm(0,0) = xForm(1,1) = xForm(2,2) = Real(1.);
71 Real& operator() (
int i ,
int j ){
return coords[i][j]; }
72 const Real& operator() (
int i ,
int j )
const {
return coords[i][j]; }
76 for(
int i=0 ; i<3 ; i++ )
for(
int j=0 ; j<3 ; j++ ) q[i] += coords[j][i] * p[j];
82 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];
88 for(
int i=0 ; i<3 ; i++ )
for(
int j=0 ; j<3 ; j++ ) xForm( i , j ) = coords[j][i];
91 Real subDeterminant(
int i ,
int j )
const
93 int i1 = (i+1)%3 , i2 = (i+2)%3;
94 int j1 = (j+1)%3 , j2 = (j+2)%3;
95 return coords[i1][j1] * coords[i2][j2] - coords[i1][j2] * coords[i2][j1];
97 Real determinant(
void )
const {
return coords[0][0] * subDeterminant( 0 , 0 ) + coords[1][0] * subDeterminant( 1 , 0 ) + coords[2][0] * subDeterminant( 2 , 0 ); }
101 Real d = determinant();
102 for(
int i=0 ; i<3 ; i++ )
for(
int j=0 ; j<3 ;j++ ) xForm.coords[j][i] = subDeterminant( i , j ) / d;
107 template<
class Real >
111 XForm4x4(
void ) {
for(
int i=0 ; i<4 ; i++ )
for(
int j=0 ; j<4 ; j++ ) coords[i][j] = Real(0.); }
115 xForm(0,0) = xForm(1,1) = xForm(2,2) = xForm(3,3) = Real(1.);
118 Real& operator() (
int i ,
int j ){
return coords[i][j]; }
119 const Real& operator() (
int i ,
int j )
const {
return coords[i][j]; }
123 for(
int i=0 ; i<3 ; i++ )
125 for(
int j=0 ; j<3 ; j++ ) q[i] += coords[j][i] * p[j];
126 q[i] += coords[3][i];
133 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];
139 for(
int i=0 ; i<4 ; i++ )
for(
int j=0 ; j<4 ; j++ ) xForm( i , j ) = coords[j][i];
142 Real subDeterminant(
int i ,
int j )
const
145 int ii[] = { (i+1)%4 , (i+2)%4 , (i+3)%4 } , jj[] = { (j+1)%4 , (j+2)%4 , (j+3)%4 };
146 for(
int _i=0 ; _i<3 ; _i++ )
for(
int _j=0 ; _j<3 ; _j++ ) xForm( _i , _j ) = coords[ ii[_i] ][ jj[_j] ];
147 return xForm.determinant();
149 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 ); }
153 Real d = determinant();
154 for(
int i=0 ; i<4 ; i++ )
for(
int j=0 ; j<4 ;j++ )
155 if( (i+j)%2==0 ) xForm.coords[j][i] = subDeterminant( i , j ) / d;
156 else xForm.coords[j][i] = -subDeterminant( i , j ) / d;
180 template <
class Real>
187 double Length(
void)
const{
189 d[0]=p[0][0]-p[1][0];
190 d[1]=p[0][1]-p[1][1];
192 return sqrt(d[0]*d[0]+d[1]*d[1]);
198 double Area(
void)
const{
199 double v1[3] , v2[3] , v[3];
200 for(
int d=0 ; d<3 ; d++ )
202 v1[d] = p[1][d] - p[0][d];
203 v2[d] = p[2][d] - p[0][d];
205 v[0] = v1[1]*v2[2] - v1[2]*v2[1];
206 v[1] = -v1[0]*v2[2] + v1[2]*v2[0];
207 v[2] = v1[0]*v2[1] - v1[1]*v2[0];
208 return sqrt( v[0]*v[0] + v[1]*v[1] + v[2]*v[2] ) / 2;
210 double AspectRatio(
void)
const{
215 for(j=0;j<3;j++){d+=(p[(i+1)%3][j]-p[i][j])*(p[(i+1)%3][j]-p[i][j]);}
226 int operator == (
const CoredPointIndex& cpi)
const {
return (index==cpi.index) && (inCore==cpi.inCore);};
227 int operator != (
const CoredPointIndex& cpi)
const {
return (index!=cpi.index) || (inCore!=cpi.inCore);};
262 std::vector<Point3D<Real> > points;
263 std::vector<TriangulationEdge> edges;
264 std::vector<TriangulationTriangle> triangles;
266 int factor(
int tIndex,
int& p1,
int& p2,
int& p3);
268 double area(
int tIndex );
269 double area(
int p1 ,
int p2 ,
int p3 );
270 int flipMinimize(
int eIndex);
271 int addTriangle(
int p1 ,
int p2 ,
int p3 );
274 hash_map<long long,int> edgeMap;
275 static long long EdgeIndex(
int p1 ,
int p2 );
281 void EdgeCollapse(
const Real& edgeRatio,std::vector<TriangleIndex>& triangles,std::vector<
Point3D<Real> >& positions,std::vector<
Point3D<Real> >* normals);
283 void TriangleCollapse(
const Real& edgeRatio,std::vector<TriangleIndex>& triangles,std::vector<
Point3D<Real> >& positions,std::vector<
Point3D<Real> >* normals);
293 std::vector<Point3D<float> > inCorePoints;
294 virtual void resetIterator(
void ) = 0;
297 virtual int addPolygon(
const std::vector< CoredVertexIndex >& vertices ) = 0;
300 virtual int nextPolygon( std::vector< CoredVertexIndex >& vertices ) = 0;
302 virtual int outOfCorePointCount(
void)=0;
303 virtual int polygonCount(
void ) = 0;
313 Vertex(
void ):value(0.f) { ; }
322 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] );
325 std::vector< Vertex > inCorePoints;
326 virtual void resetIterator(
void ) = 0;
328 virtual int addOutOfCorePoint(
const Vertex& v ) = 0;
329 virtual int addPolygon(
const std::vector< CoredVertexIndex >& vertices ) = 0;
331 virtual int nextOutOfCorePoint(
Vertex& v ) = 0;
332 virtual int nextPolygon( std::vector< CoredVertexIndex >& vertices ) = 0;
334 virtual int outOfCorePointCount(
void )=0;
335 virtual int polygonCount(
void ) = 0;
340 std::vector<Point3D<float> > oocPoints;
341 std::vector< std::vector< int > > polygons;
347 void resetIterator(
void);
350 int addPolygon(
const std::vector< CoredVertexIndex >& vertices );
353 int nextPolygon( std::vector< CoredVertexIndex >& vertices );
355 int outOfCorePointCount(
void);
356 int polygonCount(
void );
360 std::vector< CoredMeshData2::Vertex > oocPoints;
361 std::vector< std::vector< int > > polygons;
367 void resetIterator(
void);
370 int addPolygon(
const std::vector< CoredVertexIndex >& vertices );
373 int nextPolygon( std::vector< CoredVertexIndex >& vertices );
375 int outOfCorePointCount(
void );
376 int polygonCount(
void );
382 char *_buffer , _fileName[1024];
383 size_t _bufferIndex , _bufferSize;
387 bool write(
const void* data ,
size_t size );
388 bool read (
void* data ,
size_t size );
393 char pointFileName[1024] , polygonFileName[1024];
395 int oocPoints , polygons;
400 void resetIterator(
void );
403 int addPolygon(
const std::vector< CoredVertexIndex >& vertices );
406 int nextPolygon( std::vector< CoredVertexIndex >& vertices );
408 int outOfCorePointCount(
void );
409 int polygonCount(
void );
413 FILE *oocPointFile , *polygonFile;
414 int oocPoints , polygons;
419 void resetIterator(
void );
422 int addPolygon(
const std::vector< CoredVertexIndex >& vertices );
425 int nextPolygon( std::vector< CoredVertexIndex >& vertices );
427 int outOfCorePointCount(
void );
428 int polygonCount(
void );
430 #include "Geometry.inl"
432 #endif // GEOMETRY_INCLUDED