Solved an issue related to different casting double-float between gcc 3 and gcc 4

This commit is contained in:
Paolo Cignoni 2007-03-22 11:07:16 +00:00
parent 3605747f0d
commit ae9d8a8535
2 changed files with 35 additions and 21 deletions

View File

@ -24,6 +24,9 @@
History
$Log: not supported by cvs2svn $
Revision 1.13 2007/02/25 09:20:10 cignoni
Added Rad to the NormalThr Option and removed a bug in multiple exectuion of non optimal simplification (missing an isD check)
Revision 1.12 2007/01/19 09:13:14 cignoni
Added Finalize() method to the interface, corrected minor bugs on border preserving and postsimplification cleanup
Avoided double make_heap (it is done only in the local_optimization init)
@ -168,7 +171,10 @@ public:
typedef TriEdgeCollapseQuadricParameter QParameter;
typedef HelperType QH;
static QParameter & Params(){static QParameter p; return p;}
static QParameter & Params(){
static QParameter p;
return p;
}
enum Hint {
HNHasFFTopology = 0x0001, // La mesh arriva con la topologia ff gia'fatta
HNHasVFTopology = 0x0002, // La mesh arriva con la topologia bf gia'fatta
@ -415,7 +421,8 @@ public:
QuadricType qq=QH::Qd(v[0]);
qq+=QH::Qd(v[1]);
double QuadErr = Params().ScaleFactor*qq.Apply(v[1]->P());
Point3d tpd=Point3d::Construct(v[1]->P());
double QuadErr = Params().ScaleFactor*qq.Apply(tpd);
// All collapses involving triangles with quality larger than <QualityThr> has no penalty;
if(MinQual>Params().QualityThr) MinQual=Params().QualityThr;
@ -609,14 +616,17 @@ static void InitQuadric(TriMeshType &m)
q+=QH::Qd(v[1]);
Point3<QuadricType::ScalarType> x;
bool rt=q.Minimum(x);
if(!rt) { // if the computation of the minimum fails we choose between the two edge points and the middle one.
x.Import((v[0]->P()+v[1]->P())/2);
Point3<QuadricType::ScalarType> x0=Point3d::Construct(v[0]->P());
Point3<QuadricType::ScalarType> x1=Point3d::Construct(v[1]->P());
x.Import((v[0]->P()+v[1]->P())/2);
double qvx=q.Apply(x);
double qv0=q.Apply(v[0]->P());
double qv1=q.Apply(v[1]->P());
if(qv0<qvx) x.Import(v[0]->P());
if(qv1<qvx && qv1<qv0) x.Import(v[1]->P());
double qv0=q.Apply(x0);
double qv1=q.Apply(x1);
if(qv0<qvx) x=x0;
if(qv1<qvx && qv1<qv0) x=x1;
}
return CoordType::Construct(x);

View File

@ -24,6 +24,9 @@
History
$Log: not supported by cvs2svn $
Revision 1.7 2006/11/13 12:53:40 ponchio
just added an #include <matrix33>
Revision 1.6 2006/10/09 20:23:00 cignoni
Added a minimum method that uses SVD. Unfortunately it is much much slower.
@ -73,16 +76,16 @@ public:
template< class PlaneType >
void ByPlane( const PlaneType & p ) // Init dato un piano
{
a[0] = p.Direction()[0]*p.Direction()[0]; // a11
a[1] = p.Direction()[1]*p.Direction()[0]; // a12 (=a21)
a[2] = p.Direction()[2]*p.Direction()[0]; // a13 (=a31)
a[3] = p.Direction()[1]*p.Direction()[1]; // a22
a[4] = p.Direction()[2]*p.Direction()[1]; // a23 (=a32)
a[5] = p.Direction()[2]*p.Direction()[2]; // a33
a[0] = (ScalarType)p.Direction()[0]*p.Direction()[0]; // a11
a[1] = (ScalarType)p.Direction()[1]*p.Direction()[0]; // a12 (=a21)
a[2] = (ScalarType)p.Direction()[2]*p.Direction()[0]; // a13 (=a31)
a[3] = (ScalarType)p.Direction()[1]*p.Direction()[1]; // a22
a[4] = (ScalarType)p.Direction()[2]*p.Direction()[1]; // a23 (=a32)
a[5] = (ScalarType)p.Direction()[2]*p.Direction()[2]; // a33
b[0] = (ScalarType)(-2.0)*p.Offset()*p.Direction()[0];
b[1] = (ScalarType)(-2.0)*p.Offset()*p.Direction()[1];
b[2] = (ScalarType)(-2.0)*p.Offset()*p.Direction()[2];
c = p.Offset()*p.Offset();
c = (ScalarType)p.Offset()*p.Offset();
}
void Zero() // Azzera la quadrica
@ -137,31 +140,32 @@ template <class ResultScalarType>
ResultScalarType Apply( const Point3<ResultScalarType> & p ) const // Applica la quadrica al punto p
{
assert( IsValid() );
// Versione Lenta
/*
// Versione Lenta
Point3d t;
t[0] = p[0]*a[0] + p[1]*a[1] + p[2]*a[2];
t[1] = p[0]*a[1] + p[1]*a[3] + p[2]*a[4];
t[2] = p[0]*a[2] + p[1]*a[4] + p[2]*a[5];
double k = b[0]*p[0] + b[1]*p[1] + b[2]*p[2];
double tp =t*p;
double tp = t*p ;
assert(tp+k+c >= 0);
return tp + k + c;
*/
/* Versione veloce */
*/
/* Versione veloce */
return ResultScalarType (
p[0]*p[0]*a[0] + 2*p[0]*p[1]*a[1] + 2*p[0]*p[2]*a[2] + p[0]*b[0]
+ p[1]*p[1]*a[3] + 2*p[1]*p[2]*a[4] + p[1]*b[1]
+ p[2]*p[2]*a[5] + p[2]*b[2] + c);
}
// spostare..risolve un sistema 3x3
template<class FLTYPE>
bool Gauss33( FLTYPE x[], FLTYPE C[3][3+1] )
{
const FLTYPE keps = (FLTYPE)1e-6;
const FLTYPE keps = (FLTYPE)1e-3;
int i,j,k;
FLTYPE eps; // Determina valore cond.