7 #define ACG_POISSONRECONSTRUCTIONT_C
11 #include "PoissonReconstructionT.hh"
20 void DumpOutput(
const char* format , ... )
23 va_start( args , format );
24 vprintf( format , args );
28 template <
class MeshT>
30 PoissonReconstructionT<MeshT>::
31 run( std::vector< Real >& _pt_data, MeshT& _mesh,
const Parameter& _parameter )
34 m_parameter = _parameter;
40 tree.threads = omp_get_num_procs();
44 TreeOctNode::SetAllocator( MEMORY_ALLOCATOR_BLOCK_SIZE );
46 std::cerr <<
"Tree construction with depth " << m_parameter.Depth << std::endl;
47 tree.setBSplineData( m_parameter.Depth );
48 double maxMemoryUsage;
49 tree.maxMemoryUsage=0;
51 int pointCount = tree.setTreeMemory( _pt_data , m_parameter.Depth , m_parameter.MinDepth , m_parameter.Depth , Real(m_parameter.SamplesPerNode),
52 m_parameter.Scale , m_parameter.Confidence , m_parameter.PointWeight , m_parameter.AdaptiveExponent , xForm );
56 std::cerr <<
"Invalid Input Points" << std::endl;
60 std::cerr <<
"Tree Clipping" << std::endl;
64 std::cerr <<
"Tree Finalize" << std::endl;
65 tree.finalize( m_parameter.IsoDivide );
67 DumpOutput(
"Input Points: %d\n" , pointCount );
68 DumpOutput(
"Leaves/Nodes: %d/%d\n" , tree.tree.leaves() , tree.tree.nodes() );
69 DumpOutput(
"Memory Usage: %.3f MB\n" ,
float( MemoryInfo::Usage() )/(1<<20) );
71 maxMemoryUsage = tree.maxMemoryUsage;
72 tree.maxMemoryUsage=0;
73 tree.SetLaplacianConstraints();
74 DumpOutput(
"Memory Usage: %.3f MB\n" ,
float( MemoryInfo::Usage())/(1<<20) );
75 maxMemoryUsage = std::max< double >( maxMemoryUsage , tree.maxMemoryUsage );
77 tree.maxMemoryUsage=0;
78 tree.LaplacianMatrixIteration( m_parameter.SolverDivide, m_parameter.ShowResidual, m_parameter.MinIters, m_parameter.SolverAccuracy, m_parameter.Depth, m_parameter.FixedIters );
79 DumpOutput(
"Memory Usage: %.3f MB\n" ,
float( MemoryInfo::Usage() )/(1<<20) );
80 maxMemoryUsage = std::max< double >( maxMemoryUsage , tree.maxMemoryUsage );
83 if( m_parameter.Verbose ) tree.maxMemoryUsage=0;
85 isoValue = tree.GetIsoValue();
86 DumpOutput(
"Got average in: %f\n" , Time()-time );
87 DumpOutput(
"Iso-Value: %e\n" , isoValue );
89 tree.maxMemoryUsage = 0;
90 tree.GetMCIsoTriangles( isoValue , m_parameter.IsoDivide , &mesh );
95 DumpOutput(
"Time for Iso: %f\n" , Time()-time );
108 int nr_faces=mesh.polygonCount();
110 mesh.resetIterator();
118 for(
int i=0 ; i < int( mesh.inCorePoints.size() ) ; i++ )
120 p = mesh.inCorePoints[i];
121 _mesh.add_vertex(
typename MeshT::Point(p[0],p[1],p[2]) );
123 for(
int i=0; i<mesh.outOfCorePointCount() ; i++ )
125 mesh.nextOutOfCorePoint(p);
126 _mesh.add_vertex(
typename MeshT::Point(p[0],p[1],p[2]) );
131 std::vector< CoredVertexIndex > polygon;
132 for(
int i=0 ; i<nr_faces ; i++ )
137 mesh.nextPolygon( polygon );
138 std::vector< typename MeshT::VertexHandle > face;
139 for(
int i=0 ; i<int( polygon.size() ) ; i++ )
140 if( polygon[i].inCore ) face.push_back( _mesh.vertex_handle( polygon[i].idx ) );
141 else face.push_back( _mesh.vertex_handle( polygon[i].idx +
int( mesh.inCorePoints.size() ) ) );
143 _mesh.add_face( face );
147 _mesh.update_normals();
Namespace providing different geometric functions concerning angles.