36 #ifndef GEOTESSGRID_OBJECT_H
37 #define GEOTESSGRID_OBJECT_H
269 GeoTessGrid* loadGridAscii(
const string& inputFile);
276 static void loadGridAsciiFront(
IFStreamAscii& input,
int& gridFileFormat,
277 string& gridSWVersion,
string& fileCreationDate,
278 string& gridid,
const string& grdInptFile);
283 GeoTessGrid* loadGridBinary(
const string& inputFile);
285 static void loadGridBinaryFront(
IFStreamBinary& ifs,
int& gridFileFormat,
286 string& gridSWVersion,
string& fileCreationDate,
287 string& gridid,
const string& grdInptFile);
321 int** findNeighbors();
327 vertices(NULL), triangles(NULL), levels(NULL), tessellations(NULL),
328 neighbors(NULL), edges(NULL), circumCenters(NULL), gridID(gid),
329 gridInputFile(
"null"), gridOutputFile(
"null"), gridSoftwareVersion(
""),
330 gridGenerationDate(
""), refCount(0), optimization(opttype)
342 vertices(NULL), triangles(NULL), levels(NULL), tessellations(NULL),
343 neighbors(NULL), edges(NULL), circumCenters(NULL), gridID(
""),
344 gridInputFile(
"null"), gridOutputFile(
"null"), gridSoftwareVersion(
""),
353 vertices(NULL), triangles(NULL), levels(NULL), tessellations(NULL),
354 neighbors(NULL), edges(NULL), circumCenters(NULL), gridID(
""),
355 gridInputFile(
"null"), gridOutputFile(
"null"), gridSoftwareVersion(
""),
356 gridGenerationDate(
""), refCount(0), optimization(opttype)
379 static string getGridID(
const string& fileName);
387 static bool isGeoTessGrid(
const string& inputFile);
393 {
return (gridID == g.
gridID); }
399 {
return !(*
this == g); }
411 const string& getGridID()
const
479 const double* getVertex(
int vertex)
const
481 return vertices[vertex];
499 int getVertexIndex(
int tessId,
int level,
int triangle,
int corner)
const
501 return triangles[levels[tessellations[tessId][0] + level][0] + triangle][corner];
515 double* getVertex(
int tessId,
int level,
int triangle,
int corner)
517 return vertices[triangles[levels[tessellations[tessId][0] + level][0] + triangle][corner]];
538 void getVerticesTopLevel(
const int& tessellation, set<const double*>& vectors)
540 getVertices(tessellation, getNLevels(tessellation)-1, vectors);
552 void getVertices(
const int& tessellation,
const int& level, set<const double*>& vectors);
568 const set<int>& getVertexIndices(
const int& level);
582 const set<int>& getVertexIndices(
const int& tessId,
const int& level)
596 const set<int>& getVertexIndicesTopLevel(
const int& tessId)
597 {
return getVertexIndices(tessellations[tessId][1] - 1); }
632 int getNLevels(
int tessellation)
const
633 {
return tessellations[tessellation][1] - tessellations[tessellation][0]; }
644 int getLevel(
int tessellation,
int i)
const
645 {
return tessellations[tessellation][0] + i; }
653 int getLastLevel(
int tessellation)
const
654 {
return tessellations[tessellation][1] - 1; }
670 int getNTriangles(
int tessellation,
int level)
const
672 return levels[tessellations[tessellation][0] + level][1]
673 - levels[tessellations[tessellation][0] + level][0];
686 int getTriangle(
int tessellation,
int level,
int i)
const
687 {
return levels[tessellations[tessellation][0] + level][0] + i; }
698 int getFirstTriangle(
int tessellation,
int level)
const
699 {
return levels[tessellations[tessellation][0] + level][0]; }
710 int getLastTriangle(
int tessellation,
int level)
const
711 {
return levels[tessellations[tessellation][0] + level][1]-1; }
735 const int* getTriangleVertexIndexes(
int triangleIndex)
const
736 {
return triangles[triangleIndex]; }
749 int getTriangleVertexIndex(
int triangleIndex,
int cornerIndex)
const
750 {
return triangles[triangleIndex][cornerIndex]; }
763 const double* getTriangleVertex(
int triangleIndex,
int cornerIndex)
const
764 {
return vertices[triangles[triangleIndex][cornerIndex]]; }
775 void getTriangleVertices(
int triangle,
double** triVrt)
777 int* corners = triangles[triangle];
778 triVrt[0][0] = vertices[corners[0]][0];
779 triVrt[0][1] = vertices[corners[0]][1];
780 triVrt[0][2] = vertices[corners[0]][2];
781 triVrt[1][0] = vertices[corners[1]][0];
782 triVrt[1][1] = vertices[corners[1]][1];
783 triVrt[1][2] = vertices[corners[1]][2];
784 triVrt[2][0] = vertices[corners[2]][0];
785 triVrt[2][1] = vertices[corners[2]][1];
786 triVrt[2][2] = vertices[corners[2]][2];
803 const double* getCircumCenter(
int triangle,
double*
const pA)
const
810 int* corners = triangles[triangle];
811 GeoTessUtils::circumCenter(vertices[corners[0]], vertices[corners[1]],
812 vertices[corners[2]], pA);
819 if (circumCenters == NULL)
821 circumCenters = CPPUtils::new2DArray<double>(nTriangles, 3);
822 CPPUtils::resetArray<double>(nTriangles*3, circumCenters[0], -2.0);
827 if (circumCenters[triangle][0] == -2.0)
829 int* corners = triangles[triangle];
830 GeoTessUtils::circumCenter(vertices[corners[0]], vertices[corners[1]],
831 vertices[corners[2]], circumCenters[triangle]);
833 return circumCenters[triangle];
850 int getNeighbor(
int triangleIndex,
int neighborIndex)
const
851 {
return neighbors[triangleIndex][neighborIndex]; }
866 const int* getNeighbors(
int triangleIndex)
const
867 {
return neighbors[triangleIndex]; }
891 const int* getNeighbors(
const int& tessellation,
const int& level,
const int& triangle)
892 {
return neighbors[getTriangle(tessellation, level, triangle)]; }
918 int getNeighbor(
const int& tessellation,
const int& level,
const int& triangle,
const int& side)
919 {
return neighbors[getTriangle(tessellation, level, triangle)][side]; }
940 int getNeighborIndex(
const int& tid,
const int& nid)
942 if (neighbors[tid][0] == nid)
944 if (neighbors[tid][1] == nid)
946 if (neighbors[tid][2] == nid)
963 int getTriangle(
int triangleIndex,
double* vector);
977 const vector<int>& getVertexTriangles(
const int& tessId,
const int& level,
const int& vertex)
const;
992 const vector<int>& getVertexTriangles(
int tessId,
int vertex)
const
1001 void clearVertexTriangles(
const int& level);
1009 void clearVertexTriangles();
1020 void getVertexNeighborsOrdered(
const int& tessId,
const int& level,
const int& vertex, vector<int>& v);
1033 void getVertexNeighbors(
const int& tessId,
const int& level,
const int& vertex, set<int>& nbrs)
1053 void getVertexNeighbors(
const int& tessId,
const int& level,
const int& vertex,
1054 const int& order, set<int>& nbrs);
1066 vertices(NULL), triangles(NULL), levels(NULL), tessellations(NULL),
1067 neighbors(NULL), edges(NULL), circumCenters(NULL), gridID(
""),
1068 gridInputFile(
"null"), gridOutputFile(
"null"), gridSoftwareVersion(
""),
1069 gridGenerationDate(
""), refCount(0), optimization(opttype)
1070 { loadGridAscii(input); }
1075 GeoTessGrid(IFStreamBinary& input,
const OptimizationType* opttype) :
1076 vertices(NULL), triangles(NULL), levels(NULL), tessellations(NULL),
1077 neighbors(NULL), edges(NULL), circumCenters(NULL), gridID(
""),
1078 gridInputFile(
"null"), gridOutputFile(
"null"), gridSoftwareVersion(
""),
1079 gridGenerationDate(
""), refCount(0), optimization(opttype)
1080 { loadGridBinary(input); }
1085 virtual ~GeoTessGrid();
1090 int getReferenceCount() {
return refCount; }
1095 void addReference() { ++refCount; }
1100 void removeReference()
1102 if (isNotReferenced())
1105 os << endl <<
"ERROR in GeoTessGrid::removeReference" << endl
1106 <<
"Reference count (" << refCount <<
") is already zero." << endl;
1107 throw GeoTessException(os, __FILE__, __LINE__, 2001);
1116 bool isNotReferenced() {
return (refCount == 0); }
1123 void writeGrid(
const string& fileName);
1128 void writeGridAscii(
const string& fileName);
1133 void writeGridAscii(IFStreamAscii& output);
1138 void writeGridBinary(
const string& fileName);
1143 void writeGridBinary(IFStreamBinary& output);
1162 double const*
const*
const* getEdges()
const {
return edges; }
1184 void getEdgeList(
const int& tessId,
const int& level,
const int& vertex, ArrayReuse<int>& store,
1186 {
return getEdgeList(tessId, level, vertex, -1, store, e); }
1191 void getEdgeList(
const int& tessId,
const int& level,
const int& vertex,
const int& firstNeighborVertex,
1192 ArrayReuse<int>& store, list<int*>& e)
const;
1199 bool isSupportedFormatVersion(
int frmtVrsn)
1200 {
return (frmtVrsn == 2); }
1217 #endif // GEOTESSGRID_OBJECT_H