25 #if GEOM_PSEUDO3D==GEOM_TRUE
26 namespace GEOM_FADE25D {
27 #elif GEOM_PSEUDO3D==GEOM_FALSE
28 namespace GEOM_FADE2D {
30 #error GEOM_PSEUDO3D is not defined
45 numCustomIndices(0),numTriangles(0),numPoints(0),
46 aCoords(NULL),aCustomIndices(NULL),aTriangles(NULL)
48 #if GEOM_PSEUDO3D==GEOM_TRUE
79 size_t siz(3*numTriangles);
80 aTriangles=
new int[siz];
85 size_t siz(dim*numPoints);
86 aCoords=
new double[siz];
91 aCustomIndices=
new int[numCustomIndices];
102 if(aCoords!=NULL)
delete [] aCoords;
103 if(aCustomIndices!=NULL)
delete [] aCustomIndices;
104 if(aTriangles!=NULL)
delete [] aTriangles;
126 bool writeObj(
const char* filename)
const;
129 void extractTriangleNeighborships(std::vector<std::pair<int,int> >& vNeigs)
const;
136 void getCornerIndices(
int triIdx,
int& vtxIdx0,
int& vtxIdx1,
int& vtxIdx2)
const;
144 int getCustomIndex(
int vtxIdx)
const;
146 #if GEOM_PSEUDO3D==GEOM_TRUE
148 void getNormal(
int triIdx,
double& x,
double& y,
double& z)
const;
151 #if GEOM_PSEUDO3D==GEOM_TRUE
157 void getCoordinates(
int vtxIdx,
double& x,
double& y,
double& z)
const;
164 void getCoordinates(
int vtxIdx,
double& x,
double& y)
const;
166 bool operator==(
const FadeExport& other)
const;
177 inline FadeExport::~FadeExport()
179 if(aCoords!=NULL)
delete [] aCoords;
180 if(aCustomIndices!=NULL)
delete [] aCustomIndices;
181 if(aTriangles!=NULL)
delete [] aTriangles;
187 inline bool FadeExport::operator==(
const FadeExport& other)
const
189 if(numTriangles != other.numTriangles)
return false;
190 if(numPoints != other.numPoints)
return false;
192 for(
int vtxIdx=0;vtxIdx<numPoints;++vtxIdx)
194 for(
int component=0;component<dim;++component)
196 size_t addr(dim*vtxIdx+component);
197 if(aCoords[addr]!=other.aCoords[addr])
return false;
201 for(
int triIdx=0;triIdx<numTriangles;++triIdx)
204 getCornerIndices(
int(triIdx),v0,v1,v2);
206 other.getCornerIndices(
int(triIdx),va,vb,vc);
207 if(v0!=va || v1!=vb || v2!=vc)
return false;
214 inline void FadeExport::getCornerIndices(
int triIdx,
int& vtxIdx0,
int& vtxIdx1,
int& vtxIdx2)
const
217 vtxIdx0=aTriangles[base];
218 vtxIdx1=aTriangles[base+1];
219 vtxIdx2=aTriangles[base+2];
223 inline void FadeExport::print()
const
225 for(
int vtxIdx=0;vtxIdx<numPoints;++vtxIdx)
228 if(numCustomIndices>0) customIndex=aCustomIndices[vtxIdx];
229 std::cout<<
"\nVertex "<<vtxIdx<<
" (customIndex="<<customIndex<<
"):";
230 for(
int component=0;component<dim;++component) std::cout<<
" "<<aCoords[dim*vtxIdx+component];
233 for(
int triIdx=0;triIdx<numTriangles;++triIdx)
236 getCornerIndices(
int(triIdx),v0,v1,v2);
237 std::cout<<
"\nTriangle "<<triIdx<<
": "<<v0<<
" "<<v1<<
" "<<v2;
240 std::vector<std::pair<int,int> > vNeighbors;
241 this->extractTriangleNeighborships(vNeighbors);
242 for(
size_t i=0;i<vNeighbors.size();++i)
244 std::cout<<
"\nTriangle "<<vNeighbors[i].first<<
" <-> Triangle "<<vNeighbors[i].second;
246 std::cout<<std::endl;
250 inline bool FadeExport::writeObj(
const char* filename)
const
252 std::ofstream outFile(filename);
253 if(!outFile.is_open())
255 std::cout<<
"Can't write "<<filename<<std::endl;
258 std::cout<<
"writing "<<filename<<std::endl;
260 outFile<<
"# Written by Fade2D";
261 for(
int vtxIdx=0;vtxIdx<numPoints;++vtxIdx)
264 for(
int component=0;component<dim;++component) outFile<<
" "<<aCoords[dim*vtxIdx+component];
265 if(dim==2) outFile<<
" 0";
267 for(
int triIdx=0;triIdx<numTriangles;++triIdx)
270 for(
int corner=0;corner<3;++corner)
272 outFile<<
" "<<aTriangles[3*triIdx+corner]+1;
281 inline void FadeExport::extractTriangleNeighborships(std::vector<std::pair<int,int> >& vNeigs)
const
283 vNeigs.reserve(numTriangles*3/2);
284 std::vector<std::pair<std::pair<int,int>,
int> > vVtxPair2Tri;
285 vVtxPair2Tri.reserve(numTriangles*3);
287 for(
int tri=0;tri<numTriangles;++tri)
289 size_t vtxIdx(3*tri);
290 int vtx0(aTriangles[vtxIdx]);
291 int vtx1(aTriangles[vtxIdx+1]);
292 int vtx2(aTriangles[vtxIdx+2]);
293 if(vtx0>vtx1) std::swap(vtx0,vtx1);
296 std::swap(vtx1,vtx2);
297 if(vtx0>vtx1) std::swap(vtx0,vtx1);
299 vVtxPair2Tri.push_back(std::make_pair(std::make_pair(vtx0,vtx1),tri));
300 vVtxPair2Tri.push_back(std::make_pair(std::make_pair(vtx1,vtx2),tri));
301 vVtxPair2Tri.push_back(std::make_pair(std::make_pair(vtx0,vtx2),tri));
303 std::sort(vVtxPair2Tri.begin(),vVtxPair2Tri.end());
304 for(
size_t i=0;i<vVtxPair2Tri.size();++i)
306 int vtx0(vVtxPair2Tri[i].first.first);
307 int vtx1(vVtxPair2Tri[i].first.second);
309 if( ++i<vVtxPair2Tri.size() &&
310 vVtxPair2Tri[i].first.first==vtx0 &&
311 vVtxPair2Tri[i].first.second==vtx1)
313 int tri(vVtxPair2Tri[i].second);
314 vNeigs.push_back(std::pair<int,int>(tri,vVtxPair2Tri[i].second));
321 #if GEOM_PSEUDO3D==GEOM_TRUE
322 inline void FadeExport::getCoordinates(
int vtxIdx,
double& x,
double& y,
double& z)
const
324 int base(dim*vtxIdx);
330 inline void FadeExport::getCoordinates(
int vtxIdx,
double& x,
double& y)
const
332 int base(dim*vtxIdx);
338 inline int FadeExport::getCustomIndex(
int vtxIdx)
const
340 if(vtxIdx<numCustomIndices)
342 return aCustomIndices[vtxIdx];
FadeExport is a simple struct to export triangulation data.
Definition: FadeExport.h:43
void reset()
Reset the object.
Definition: FadeExport.h:100
void lexiSort()
Sort the points lexicographically.
double * aCoords
Cartesian coordinates (dim*numPoints)
Definition: FadeExport.h:171
int * aCustomIndices
Custom indices of the points (only when exported)
Definition: FadeExport.h:172
int numTriangles
number of triangles
Definition: FadeExport.h:169
int * aTriangles
3 counterclockwise oriented vertex-indices per triangle (3*numTriangles)
Definition: FadeExport.h:173
int dim
Dimension.
Definition: FadeExport.h:174
int numCustomIndices
number of custom indices (same as numPoints when exported, otherwise 0)
Definition: FadeExport.h:168
int numPoints
number of points
Definition: FadeExport.h:170