added two missing std at a swap()
This commit is contained in:
parent
eeaabe684c
commit
fd08c3eaf8
|
@ -50,9 +50,9 @@ struct SamplingFlags{
|
||||||
NO_SAMPLING = 0x0070,
|
NO_SAMPLING = 0x0070,
|
||||||
SAVE_ERROR = 0x0100,
|
SAVE_ERROR = 0x0100,
|
||||||
INCLUDE_UNREFERENCED_VERTICES = 0x0200,
|
INCLUDE_UNREFERENCED_VERTICES = 0x0200,
|
||||||
USE_STATIC_GRID = 0x0400,
|
USE_STATIC_GRID = 0x0400,
|
||||||
USE_HASH_GRID = 0x0800,
|
USE_HASH_GRID = 0x0800,
|
||||||
USE_AABB_TREE = 0x1000,
|
USE_AABB_TREE = 0x1000,
|
||||||
USE_OCTREE = 0x2000
|
USE_OCTREE = 0x2000
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -63,21 +63,21 @@ class Sampling
|
||||||
public:
|
public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef typename MetroMesh::CoordType CoordType;
|
typedef typename MetroMesh::CoordType CoordType;
|
||||||
typedef typename MetroMesh::ScalarType ScalarType;
|
typedef typename MetroMesh::ScalarType ScalarType;
|
||||||
typedef typename MetroMesh::VertexType VertexType;
|
typedef typename MetroMesh::VertexType VertexType;
|
||||||
typedef typename MetroMesh::VertexPointer VertexPointer;
|
typedef typename MetroMesh::VertexPointer VertexPointer;
|
||||||
typedef typename MetroMesh::VertexIterator VertexIterator;
|
typedef typename MetroMesh::VertexIterator VertexIterator;
|
||||||
typedef typename MetroMesh::FaceIterator FaceIterator;
|
typedef typename MetroMesh::FaceIterator FaceIterator;
|
||||||
typedef typename MetroMesh::FaceType FaceType;
|
typedef typename MetroMesh::FaceType FaceType;
|
||||||
typedef typename MetroMesh::FaceContainer FaceContainer;
|
typedef typename MetroMesh::FaceContainer FaceContainer;
|
||||||
|
|
||||||
typedef GridStaticPtr <FaceType, typename MetroMesh::ScalarType > MetroMeshGrid;
|
typedef GridStaticPtr <FaceType, typename MetroMesh::ScalarType > MetroMeshGrid;
|
||||||
typedef SpatialHashTable <FaceType, typename MetroMesh::ScalarType > MetroMeshHash;
|
typedef SpatialHashTable <FaceType, typename MetroMesh::ScalarType > MetroMeshHash;
|
||||||
typedef AABBBinaryTreeIndex <FaceType, typename MetroMesh::ScalarType, vcg::EmptyClass> MetroMeshAABB;
|
typedef AABBBinaryTreeIndex <FaceType, typename MetroMesh::ScalarType, vcg::EmptyClass> MetroMeshAABB;
|
||||||
typedef Octree <FaceType, typename MetroMesh::ScalarType > MetroMeshOctree;
|
typedef Octree <FaceType, typename MetroMesh::ScalarType > MetroMeshOctree;
|
||||||
|
|
||||||
typedef Point3<typename MetroMesh::ScalarType> Point3x;
|
typedef Point3<typename MetroMesh::ScalarType> Point3x;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ private:
|
||||||
MetroMeshGrid gS2;
|
MetroMeshGrid gS2;
|
||||||
MetroMeshHash hS2;
|
MetroMeshHash hS2;
|
||||||
MetroMeshAABB tS2;
|
MetroMeshAABB tS2;
|
||||||
MetroMeshOctree oS2;
|
MetroMeshOctree oS2;
|
||||||
|
|
||||||
|
|
||||||
unsigned int n_samples_per_face ;
|
unsigned int n_samples_per_face ;
|
||||||
|
@ -99,11 +99,11 @@ private:
|
||||||
int n_hist_bins ;
|
int n_hist_bins ;
|
||||||
int print_every_n_elements ;
|
int print_every_n_elements ;
|
||||||
int referredBit ;
|
int referredBit ;
|
||||||
// parameters
|
// parameters
|
||||||
double dist_upper_bound;
|
double dist_upper_bound;
|
||||||
double n_samples_per_area_unit;
|
double n_samples_per_area_unit;
|
||||||
unsigned long n_samples_target;
|
unsigned long n_samples_target;
|
||||||
int Flags;
|
int Flags;
|
||||||
|
|
||||||
// results
|
// results
|
||||||
Histogram<double> hist;
|
Histogram<double> hist;
|
||||||
|
@ -136,7 +136,7 @@ private:
|
||||||
public :
|
public :
|
||||||
// public methods
|
// public methods
|
||||||
Sampling(MetroMesh &_s1, MetroMesh &_s2);
|
Sampling(MetroMesh &_s1, MetroMesh &_s2);
|
||||||
~Sampling();
|
~Sampling();
|
||||||
void Hausdorff();
|
void Hausdorff();
|
||||||
double GetArea() {return area_S1;}
|
double GetArea() {return area_S1;}
|
||||||
double GetDistMax() {return max_dist;}
|
double GetDistMax() {return max_dist;}
|
||||||
|
@ -165,14 +165,14 @@ Sampling<MetroMesh>::Sampling(MetroMesh &_s1, MetroMesh &_s2):S1(_s1),S2(_s2)
|
||||||
{
|
{
|
||||||
Flags = 0;
|
Flags = 0;
|
||||||
area_S1 = ComputeMeshArea(_s1);
|
area_S1 = ComputeMeshArea(_s1);
|
||||||
// set default numbers
|
// set default numbers
|
||||||
n_samples_per_face = 10;
|
n_samples_per_face = 10;
|
||||||
n_samples_edge_to_face_ratio = 0.1f;
|
n_samples_edge_to_face_ratio = 0.1f;
|
||||||
bbox_factor = 0.1f;
|
bbox_factor = 0.1f;
|
||||||
inflate_percentage = 0.02f;
|
inflate_percentage = 0.02f;
|
||||||
min_size = 125; /* 125 = 5^3 */
|
min_size = 125; /* 125 = 5^3 */
|
||||||
n_hist_bins = 256;
|
n_hist_bins = 256;
|
||||||
print_every_n_elements = S1.fn/100;
|
print_every_n_elements = S1.fn/100;
|
||||||
|
|
||||||
if(print_every_n_elements <= 1)
|
if(print_every_n_elements <= 1)
|
||||||
print_every_n_elements = 2;
|
print_every_n_elements = 2;
|
||||||
|
@ -214,11 +214,11 @@ inline double Sampling<MetroMesh>::ComputeMeshArea(MetroMesh & mesh)
|
||||||
FaceIterator face;
|
FaceIterator face;
|
||||||
double area = 0.0;
|
double area = 0.0;
|
||||||
|
|
||||||
for(face=mesh.face.begin(); face != mesh.face.end(); face++)
|
for(face=mesh.face.begin(); face != mesh.face.end(); face++)
|
||||||
if(!(*face).IsD())
|
if(!(*face).IsD())
|
||||||
area += DoubleArea(*face);
|
area += DoubleArea(*face);
|
||||||
|
|
||||||
return area/2.0;
|
return area/2.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class MetroMesh>
|
template <class MetroMesh>
|
||||||
|
@ -226,7 +226,7 @@ float Sampling<MetroMesh>::AddSample(const Point3x &p )
|
||||||
{
|
{
|
||||||
FaceType *f=0;
|
FaceType *f=0;
|
||||||
Point3x normf, bestq, ip;
|
Point3x normf, bestq, ip;
|
||||||
ScalarType dist;
|
ScalarType dist;
|
||||||
|
|
||||||
dist = dist_upper_bound;
|
dist = dist_upper_bound;
|
||||||
|
|
||||||
|
@ -269,10 +269,10 @@ void Sampling<MetroMesh>::VertexSampling()
|
||||||
|
|
||||||
printf("Vertex sampling\n");
|
printf("Vertex sampling\n");
|
||||||
VertexIterator vi;
|
VertexIterator vi;
|
||||||
typename std::vector<VertexPointer>::iterator vif;
|
typename std::vector<VertexPointer>::iterator vif;
|
||||||
for(vi=S1.vert.begin();vi!=S1.vert.end();++vi)
|
for(vi=S1.vert.begin();vi!=S1.vert.end();++vi)
|
||||||
if( (*vi).IsUserBit(referredBit) || // it is referred
|
if( (*vi).IsUserBit(referredBit) || // it is referred
|
||||||
((Flags&SamplingFlags::INCLUDE_UNREFERENCED_VERTICES) != 0) ) //include also unreferred
|
((Flags&SamplingFlags::INCLUDE_UNREFERENCED_VERTICES) != 0) ) //include also unreferred
|
||||||
{
|
{
|
||||||
error = AddSample((*vi).cP());
|
error = AddSample((*vi).cP());
|
||||||
|
|
||||||
|
@ -310,40 +310,40 @@ inline void Sampling<MetroMesh>::SampleEdge(const Point3x & v0, const Point3x &
|
||||||
template <class MetroMesh>
|
template <class MetroMesh>
|
||||||
void Sampling<MetroMesh>::EdgeSampling()
|
void Sampling<MetroMesh>::EdgeSampling()
|
||||||
{
|
{
|
||||||
// Edge sampling.
|
// Edge sampling.
|
||||||
typedef std::pair<VertexPointer, VertexPointer> pvv;
|
typedef std::pair<VertexPointer, VertexPointer> pvv;
|
||||||
std::vector< pvv > Edges;
|
std::vector< pvv > Edges;
|
||||||
|
|
||||||
printf("Edge sampling\n");
|
printf("Edge sampling\n");
|
||||||
|
|
||||||
// compute edge list.
|
// compute edge list.
|
||||||
FaceIterator fi;
|
FaceIterator fi;
|
||||||
for(fi=S1.face.begin(); fi != S1.face.end(); fi++)
|
for(fi=S1.face.begin(); fi != S1.face.end(); fi++)
|
||||||
for(int i=0; i<3; ++i)
|
for(int i=0; i<3; ++i)
|
||||||
{
|
{
|
||||||
Edges.push_back(make_pair((*fi).V0(i),(*fi).V1(i)));
|
Edges.push_back(std::make_pair((*fi).V0(i),(*fi).V1(i)));
|
||||||
if(Edges.back().first > Edges.back().second)
|
if(Edges.back().first > Edges.back().second)
|
||||||
swap(Edges.back().first, Edges.back().second);
|
std::swap(Edges.back().first, Edges.back().second);
|
||||||
}
|
}
|
||||||
sort(Edges.begin(), Edges.end());
|
sort(Edges.begin(), Edges.end());
|
||||||
typename std::vector< pvv>::iterator edgeend = unique(Edges.begin(), Edges.end());
|
typename std::vector< pvv>::iterator edgeend = unique(Edges.begin(), Edges.end());
|
||||||
Edges.resize(edgeend-Edges.begin());
|
Edges.resize(edgeend-Edges.begin());
|
||||||
|
|
||||||
// sample edges.
|
// sample edges.
|
||||||
typename std::vector<pvv>::iterator ei;
|
typename std::vector<pvv>::iterator ei;
|
||||||
double n_samples_per_length_unit;
|
double n_samples_per_length_unit;
|
||||||
double n_samples_decimal = 0.0;
|
double n_samples_decimal = 0.0;
|
||||||
int cnt=0;
|
int cnt=0;
|
||||||
if(Flags & SamplingFlags::FACE_SAMPLING)
|
if(Flags & SamplingFlags::FACE_SAMPLING)
|
||||||
n_samples_per_length_unit = sqrt((double)n_samples_per_area_unit);
|
n_samples_per_length_unit = sqrt((double)n_samples_per_area_unit);
|
||||||
else
|
else
|
||||||
n_samples_per_length_unit = n_samples_per_area_unit;
|
n_samples_per_length_unit = n_samples_per_area_unit;
|
||||||
for(ei=Edges.begin(); ei!=Edges.end(); ++ei)
|
for(ei=Edges.begin(); ei!=Edges.end(); ++ei)
|
||||||
{
|
{
|
||||||
n_samples_decimal += Distance((*ei).first->cP(),(*ei).second->cP()) * n_samples_per_length_unit;
|
n_samples_decimal += Distance((*ei).first->cP(),(*ei).second->cP()) * n_samples_per_length_unit;
|
||||||
n_samples = (int) n_samples_decimal;
|
n_samples = (int) n_samples_decimal;
|
||||||
SampleEdge((*ei).first->cP(), (*ei).second->cP(), (int) n_samples);
|
SampleEdge((*ei).first->cP(), (*ei).second->cP(), (int) n_samples);
|
||||||
n_samples_decimal -= (double) n_samples;
|
n_samples_decimal -= (double) n_samples;
|
||||||
|
|
||||||
// print progress information
|
// print progress information
|
||||||
if(!(++cnt % print_every_n_elements))
|
if(!(++cnt % print_every_n_elements))
|
||||||
|
@ -395,7 +395,7 @@ void Sampling<MetroMesh>::MontecarloFaceSampling()
|
||||||
srand(clock());
|
srand(clock());
|
||||||
// printf("Montecarlo face sampling\n");
|
// printf("Montecarlo face sampling\n");
|
||||||
for(fi=S1.face.begin(); fi != S1.face.end(); fi++)
|
for(fi=S1.face.begin(); fi != S1.face.end(); fi++)
|
||||||
if(!(*fi).IsD())
|
if(!(*fi).IsD())
|
||||||
{
|
{
|
||||||
// compute # samples in the current face.
|
// compute # samples in the current face.
|
||||||
n_samples_decimal += 0.5*DoubleArea(*fi) * n_samples_per_area_unit;
|
n_samples_decimal += 0.5*DoubleArea(*fi) * n_samples_per_area_unit;
|
||||||
|
@ -546,35 +546,35 @@ void Sampling<MetroMesh>::SimilarFaceSampling()
|
||||||
template <class MetroMesh>
|
template <class MetroMesh>
|
||||||
void Sampling<MetroMesh>::Hausdorff()
|
void Sampling<MetroMesh>::Hausdorff()
|
||||||
{
|
{
|
||||||
Box3< ScalarType> bbox;
|
Box3< ScalarType> bbox;
|
||||||
|
|
||||||
typedef typename std::vector<FaceType>::iterator FaceVecIterator;
|
typedef typename std::vector<FaceType>::iterator FaceVecIterator;
|
||||||
// set grid meshes.
|
// set grid meshes.
|
||||||
if(Flags & SamplingFlags::USE_HASH_GRID) hS2.Set(S2.face.begin(),S2.face.end());
|
if(Flags & SamplingFlags::USE_HASH_GRID) hS2.Set(S2.face.begin(),S2.face.end());
|
||||||
if(Flags & SamplingFlags::USE_AABB_TREE) tS2.Set(S2.face.begin(),S2.face.end());
|
if(Flags & SamplingFlags::USE_AABB_TREE) tS2.Set(S2.face.begin(),S2.face.end());
|
||||||
if(Flags & SamplingFlags::USE_STATIC_GRID) gS2.Set(S2.face.begin(),S2.face.end());
|
if(Flags & SamplingFlags::USE_STATIC_GRID) gS2.Set(S2.face.begin(),S2.face.end());
|
||||||
if(Flags & SamplingFlags::USE_OCTREE) oS2.Set(S2.face.begin(),S2.face.end());
|
if(Flags & SamplingFlags::USE_OCTREE) oS2.Set(S2.face.begin(),S2.face.end());
|
||||||
|
|
||||||
// set bounding box
|
// set bounding box
|
||||||
bbox = S2.bbox;
|
bbox = S2.bbox;
|
||||||
dist_upper_bound = /*bbox_factor * */bbox.Diag();
|
dist_upper_bound = /*bbox_factor * */bbox.Diag();
|
||||||
if(Flags & SamplingFlags::HIST)
|
if(Flags & SamplingFlags::HIST)
|
||||||
hist.SetRange(0.0, dist_upper_bound/100.0, n_hist_bins);
|
hist.SetRange(0.0, dist_upper_bound/100.0, n_hist_bins);
|
||||||
|
|
||||||
// initialize sampling statistics.
|
// initialize sampling statistics.
|
||||||
n_total_area_samples = n_total_edge_samples = n_total_vertex_samples = n_total_samples = n_samples = 0;
|
n_total_area_samples = n_total_edge_samples = n_total_vertex_samples = n_total_samples = n_samples = 0;
|
||||||
max_dist = -HUGE_VAL;
|
max_dist = -HUGE_VAL;
|
||||||
mean_dist = RMS_dist = 0;
|
mean_dist = RMS_dist = 0;
|
||||||
|
|
||||||
// Vertex sampling.
|
// Vertex sampling.
|
||||||
if(Flags & SamplingFlags::VERTEX_SAMPLING)
|
if(Flags & SamplingFlags::VERTEX_SAMPLING)
|
||||||
VertexSampling();
|
VertexSampling();
|
||||||
// Edge sampling.
|
// Edge sampling.
|
||||||
if(n_samples_target > n_total_samples)
|
if(n_samples_target > n_total_samples)
|
||||||
{
|
{
|
||||||
n_samples_target -= (int) n_total_samples;
|
n_samples_target -= (int) n_total_samples;
|
||||||
n_samples_per_area_unit = n_samples_target / area_S1;
|
n_samples_per_area_unit = n_samples_target / area_S1;
|
||||||
if(Flags & SamplingFlags::EDGE_SAMPLING)
|
if(Flags & SamplingFlags::EDGE_SAMPLING)
|
||||||
{
|
{
|
||||||
EdgeSampling();
|
EdgeSampling();
|
||||||
if(n_samples_target > n_total_samples) n_samples_target -= (int) n_total_samples;
|
if(n_samples_target > n_total_samples) n_samples_target -= (int) n_total_samples;
|
||||||
|
|
Loading…
Reference in New Issue