#ifndef NO_QT -> #ifdef QT_VERSION
This commit is contained in:
parent
ca7a42f881
commit
99440c4e62
|
@ -40,7 +40,7 @@ namespace tri {
|
||||||
/*@{*/
|
/*@{*/
|
||||||
/*@{*/
|
/*@{*/
|
||||||
/** Class Resampler.
|
/** Class Resampler.
|
||||||
This is class reasmpling a mesh using marching cubes methods
|
This is class reasmpling a mesh using marching cubes methods
|
||||||
@param OLD_MESH_TYPE (Template Parameter) Specifies the type of mesh to be resampled
|
@param OLD_MESH_TYPE (Template Parameter) Specifies the type of mesh to be resampled
|
||||||
@param NEW_MESH_TYPE (Template Parameter) Specifies the type of output mesh.
|
@param NEW_MESH_TYPE (Template Parameter) Specifies the type of output mesh.
|
||||||
*/
|
*/
|
||||||
|
@ -139,18 +139,18 @@ template <class OLD_MESH_TYPE,class NEW_MESH_TYPE, class FLT, class DISTFUNCTOR
|
||||||
int index=GetSliceIndex(x,z);
|
int index=GetSliceIndex(x,z);
|
||||||
|
|
||||||
if (y==CurrentSlice) return _v_cs[index];
|
if (y==CurrentSlice) return _v_cs[index];
|
||||||
else return _v_ns[index];
|
else return _v_ns[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
float V(int x,int y,int z)
|
float V(int x,int y,int z)
|
||||||
{
|
{
|
||||||
if(DiscretizeFlag) return VV(x,y,z).second+offset<0?-1:1;
|
if(DiscretizeFlag) return VV(x,y,z).second+offset<0?-1:1;
|
||||||
return VV(x,y,z).second+offset;
|
return VV(x,y,z).second+offset;
|
||||||
}
|
}
|
||||||
///return true if the distance form the mesh is less than maxdim and return distance
|
///return true if the distance form the mesh is less than maxdim and return distance
|
||||||
field_value DistanceFromMesh(Point3f &pp,Old_Mesh */*mesh*/)
|
field_value DistanceFromMesh(Point3f &pp,Old_Mesh */*mesh*/)
|
||||||
{
|
{
|
||||||
float dist;
|
float dist;
|
||||||
typename Old_Mesh::FaceType *f=NULL;
|
typename Old_Mesh::FaceType *f=NULL;
|
||||||
const float max_dist = max_dim;
|
const float max_dist = max_dim;
|
||||||
vcg::Point3f testPt;
|
vcg::Point3f testPt;
|
||||||
|
@ -175,22 +175,22 @@ template <class OLD_MESH_TYPE,class NEW_MESH_TYPE, class FLT, class DISTFUNCTOR
|
||||||
assert(retIP); // this should happen only if the starting mesh has degenerate faces.
|
assert(retIP); // this should happen only if the starting mesh has degenerate faces.
|
||||||
|
|
||||||
const float InterpolationEpsilon = 0.00001f;
|
const float InterpolationEpsilon = 0.00001f;
|
||||||
int zeroCnt=0;
|
int zeroCnt=0;
|
||||||
if(pip[0]<InterpolationEpsilon) ++zeroCnt;
|
if(pip[0]<InterpolationEpsilon) ++zeroCnt;
|
||||||
if(pip[1]<InterpolationEpsilon) ++zeroCnt;
|
if(pip[1]<InterpolationEpsilon) ++zeroCnt;
|
||||||
if(pip[2]<InterpolationEpsilon) ++zeroCnt;
|
if(pip[2]<InterpolationEpsilon) ++zeroCnt;
|
||||||
assert(zeroCnt<3);
|
assert(zeroCnt<3);
|
||||||
|
|
||||||
Point3f dir=(testPt-closestPt).Normalize();
|
Point3f dir=(testPt-closestPt).Normalize();
|
||||||
|
|
||||||
// Note that the two signs could be discordant.
|
// Note that the two signs could be discordant.
|
||||||
// Always choose the best one according to where the nearest point falls.
|
// Always choose the best one according to where the nearest point falls.
|
||||||
float signBest;
|
float signBest;
|
||||||
|
|
||||||
// Compute test if the point see the surface normal from inside or outside
|
// Compute test if the point see the surface normal from inside or outside
|
||||||
// Surface normal for improved robustness is computed both by face and interpolated from vertices.
|
// Surface normal for improved robustness is computed both by face and interpolated from vertices.
|
||||||
if(zeroCnt>0) // we Not are in the middle of the face so the face normal is NOT reliable.
|
if(zeroCnt>0) // we Not are in the middle of the face so the face normal is NOT reliable.
|
||||||
{
|
{
|
||||||
closestNormV = (f->V(0)->cN())*pip[0] + (f->V(1)->cN())*pip[1] + (f->V(2)->cN())*pip[2] ;
|
closestNormV = (f->V(0)->cN())*pip[0] + (f->V(1)->cN())*pip[1] + (f->V(2)->cN())*pip[2] ;
|
||||||
signBest = dir.dot(closestNormV) ;
|
signBest = dir.dot(closestNormV) ;
|
||||||
}
|
}
|
||||||
|
@ -205,7 +205,7 @@ template <class OLD_MESH_TYPE,class NEW_MESH_TYPE, class FLT, class DISTFUNCTOR
|
||||||
return field_value(true,dist);
|
return field_value(true,dist);
|
||||||
}
|
}
|
||||||
|
|
||||||
field_value MultiDistanceFromMesh(Point3f &pp, Old_Mesh */*mesh*/)
|
field_value MultiDistanceFromMesh(Point3f &pp, Old_Mesh */*mesh*/)
|
||||||
{
|
{
|
||||||
float distSum=0;
|
float distSum=0;
|
||||||
int positiveCnt=0; // positive results counter
|
int positiveCnt=0; // positive results counter
|
||||||
|
@ -226,7 +226,7 @@ template <class OLD_MESH_TYPE,class NEW_MESH_TYPE, class FLT, class DISTFUNCTOR
|
||||||
distSum += fabs(ff.second);
|
distSum += fabs(ff.second);
|
||||||
if(ff.second>0) positiveCnt ++;
|
if(ff.second>0) positiveCnt ++;
|
||||||
}
|
}
|
||||||
if(positiveCnt<=MultiSample/2) distSum = -distSum;
|
if(positiveCnt<=MultiSample/2) distSum = -distSum;
|
||||||
return field_value(true, distSum/MultiSample);
|
return field_value(true, distSum/MultiSample);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -294,7 +294,7 @@ template <class OLD_MESH_TYPE,class NEW_MESH_TYPE, class FLT, class DISTFUNCTOR
|
||||||
} while(flippedCnt>0);
|
} while(flippedCnt>0);
|
||||||
|
|
||||||
|
|
||||||
#ifndef NO_QT
|
#ifdef QT_VERSION
|
||||||
if(flippedTot>0)
|
if(flippedTot>0)
|
||||||
qDebug("Flipped %i values in %i times",flippedTot,flippedTimes);
|
qDebug("Flipped %i values in %i times",flippedTot,flippedTimes);
|
||||||
#endif
|
#endif
|
||||||
|
@ -338,11 +338,11 @@ template <class OLD_MESH_TYPE,class NEW_MESH_TYPE, class FLT, class DISTFUNCTOR
|
||||||
|
|
||||||
Begin();
|
Begin();
|
||||||
extractor.Initialize();
|
extractor.Initialize();
|
||||||
for (int j=0; j<=this->siz.Y(); j++)
|
for (int j=0; j<=this->siz.Y(); j++)
|
||||||
{
|
{
|
||||||
if (cb) cb((100*j)/this->siz.Y(),"Marching ");
|
if (cb) cb((100*j)/this->siz.Y(),"Marching ");
|
||||||
ProcessSlice<EXTRACTOR_TYPE>(extractor);//find cells where there is the isosurface and examine it
|
ProcessSlice<EXTRACTOR_TYPE>(extractor);//find cells where there is the isosurface and examine it
|
||||||
NextSlice();
|
NextSlice();
|
||||||
}
|
}
|
||||||
extractor.Finalize();
|
extractor.Finalize();
|
||||||
typename New_Mesh::VertexIterator vi;
|
typename New_Mesh::VertexIterator vi;
|
||||||
|
@ -493,14 +493,14 @@ template <class OLD_MESH_TYPE,class NEW_MESH_TYPE, class FLT, class DISTFUNCTOR
|
||||||
///if there is a vertex in z axis of a cell return the vertex or create it
|
///if there is a vertex in z axis of a cell return the vertex or create it
|
||||||
void GetXIntercept(const vcg::Point3i &p1, const vcg::Point3i &p2, VertexPointer &v)
|
void GetXIntercept(const vcg::Point3i &p1, const vcg::Point3i &p2, VertexPointer &v)
|
||||||
{
|
{
|
||||||
assert(p1.X()+1 == p2.X());
|
assert(p1.X()+1 == p2.X());
|
||||||
assert(p1.Y() == p2.Y());
|
assert(p1.Y() == p2.Y());
|
||||||
assert(p1.Z() == p2.Z());
|
assert(p1.Z() == p2.Z());
|
||||||
|
|
||||||
int i = p1.X();// (p1.X() - _bbox.min.X())/_cell_size.X();
|
int i = p1.X();// (p1.X() - _bbox.min.X())/_cell_size.X();
|
||||||
int z = p1.Z();//(p1.Z() - _bbox.min.Z())/_cell_size.Z();
|
int z = p1.Z();//(p1.Z() - _bbox.min.Z())/_cell_size.Z();
|
||||||
VertexIndex index = i+z*this->siz.X();
|
VertexIndex index = i+z*this->siz.X();
|
||||||
VertexIndex pos=-1;
|
VertexIndex pos=-1;
|
||||||
if (p1.Y()==CurrentSlice)
|
if (p1.Y()==CurrentSlice)
|
||||||
{
|
{
|
||||||
if ((pos=_x_cs[index])==-1)
|
if ((pos=_x_cs[index])==-1)
|
||||||
|
@ -525,21 +525,21 @@ template <class OLD_MESH_TYPE,class NEW_MESH_TYPE, class FLT, class DISTFUNCTOR
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assert(pos>=0);
|
assert(pos>=0);
|
||||||
v = &_newM->vert[pos];
|
v = &_newM->vert[pos];
|
||||||
}
|
}
|
||||||
|
|
||||||
///if there is a vertex in y axis of a cell return the vertex or create it
|
///if there is a vertex in y axis of a cell return the vertex or create it
|
||||||
void GetYIntercept(const vcg::Point3i &p1, const vcg::Point3i &p2, VertexPointer &v)
|
void GetYIntercept(const vcg::Point3i &p1, const vcg::Point3i &p2, VertexPointer &v)
|
||||||
{
|
{
|
||||||
assert(p1.X() == p2.X());
|
assert(p1.X() == p2.X());
|
||||||
assert(p1.Y()+1 == p2.Y());
|
assert(p1.Y()+1 == p2.Y());
|
||||||
assert(p1.Z() == p2.Z());
|
assert(p1.Z() == p2.Z());
|
||||||
|
|
||||||
int i = p1.X(); // (p1.X() - _bbox.min.X())/_cell_size.X();
|
int i = p1.X(); // (p1.X() - _bbox.min.X())/_cell_size.X();
|
||||||
int z = p1.Z(); // (p1.Z() - _bbox.min.Z())/_cell_size.Z();
|
int z = p1.Z(); // (p1.Z() - _bbox.min.Z())/_cell_size.Z();
|
||||||
VertexIndex index = i+z*this->siz.X();
|
VertexIndex index = i+z*this->siz.X();
|
||||||
VertexIndex pos=-1;
|
VertexIndex pos=-1;
|
||||||
if ((pos=_y_cs[index])==-1)
|
if ((pos=_y_cs[index])==-1)
|
||||||
{
|
{
|
||||||
_y_cs[index] = (VertexIndex) _newM->vert.size();
|
_y_cs[index] = (VertexIndex) _newM->vert.size();
|
||||||
|
@ -548,14 +548,14 @@ template <class OLD_MESH_TYPE,class NEW_MESH_TYPE, class FLT, class DISTFUNCTOR
|
||||||
v = &_newM->vert[ pos ];
|
v = &_newM->vert[ pos ];
|
||||||
v->P()=Interpolate(p1,p2,1);
|
v->P()=Interpolate(p1,p2,1);
|
||||||
}
|
}
|
||||||
assert(pos>=0);
|
assert(pos>=0);
|
||||||
v = &_newM->vert[pos];
|
v = &_newM->vert[pos];
|
||||||
}
|
}
|
||||||
|
|
||||||
///if there is a vertex in z axis of a cell return the vertex or create it
|
///if there is a vertex in z axis of a cell return the vertex or create it
|
||||||
void GetZIntercept(const vcg::Point3i &p1, const vcg::Point3i &p2, VertexPointer &v)
|
void GetZIntercept(const vcg::Point3i &p1, const vcg::Point3i &p2, VertexPointer &v)
|
||||||
{
|
{
|
||||||
assert(p1.X() == p2.X());
|
assert(p1.X() == p2.X());
|
||||||
assert(p1.Y() == p2.Y());
|
assert(p1.Y() == p2.Y());
|
||||||
assert(p1.Z()+1 == p2.Z());
|
assert(p1.Z()+1 == p2.Z());
|
||||||
|
|
||||||
|
@ -563,7 +563,7 @@ template <class OLD_MESH_TYPE,class NEW_MESH_TYPE, class FLT, class DISTFUNCTOR
|
||||||
int z = p1.Z(); //(p1.Z() - _bbox.min.Z())/_cell_size.Z();
|
int z = p1.Z(); //(p1.Z() - _bbox.min.Z())/_cell_size.Z();
|
||||||
VertexIndex index = i+z*this->siz.X();
|
VertexIndex index = i+z*this->siz.X();
|
||||||
|
|
||||||
VertexIndex pos=-1;
|
VertexIndex pos=-1;
|
||||||
if (p1.Y()==CurrentSlice)
|
if (p1.Y()==CurrentSlice)
|
||||||
{
|
{
|
||||||
if ((pos=_z_cs[index])==-1)
|
if ((pos=_z_cs[index])==-1)
|
||||||
|
@ -588,7 +588,7 @@ template <class OLD_MESH_TYPE,class NEW_MESH_TYPE, class FLT, class DISTFUNCTOR
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assert(pos>=0);
|
assert(pos>=0);
|
||||||
v = &_newM->vert[pos];
|
v = &_newM->vert[pos];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue