// octreeFace.cpp: implementation of the octreeFace class. // ////////////////////////////////////////////////////////////////////// #include "octreeFace.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// octreeFace::octreeFace() { } octreeFace::~octreeFace() { } float octreeFace::evaluateFace(float x, float y){ float ret = m_c[0]*x*x*y*y + m_c[1]*x*x*y+ m_c[2]*x*y*y + m_c[3]*x*y+ m_c[4]*x*x+ m_c[5]*y*y+ m_c[6]*x+ m_c[7]*y + m_c[8]; return ret; } void octreeFace::computeABCFromSamples(float d0, float d1, float d2, float d3, float d4, float d5, float d6, float d7, float d8)//compute a,b and c from sample points on the edge { m_c[0]= 4*d0 - 8*d3 + 4*d6 - 8*d1 + 4*d2 - 8*d5 + 16*d4 - 8*d7 + 4*d8; m_c[1]= -6*d0 + 8*d3 - 2*d6 + 12*d1 - 6*d2 + 8*d5 - 16*d4 + 4*d7 - 2*d8; m_c[2]= -6*d0 + 12*d3 - 6*d6 + 8*d1 - 2*d2 + 4*d5 - 16*d4 + 8*d7 - 2*d8; m_c[3]= 9*d0 - 12*d3 + 3*d6 - 12*d1 + 3*d2 - 4*d5 + 16*d4 - 4*d7 + d8; m_c[4]= 2*d0 - 4*d1 + 2*d2; m_c[5]= 2*d0 - 4*d3 + 2*d6; m_c[6]= -3*d0 + 4*d1 - d2; m_c[7]= -3*d0 + 4*d3 - d6; m_c[8]= d0; } void octreeFace::decompose(int quadrant, octreeFace& bigFace, octreeFace& smallFace){ float a[9]; a[0] = bigFace.getC(0); a[1] = bigFace.getC(1); a[2] = bigFace.getC(2); a[3] = bigFace.getC(3); a[4] = bigFace.getC(4); a[5] = bigFace.getC(5); a[6] = bigFace.getC(6); a[7] = bigFace.getC(7); a[8] = bigFace.getC(8); switch(quadrant){ case 0: //LD quadrant smallFace.setC(0,a[0]/16.0); smallFace.setC(1,a[1]/8.0); smallFace.setC(2,a[2]/8.0); smallFace.setC(3,a[3]/4.0); smallFace.setC(4,a[4]/4.0); smallFace.setC(5,a[5]/4.0); smallFace.setC(6,a[6]/2.0); smallFace.setC(7,a[7]/2.0); smallFace.setC(8,a[8]); break; case 1: //RD quadrant smallFace.setC(0, a[0]/16.0); smallFace.setC(1, a[1]/8.0); smallFace.setC(2, a[0]/8.0 + a[2]/8.0); smallFace.setC(3, a[1]/4.0 + a[3]/4.0); smallFace.setC(4, a[4]/4.0 ); smallFace.setC(5, a[5]/4.0 + a[2]/8.0 + a[0]/16.0); smallFace.setC(6, a[4]/2.0 + a[6]/2.0); smallFace.setC(7, a[7]/2.0 + a[3]/4.0 + a[1]/8.0); smallFace.setC(8, a[4]/4.0 + a[6]/2.0 + a[8]); break; case 2: //LU quadrant smallFace.setC(0, a[0]/16.0); smallFace.setC(1, a[0]/8.0 + a[1]/8.0); smallFace.setC(2, a[2]/8.0); smallFace.setC(3, a[2]/4.0 + a[3]/4.0); smallFace.setC(4, a[4]/4.0 + a[1]/8.0 + a[0]/16.0); smallFace.setC(5, a[5]/4.0); smallFace.setC(6, a[6]/2.0 + a[3]/4.0 + a[2]/8.0); smallFace.setC(7, a[5]/2.0 + a[7]/2.0); smallFace.setC(8, a[5]/4.0 + a[7]/2.0 + a[8]); break; case 3: //RU quadrant smallFace.setC(0, a[0]/16.0); smallFace.setC(1, a[0]/8.0 + a[1]/8.0); smallFace.setC(2, a[0]/8.0 + a[2]/8.0); smallFace.setC(3, a[0]/4.0 + a[1]/4.0 + a[2]/4.0 + a[3]/4.0 ); smallFace.setC(4, (a[0] + 2*a[1] +4*a[4])/16.0); smallFace.setC(5, (a[0] + 2*a[2] +4*a[5])/16.0); smallFace.setC(6,(a[0] +2*a[1] + a[2]+ 2*a[3] + 4*a[4] +4*a[6])/8.0); smallFace.setC(7,(a[0] +a[1] +2*a[2]+ 2*a[3] + 4*a[5] +4*a[7])/8.0); smallFace.setC(8,(a[0]+2*a[1] +2*a[2]+4*a[3]+4*a[4]+4*a[5]+8*a[6]+8*a[7]+16*a[8])/16.0); break; default: break; } }