29 #ifndef GEOMETRY_INCLUDED
30 #define GEOMETRY_INCLUDED
41 template<
class Real >
47 template<
class _Real >
Point3D( _Real v0 , _Real v1 , _Real v2 ){
coords[0] = Real(v0) ,
coords[1] = Real(v1) ,
coords[2] = Real(v2); }
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 ); }
64 template<
class Real1 ,
class Real2 >
68 template<
class Real >
72 XForm3x3(
void ) {
for(
int i=0 ; i<3 ; i++ )
for(
int j=0 ; j<3 ; j++ )
coords[i][j] = Real(0.); }
76 xForm(0,0) = xForm(1,1) = xForm(2,2) = Real(1.);
84 for(
int i=0 ; i<3 ; i++ )
for(
int j=0 ; j<3 ; j++ ) q[i] += _Real(
coords[j][i] * p[j] );
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];
96 for(
int i=0 ; i<3 ; i++ )
for(
int j=0 ; j<3 ; j++ ) xForm( i , j ) =
coords[j][i];
101 int i1 = (i+1)%3 , i2 = (i+2)%3;
102 int j1 = (j+1)%3 , j2 = (j+2)%3;
110 for(
int i=0 ; i<3 ; i++ )
for(
int j=0 ; j<3 ;j++ ) xForm.
coords[j][i] =
subDeterminant( i , j ) / d;
115 template<
class Real >
119 XForm4x4(
void ) {
for(
int i=0 ; i<4 ; i++ )
for(
int j=0 ; j<4 ; j++ )
coords[i][j] = Real(0.); }
123 xForm(0,0) = xForm(1,1) = xForm(2,2) = xForm(3,3) = Real(1.);
131 for(
int i=0 ; i<3 ; i++ )
133 for(
int j=0 ; j<3 ; j++ ) q[i] += (_Real)(
coords[j][i] * p[j] );
134 q[i] += (_Real)
coords[3][i];
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];
147 for(
int i=0 ; i<4 ; i++ )
for(
int j=0 ; j<4 ; j++ ) xForm( i , j ) =
coords[j][i];
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] ];
162 for(
int i=0 ; i<4 ; i++ )
for(
int j=0 ; j<4 ;j++ )
188 template <
class Real>
197 d[0]=
p[0][0]-
p[1][0];
198 d[1]=
p[0][1]-
p[1][1];
200 return sqrt(d[0]*d[0]+d[1]*d[1]);
207 double v1[3] , v2[3] , v[3];
208 for(
int d=0 ; d<3 ; d++ )
210 v1[d] =
p[1][d] -
p[0][d];
211 v2[d] =
p[2][d] -
p[0][d];
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;
223 for(j=0;j<3;j++){d+=(
p[(i+1)%3][j]-
p[i][j])*(
p[(i+1)%3][j]-
p[i][j]);}
273 std::vector<TriangulationEdge>
edges;
276 int factor(
int tIndex,
int& p1,
int& p2,
int& p3);
279 double area(
int p1 ,
int p2 ,
int p3 );
300 template<
class Vertex >
309 virtual int addPolygon_s(
const std::vector< CoredVertexIndex >& vertices ) = 0;
313 virtual int nextPolygon( std::vector< CoredVertexIndex >& vertices ) = 0;
319 template<
class Vertex >
322 std::vector< Vertex > oocPoints;
323 std::vector< std::vector< int > > polygons;
346 char *_buffer , _fileName[1024];
347 size_t _bufferIndex , _bufferSize;
351 bool write(
const void* data ,
size_t size );
352 bool read (
void* data ,
size_t size );
355 template<
class Vertex >
358 char pointFileName[1024] , polygonFileName[1024];
360 int oocPoints , polygons;
378 #include "Geometry.inl"
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)
void EdgeCollapse(const Real &edgeRatio, std::vector< TriangleIndex > &triangles, std::vector< Point3D< Real > > &positions, std::vector< Point3D< Real > > *normals)
BufferedReadWriteFile(char *fileName=NULL, int bufferSize=(1<< 20))
bool read(void *data, size_t size)
~BufferedReadWriteFile(void)
bool write(const void *data, size_t size)
int addOutOfCorePoint_s(const Vertex &p)
int addPolygon_s(const std::vector< CoredVertexIndex > &vertices)
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
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
int operator==(const CoredPointIndex &cpi) const
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)
CoredVectorMeshData(void)
int outOfCorePointCount(void)
int addOutOfCorePoint_s(const Vertex &p)
double AspectRatio(void) const
TriangulationTriangle(void)
static long long EdgeIndex(int p1, int p2)
double area(int p1, int p2, int p3)
double area(const Triangle &t)
std::unordered_map< long long, int > edgeMap
std::vector< Point3D< Real > > points
int addTriangle(int p1, int p2, int p3)
int flipMinimize(int eIndex)
std::vector< TriangulationTriangle > triangles
int factor(int tIndex, int &p1, int &p2, int &p3)
std::vector< TriangulationEdge > edges
double Length(void) const
Point3D operator+(Point3D< _Real > p) const
Point3D(const Point3D< _Real > &p)
Point3D operator*(_Real r) const
static Real Dot(const Point3D< Real > &p1, const Point3D< Real > &p2)
Point3D operator-(void) const
Point3D & operator*=(_Real r)
Point3D(_Real v0, _Real v1, _Real v2)
Point3D & operator-=(Point3D< _Real > p)
static Real Dot(const Point3D< Real1 > &p1, const Point3D< Real2 > &p2)
Point3D operator/(_Real r) const
Point3D & operator+=(Point3D< _Real > p)
Point3D & operator/=(_Real r)