This commit is contained in:
ganovelli 2004-05-14 13:49:07 +00:00
parent ba3f257801
commit f7374159fb
1 changed files with 25 additions and 30 deletions

View File

@ -24,6 +24,16 @@
History
$Log: not supported by cvs2svn $
Revision 1.6 2004/05/14 00:38:01 ganovelli
a bit of cleaning:
SamplingFlags struct added
optional treatment for unreferred vertices.
Note: unref vertices are tested against unref vertices without
using the grid...it is n^2 with n number of unreferred vertices. To make it
with the grid in the proper way :
derive face and vertex from a simplexClass,
instantiate GridStaticPtr on the simplexClass template.
****************************************************************************/
@ -78,7 +88,6 @@ private:
MetroMesh &S2;
MetroMeshGrid gS2;
std::vector<VertexPointer> unrefVert2; //unreferred vertices
int n_samples_per_face ;
float n_samples_edge_to_face_ratio ;
@ -111,7 +120,7 @@ private:
// private methods
inline double ComputeMeshArea(MetroMesh & mesh);
float AddSample(const Point3x &p,ScalarType upper_bound);
float AddSample(const Point3x &p);
inline void AddRandomSample(FaceIterator &T);
inline void SampleEdge(const Point3x & v0, const Point3x & v1, int n_samples_per_edge);
void VertexSampling();
@ -125,6 +134,7 @@ private:
public :
// public methods
Sampling(MetroMesh &_s1, MetroMesh &_s2);
~Sampling();
void Hausdorff();
double GetArea() {return area_S1;}
double GetDistMax() {return max_dist;}
@ -167,11 +177,12 @@ Sampling<MetroMesh>::Sampling(MetroMesh &_s1, MetroMesh &_s2):S1(_s1),S2(_s2)
FaceIterator fi; VertexIterator vi; int i;
for(fi = _s1.face.begin(); fi!= _s1.face.end(); ++fi)
for(i=0;i<3;++i) (*fi).V(i)->SetUserBit(referredBit);
for(fi = _s2.face.begin(); fi!= _s2.face.end(); ++fi)
for(i=0;i<3;++i) (*fi).V(i)->SetUserBit(referredBit);
}
template <class MetroMesh>
Sampling<MetroMesh>::~Sampling()
{
VertexType::DeleteUserBit(referredBit);
}
@ -206,13 +217,13 @@ inline double Sampling<MetroMesh>::ComputeMeshArea(MetroMesh & mesh)
}
template <class MetroMesh>
float Sampling<MetroMesh>::AddSample(const Point3x &p, ScalarType upper_bound )
float Sampling<MetroMesh>::AddSample(const Point3x &p )
{
FaceType *f=0;
Point3x normf, bestq, ip;
ScalarType dist;
dist = upper_bound;
dist = dist_upper_bound;
// compute distance between p_i and the mesh S2
MinDistPoint(S2, p, gS2, dist, normf, bestq, f, ip);
@ -251,17 +262,7 @@ void Sampling<MetroMesh>::VertexSampling()
if( (*vi).IsUserBit(referredBit) || // it is referred
((Flags&SamplingFlags::INCLUDE_UNREFERENCED_VERTICES) != 0) ) //include also unreferred
{
error = dist_upper_bound;
if( !(*vi).IsUserBit(referredBit) &&
((Flags&SamplingFlags::INCLUDE_UNREFERENCED_VERTICES) != 0) )
for(vif = unrefVert2.begin(); vif != unrefVert2.end(); ++vif)
{
ScalarType d = Distance((*vif)->cP(),(*vi).cP());
if(d < error)
error = d;
}
error = AddSample((*vi).cP(),error);
error = AddSample((*vi).cP());
n_total_vertex_samples++;
@ -304,7 +305,7 @@ inline void Sampling<MetroMesh>::SampleEdge(const Point3x & v0, const Point3x &
for(i=1; i <= n_samples_per_edge; i++)
{
AddSample(v0 + e*i,dist_upper_bound);
AddSample(v0 + e*i);
n_total_edge_samples++;
}
}
@ -384,7 +385,7 @@ inline void Sampling<MetroMesh>::AddRandomSample(FaceIterator &T)
}
// add a random point on the face T.
AddSample (p0 + (v1 * rnd_1 + v2 * rnd_2),dist_upper_bound);
AddSample (p0 + (v1 * rnd_1 + v2 * rnd_2));
n_total_area_samples++;
}
@ -427,7 +428,7 @@ void Sampling<MetroMesh>::FaceSubdiv(const Point3x & v0, const Point3x & v1, con
if(maxdepth == 0)
{
// ground case.
AddSample((v0+v1+v2)/3.0f,dist_upper_bound);
AddSample((v0+v1+v2)/3.0f);
n_total_area_samples++;
n_samples++;
return;
@ -507,7 +508,7 @@ void Sampling<MetroMesh>::SimilarTriangles(const Point3x & v0, const Point3x & v
for(i=1; i < n_samples_per_edge-1; i++)
for(j=1; j < n_samples_per_edge-1-i; j++)
{
AddSample( v0 + (V1*(double)i + V2*(double)j) ,dist_upper_bound);
AddSample( v0 + (V1*(double)i + V2*(double)j) );
n_total_area_samples++;
n_samples++;
}
@ -552,12 +553,6 @@ void Sampling<MetroMesh>::Hausdorff()
{
Box3< ScalarType> bbox;
FaceIterator fi; VertexIterator vi;
if( (Flags & SamplingFlags::INCLUDE_UNREFERENCED_VERTICES) != 0){
for(vi = S2.vert.begin(); vi!= S2.vert.end(); ++vi)
if(!(*vi).IsUserBit(referredBit)) unrefVert2.push_back(&(*vi));
}
// set grid meshes.
gS2.SetBBox(S2.bbox);
if(S2.face.size() < min_size)