Commit 182790ae by Kenneth Vanhoey

LF

parent 4faeed7a
 ... ... @@ -53,25 +53,28 @@ template void Approximator_Frame::approximate(Dart d) { MAP& m = this->m_map ; Dart dd = m.phi2(d) ; // get some darts Dart dd = m.phi2(d) ; // get 2 vertices // if QEM placed new vertex at one of the previous : place same frame if (this->m_approxPosition[d] == this->m_position[d]) // new Position is position of vertex d this->m_approx[d] = this->m_attrV[d] ; else if (this->m_approxPosition[d] == this->m_position[dd]) // new Position is position of vertex dd this->m_approx[d] = this->m_attrV[dd] ; else { // Create two segments : v0-v1 and v0-v VEC3 segment = this->m_position[dd] ; segment -= this->m_position[d] ; VEC3 segmentNew = m_approxPosition[d] ; segmentNew -= this->m_position[d] ; // Orthogonal projection of v0-v onto v0-v1 : get coefficient t REAL t = (segment * segmentNew) / (segment.norm()*segment.norm()) ; t = std::max (std::min (t , REAL(1)) , REAL(0) ) ; // Orthogonal projection on segment v1-v2 of new vertex t = std::max (std::min (t , REAL(1)) , REAL(0) ) ; // clamp it to [0,1] VEC3 n1, n2 ; this->m_attrV[d].getSubVectorH(2, 0, n1) ; this->m_attrV[dd].getSubVectorH(2, 0, n2) ; this->m_attrV[d].getSubVectorH(2, 0, n1) ; // get normal n1 this->m_attrV[dd].getSubVectorH(2, 0, n2) ; // get normal n2 VEC3 newN = slerp(n1,n2,t) ; // spherical interpolation newN.normalize() ; ... ... @@ -79,9 +82,10 @@ void Approximator_Frame::approximate(Dart d) VEC3 newI = n2 ^ n1 ; // i is perpendicular to newNormal newI.normalize() ; VEC3 newJ = newN ^ newI ; VEC3 newJ = newN ^ newI ; // (i,j,n) is a direct frame newJ.normalize() ; // save into m_approx if (!this->m_approx[d].setSubVectorH(0,0,newI) || !this->m_approx[d].setSubVectorH(1,0,newJ) || !this->m_approx[d].setSubVectorH(2,0,newN) ) ... ... @@ -99,13 +103,16 @@ void Approximator_Frame::approximate(Dart d) template bool Approximator_RGBfunctions::init() { // get actual frames and hypothetical approximated frames m_frame = this->m_map.template getAttribute(VERTEX_ORBIT, "frame") ; m_approxFrame = this->m_map.template getAttribute(EDGE_ORBIT, "approx_frame") ; m_quadricRGBfunctions = new AutoAttributeHandler >(this->m_map, EDGE_ORBIT) ; // create quadric embedding for computing and set them to 0 m_quadricRGBfunctions = new AutoAttributeHandler >(this->m_map, EDGE_ORBIT) ; for (Dart d = this->m_map.begin() ; d != this->m_map.end() ; this->m_map.next(d)) (*m_quadricRGBfunctions)[d].zero() ; // Check on embeddings if (!m_frame.isValid() || !m_approxFrame.isValid() || !m_quadricRGBfunctions->isValid()) { std::cerr << "Approximator_RGBfunctions::init() --> No approxPosition or no quadricRGBfunctions specified" << std::endl ; ... ... @@ -118,13 +125,17 @@ template void Approximator_RGBfunctions::approximate(Dart d) { MAP& m = this->m_map ; Dart dd = m.phi2(d) ; // get some darts Dart dd = m.phi2(d) ; // get the two vertices // get hypothetical local frames VEC3 i,n ; VEC3 n1,n2,i1,i2,j1,j2 ; m_approxFrame[d].getSubVectorH(0,0,i) ; m_approxFrame[d].getSubVectorH(2,0,n) ; // Get previous local frames VEC3 n1,n2,i1,i2,j1,j2 ; m_frame[d].getSubVectorH(0,0,i1) ; m_frame[dd].getSubVectorH(0,0,i2) ; ... ... @@ -134,6 +145,7 @@ void Approximator_RGBfunctions::approximate(Dart d) m_frame[d].getSubVectorH(2,0,n1) ; m_frame[dd].getSubVectorH(2,0,n2) ; // Compute j1' and j2' VEC3 j1pr = n1 ^ i ; j1pr.normalize() ; VEC3 j2pr = n2 ^ i ; ... ... @@ -151,12 +163,22 @@ void Approximator_RGBfunctions::approximate(Dart d) assert (-3.15 < alpha1 && alpha1 <= 3.15) ; assert (-3.15 < alpha2 && alpha2 <= 3.15) ; // Create and sum quadrics (*m_quadricRGBfunctions)[d] += QuadricRGBfunctions(this->m_attrV[d],gamma1, alpha1) ; (*m_quadricRGBfunctions)[d] += QuadricRGBfunctions(this->m_attrV[dd],gamma2, alpha2) ; // New RGBf // Compute new function if (! (*m_quadricRGBfunctions)[d].findOptimizedRGBfunctions(this->m_approx[d])) this->m_approx[d] = this->m_attrV[d]; this->m_approx[d] = this->m_attrV[d]; // if fail take first one // std::cout << "Approx of : " <m_attrV[d] << std::endl ; // std::cout << "Frame2 : " << m_frame[dd] << std::endl ; // std::cout << "Function2 : "<< this->m_attrV[dd] << std::endl ; // std::cout << "is " << std::endl ; // std::cout << "Frame :" << m_approxFrame[d] << std::endl ; // std::cout << "Function : " << this->m_approx[d] << std::endl << std::endl ; } } //namespace Decimation ... ...
 ... ... @@ -408,6 +408,8 @@ void QuadricRGBfunctions::buildRotateMatrix(MATRIX66 &N, REAL gamma) const REAL sinus = sin(gamma), sin2 = sinus*sinus; REAL sincos = sinus*cosinus; // Inverted matrix for left-hand side application N(0,0) = cos2; N(0,1) = sin2; N(0,2) = -sincos; ... ... @@ -448,7 +450,8 @@ void QuadricRGBfunctions::buildRotateMatrix(MATRIX66 &N, REAL gamma) const N(5,2) = REAL(0); N(5,3) = REAL(0); N(5,4) = REAL(0); N(5,5) = 1.0; N(5,5) = REAL(1.0); } template ... ...
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment