36 #ifndef GEOTESSGRID_OBJECT_H
37 #define GEOTESSGRID_OBJECT_H
250 vertices(NULL), nVertices(0),
251 triangles(NULL), nTriangles(0),
252 levels(NULL), nLevels(0),
253 tessellations(NULL), nTessellations(0),
254 descendants(NULL), gridID(gid),
255 gridInputFile(
"null"), gridOutputFile(
"null"), gridSoftwareVersion(
""),
256 gridGenerationDate(
""), refCount(0)
288 vector<vector<Edge*> > edgeList;
302 mutable vector<vector<Edge*> > spokeList;
310 mutable vector<double*> circumCenters;
325 string gridInputFile;
330 string gridOutputFile;
335 string gridSoftwareVersion;
341 string gridGenerationDate;
352 vector< vector< vector<int> > > vtxTriangles;
359 mutable vector< set<int> > connectedVertices;
364 GeoTessGrid* loadGridAscii(
const string& inputFile);
375 GeoTessGrid* loadGridBinary(
const string& inputFile);
382 static void loadGridAsciiFront(
IFStreamAscii& input,
int& gridFileFormat,
383 string& gridSWVersion,
string& fileCreationDate,
384 string& gridid,
const string& grdInptFile);
386 static void loadGridBinaryFront(
IFStreamBinary& ifs,
int& gridFileFormat,
387 string& gridSWVersion,
string& fileCreationDate,
388 string& gridid,
const string& grdInptFile);
404 const set<int>& getVertexIndices(
const int& level);
406 void computeSpokeLists(
const int& level)
const;
416 vertices(NULL), nVertices(0),
417 triangles(NULL), nTriangles(0),
418 levels(NULL), nLevels(0),
419 tessellations(NULL), nTessellations(0),
420 descendants(NULL), gridID(
""),
421 gridInputFile(
"null"), gridOutputFile(
"null"), gridSoftwareVersion(
""),
422 gridGenerationDate(
""), refCount(0)
430 vertices(NULL), nVertices(0),
431 triangles(NULL), nTriangles(0),
432 levels(NULL), nLevels(0),
433 tessellations(NULL), nTessellations(0),
434 descendants(NULL), gridID(
""),
435 gridInputFile(
"null"), gridOutputFile(
"null"), gridSoftwareVersion(
""),
436 gridGenerationDate(
""), refCount(0)
465 static string getGridID(
const string& fileName);
473 static bool isGeoTessGrid(
const string& inputFile);
481 {
return (gridID == g.gridID); }
489 {
return !(*
this == g); }
575 return vertices[vertex];
588 int* t = triangles[getTriangle(getFirstTriangle(tessId, 0), unit_vector)];
591 double dot = GeoTessUtils::dot(unit_vector, vertices[t[0]]);
593 double doti = GeoTessUtils::dot(unit_vector, vertices[t[1]]);
600 doti = GeoTessUtils::dot(unit_vector, vertices[t[2]]);
619 {
return triangles[triangle][corner]; }
638 return triangles[levels[tessellations[tessId][0] + level][0] + triangle][corner];
649 for (
int i=nTessellations-1; i>=0; --i)
651 int vid = getVertexIndex(u, i);
668 int* t = triangles[getTriangle(getFirstTriangle(tessId, 0), u)];
670 if (GeoTessUtils::dot(u, vertices[t[0]]) > cos(1e-7))
672 if (GeoTessUtils::dot(u, vertices[t[1]]) > cos(1e-7))
674 if (GeoTessUtils::dot(u, vertices[t[2]]) > cos(1e-7))
690 double*
getVertex(
int tessId,
int level,
int triangle,
int corner)
692 return vertices[triangles[levels[tessellations[tessId][0] + level][0] + triangle][corner]];
716 getVertices(tessellation, getNLevels(tessellation)-1, vectors);
728 void getVertices(
const int& tessellation,
const int& level, set<const double*>& vectors);
743 {
return getVertexIndices(getLevel(tessId, level)); }
757 {
return getVertexIndices(tessellations[tessId][1] - 1); }
779 {
return tessellations[tessellation][1] - tessellations[tessellation][0]; }
790 {
return tessellations[tessellation][0] + i; }
808 {
return tessellations[tessellation][1] - 1; }
825 {
return tessellations[tessellation][1] - tessellations[tessellation][0] - 1; }
838 return levels[tessellations[tessellation][0] + level][1]
839 - levels[tessellations[tessellation][0] + level][0];
854 {
return levels[tessellations[tessellation][0] + level][0] + i; }
866 {
return levels[tessellations[tessellation][0] + level][0]; }
878 {
return levels[tessellations[tessellation][0] + level][1]-1; }
903 {
return triangles[triangleIndex]; }
917 {
return triangles[triangleIndex][cornerIndex]; }
931 {
return vertices[triangles[triangleIndex][cornerIndex]]; }
944 int* corners = triangles[triangle];
945 triVrt[0][0] = vertices[corners[0]][0];
946 triVrt[0][1] = vertices[corners[0]][1];
947 triVrt[0][2] = vertices[corners[0]][2];
948 triVrt[1][0] = vertices[corners[1]][0];
949 triVrt[1][1] = vertices[corners[1]][1];
950 triVrt[1][2] = vertices[corners[1]][2];
951 triVrt[2][0] = vertices[corners[2]][0];
952 triVrt[2][1] = vertices[corners[2]][1];
953 triVrt[2][2] = vertices[corners[2]][2];
962 if (circumCenters.empty()) circumCenters.resize(nTriangles, NULL);
964 for (
int triangle=0; triangle<nTriangles; ++triangle)
965 if (circumCenters[triangle] == NULL)
967 int* corners = triangles[triangle];
968 circumCenters[triangle] = GeoTessUtils::circumCenterPlus(vertices[corners[0]],
969 vertices[corners[1]], vertices[corners[2]]);
979 if (circumCenters.empty()) circumCenters.resize(nTriangles);
981 if (circumCenters[levels[level][0]] == NULL)
983 for (
int triangle=levels[level][0]; triangle<levels[level][1]; ++triangle)
985 int* corners = triangles[triangle];
986 circumCenters[triangle] = GeoTessUtils::circumCenterPlus(vertices[corners[0]],
987 vertices[corners[1]], vertices[corners[2]]);
1007 const double*
getCircumCenter(
const int& triangle)
const {
return circumCenters[triangle]; }
1027 { cc[0]=circumCenters[triangle][0]; cc[1]=circumCenters[triangle][1]; cc[2]=circumCenters[triangle][2]; }
1043 int getNeighbor(
const int& triangleIndex,
const int& neighborIndex)
const
1044 {
return neighborIndex == 3 ? descendants[triangleIndex] : edgeList[triangleIndex][neighborIndex]->tLeft; }
1070 int getNeighbor(
const int& tessellation,
const int& level,
const int& triangle,
const int& side)
1071 {
return getNeighbor(getTriangle(tessellation, level, triangle), side); }
1090 vector<Edge*> edges = edgeList[triangleIndex];
1091 neighbors.push_back(edges[0]->tLeft);
1092 neighbors.push_back(edges[1]->tLeft);
1093 neighbors.push_back(edges[2]->tLeft);
1094 neighbors.push_back(descendants[triangleIndex]);
1119 void getNeighbors(
const int& tessellation,
const int& level,
const int& triangle, vector<int>& neighbors)
1120 { getNeighbors(getTriangle(tessellation, level, triangle), neighbors); }
1137 if (edgeList[tid][0]->tLeft == nid)
1139 if (edgeList[tid][1]->tLeft == nid)
1141 if (edgeList[tid][2]->tLeft == nid)
1150 int getDescendant(
const int& tessId,
const int& level,
const int& triangle)
const
1151 {
return descendants[getTriangle(tessId, level, triangle)]; }
1165 int getTriangle(
int triangleIndex,
const double* vector);
1189 {
return vtxTriangles[tessellations[tessId][0] + level][vertex]; }
1205 {
return getVertexTriangles(tessId, getNLevels(tessId)-1, vertex); }
1224 void getVertexNeighborsOrdered(
const int& tessId,
const int& level,
const int& vertex, vector<int>& v);
1238 { getVertexNeighbors(tessId, level, vertex, 1, nbrs); }
1257 void getVertexNeighbors(
const int& tessId,
const int& level,
const int& vertex,
1258 const int& order, set<int>& nbrs);
1270 vertices(NULL), triangles(NULL), levels(NULL), tessellations(NULL),
1271 descendants(NULL), gridID(
""),
1272 gridInputFile(
"null"), gridOutputFile(
"null"), gridSoftwareVersion(
""),
1273 gridGenerationDate(
""), refCount(0)
1274 { loadGridAscii(input); }
1279 GeoTessGrid(IFStreamBinary& input,
const GeoTessOptimizationType* opttype) :
1280 vertices(NULL), triangles(NULL), levels(NULL), tessellations(NULL),
1281 descendants(NULL), gridID(
""),
1282 gridInputFile(
"null"), gridOutputFile(
"null"), gridSoftwareVersion(
""),
1283 gridGenerationDate(
""), refCount(0)
1284 { loadGridBinary(input); }
1289 GeoTessGrid(
double** _vertices,
int& _nVertices,
1290 int** _triangles,
int& _nTriangles,
1291 int** _levels,
int& _nLevels,
1292 int** _tessellations,
int& _nTessellations,
1294 string& _gridInputFile,
1295 string& _gridOutputFile,
1296 string& _gridSoftwareVersion,
1297 string& _gridGenerationDate,
1298 const GeoTessOptimizationType* _opttype) :
1299 vertices(_vertices), nVertices(_nVertices),
1300 triangles(_triangles), nTriangles(_nTriangles),
1301 levels(_levels), nLevels(_nLevels),
1302 tessellations(_tessellations), nTessellations(_nTessellations),
1305 gridInputFile(_gridInputFile),
1306 gridOutputFile(_gridOutputFile),
1307 gridSoftwareVersion(_gridSoftwareVersion),
1308 gridGenerationDate(_gridGenerationDate),
1315 virtual ~GeoTessGrid();
1320 int getReferenceCount() {
return refCount; }
1325 void addReference() { ++refCount; }
1330 void removeReference()
1332 if (isNotReferenced())
1335 os << endl <<
"ERROR in GeoTessGrid::removeReference" << endl
1336 <<
"Reference count (" << refCount <<
") is already zero." << endl;
1337 throw GeoTessException(os, __FILE__, __LINE__, 2001);
1346 bool isNotReferenced() {
return (refCount == 0); }
1353 void writeGrid(
const string& fileName);
1358 void writeGridAscii(
const string& fileName);
1363 void writeGridAscii(IFStreamAscii& output);
1368 void writeGridBinary(
const string& fileName);
1373 void writeGridBinary(IFStreamBinary& output);
1380 bool isSupportedFormatVersion(
int frmtVrsn)
1381 {
return (frmtVrsn == 2); }
1441 { computeSpokeLists(level);
return spokeList[level]; }
1443 const vector<vector<Edge*> >&
getEdgeList()
const {
return edgeList; }
1445 const vector<Edge*>&
getEdgeList(
const int& triangle)
const {
return edgeList[triangle]; }
1455 vector<double*> corners;
1456 corners.push_back(vertices[triangles[triangle][0]]);
1457 corners.push_back(vertices[triangles[triangle][1]]);
1458 corners.push_back(vertices[triangles[triangle][2]]);
1459 GeoTessUtils::center(corners, center);
1474 #endif // GEOTESSGRID_OBJECT_H
const string & getGridID() const
Definition: GeoTessGrid.h:501
void getVertexNeighbors(const int &tessId, const int &level, const int &vertex, set< int > &nbrs)
Definition: GeoTessGrid.h:1237
void getCircumCenter(const int &triangle, double *cc) const
Definition: GeoTessGrid.h:1026
int getNLevels(int tessellation) const
Definition: GeoTessGrid.h:778
int tLeft
Definition: GeoTessGrid.h:115
const string & getGridGenerationDate() const
Definition: GeoTessGrid.h:542
int getLevel(int tessellation, int i) const
Definition: GeoTessGrid.h:789
const vector< Edge * > & getEdgeList(const int &triangle) const
Definition: GeoTessGrid.h:1445
const double * getVertex(int vertex) const
Definition: GeoTessGrid.h:573
vector< Edge * > & getSpokeList(const int &level) const
Definition: GeoTessGrid.h:1440
int getVertexIndex(const double *u)
Definition: GeoTessGrid.h:647
double ** vertices
Definition: GeoTessGrid.h:174
int const * getDescendants() const
Definition: GeoTessGrid.h:1146
int ** triangles
Definition: GeoTessGrid.h:186
Opens a file for binary read and write access.
Definition: IFStreamBinary.h:79
GeoTessGrid()
Definition: GeoTessGrid.h:415
GeoTessGrid(const GeoTessOptimizationType *opttype)
Definition: GeoTessGrid.h:429
int vj
Definition: GeoTessGrid.h:103
int vk
Definition: GeoTessGrid.h:108
const vector< int > & getVertexTriangles(int tessId, int vertex) const
Definition: GeoTessGrid.h:1204
const string & getGridInputFile() const
Definition: GeoTessGrid.h:557
Manages the geometry and topology of one or more multi-level triangular tessellations of a unit spher...
Definition: GeoTessGrid.h:163
const vector< int > & getVertexTriangles(const int &tessId, const int &level, const int &vertex) const
Definition: GeoTessGrid.h:1188
GeoTessGrid(const string &gid, const GeoTessOptimizationType *opttype)
Definition: GeoTessGrid.h:249
int getNVertices() const
Definition: GeoTessGrid.h:763
const vector< vector< int > > & getVertexTriangles(const int &level) const
Definition: GeoTessGrid.h:1174
int getNeighbor(const int &triangleIndex, const int &neighborIndex) const
Definition: GeoTessGrid.h:1043
void getVerticesTopLevel(const int &tessellation, set< const double * > &vectors)
Definition: GeoTessGrid.h:714
int getFirstTriangle(int tessellation, int level) const
Definition: GeoTessGrid.h:865
int ** tessellations
Definition: GeoTessGrid.h:224
void setGridGenerationDate(const string &gridDate)
Definition: GeoTessGrid.h:534
int getNeighbor(const int &tessellation, const int &level, const int &triangle, const int &side)
Definition: GeoTessGrid.h:1070
double const *const * getVertices() const
Definition: GeoTessGrid.h:704
const string & getGridOutputFile() const
Definition: GeoTessGrid.h:566
void setGridSoftwareVersion(const string &swVersion)
Definition: GeoTessGrid.h:518
int getNTessellations() const
Definition: GeoTessGrid.h:769
int nLevels
Definition: GeoTessGrid.h:209
int getVertexIndex(const double *u, int tessId)
Definition: GeoTessGrid.h:666
int const *const * getTessellations() const
Definition: GeoTessGrid.h:1429
Enumeration of the optimization strategies supported by GeoTess including OptimizationType::SPEED and...
Definition: GeoTessOptimizationType.h:66
int getVertexIndex(int triangle, int corner) const
Definition: GeoTessGrid.h:618
int nTessellations
Definition: GeoTessGrid.h:229
void setGridInputFile(const string &gridFile)
Definition: GeoTessGrid.h:548
Opens ascii file for read and write access.
Definition: IFStreamAscii.h:80
const vector< vector< Edge * > > & getEdgeList() const
Definition: GeoTessGrid.h:1443
const double * getCircumCenter(const int &triangle) const
Definition: GeoTessGrid.h:1007
int getLastTriangle(int tessellation, int level) const
Definition: GeoTessGrid.h:877
int getVertexIndex(int tessId, int level, int triangle, int corner) const
Definition: GeoTessGrid.h:636
const int * getTriangleVertexIndexes(int triangleIndex) const
Definition: GeoTessGrid.h:902
int nTriangles
Definition: GeoTessGrid.h:191
int cornerj
Definition: GeoTessGrid.h:110
int const *const * getTriangles() const
Definition: GeoTessGrid.h:889
int const *const * getLevels() const
Definition: GeoTessGrid.h:1413
int getLastLevel(int tessellation) const
Definition: GeoTessGrid.h:807
int getTriangleVertexIndex(int triangleIndex, int cornerIndex) const
Definition: GeoTessGrid.h:916
int nVertices
Definition: GeoTessGrid.h:179
Definition: GeoTessGrid.h:98
int getTriangle(int tessellation, int level, int i) const
Definition: GeoTessGrid.h:853
int ** levels
Definition: GeoTessGrid.h:204
int getNLevels() const
Definition: GeoTessGrid.h:1400
int getNeighborIndex(const int &tid, const int &nid)
Definition: GeoTessGrid.h:1135
Edge * next
Definition: GeoTessGrid.h:131
const set< int > & getVertexIndicesTopLevel(const int &tessId)
Definition: GeoTessGrid.h:756
const string & getGridSoftwareVersion() const
Definition: GeoTessGrid.h:526
int tRight
Definition: GeoTessGrid.h:120
void getCenter(const int &triangle, double *center)
Definition: GeoTessGrid.h:1453
void getTriangleVertices(int triangle, double **triVrt)
Definition: GeoTessGrid.h:942
void getNeighbors(const int &tessellation, const int &level, const int &triangle, vector< int > &neighbors)
Definition: GeoTessGrid.h:1119
#define GEOTESS_EXP_IMP
Definition: CPPGlobals.h:71
const set< int > & getVertexIndices(const int &tessId, const int &level)
Definition: GeoTessGrid.h:742
const double * getTriangleVertex(int triangleIndex, int cornerIndex) const
Definition: GeoTessGrid.h:930
int getNTriangles() const
Definition: GeoTessGrid.h:1438
double * getVertex(int tessId, int level, int triangle, int corner)
Definition: GeoTessGrid.h:690
int getDescendant(const int &tessId, const int &level, const int &triangle) const
Definition: GeoTessGrid.h:1150
const void computeCircumCenters(const int &level)
Definition: GeoTessGrid.h:977
int getTopLevel(int tessellation) const
Definition: GeoTessGrid.h:824
int findClosestVertex(double *unit_vector, int tessId)
Definition: GeoTessGrid.h:586
void getNeighbors(int triangleIndex, vector< int > &neighbors)
Definition: GeoTessGrid.h:1087
const GeoTessOptimizationType & getOptimizationType() const
Definition: GeoTessGrid.h:510
int getDescendant(const int &triangle) const
Definition: GeoTessGrid.h:1148
int getNTriangles(int tessellation, int level) const
Definition: GeoTessGrid.h:836
const void computeCircumCenters()
Definition: GeoTessGrid.h:960