Float SHVector::eval(Float theta, Float phi) const { Float result = 0; Float cosTheta = std::cos(theta); Float *sinPhi = (Float *) alloca(sizeof(Float)*m_bands), *cosPhi = (Float *) alloca(sizeof(Float)*m_bands); for (int m=0; m<m_bands; ++m) { sinPhi[m] = std::sin((m+1) * phi); cosPhi[m] = std::cos((m+1) * phi); } for (int l=0; l<m_bands; ++l) { for (int m=1; m<=l; ++m) { Float L = legendreP(l, m, cosTheta) * normalization(l, m); result += operator()(l, -m) * SQRT_TWO * sinPhi[m-1] * L; result += operator()(l, m) * SQRT_TWO * cosPhi[m-1] * L; } result += operator()(l, 0) * legendreP(l, 0, cosTheta) * normalization(l, 0); } return result; }
Float *SHSampler::legendreIntegrals(Float a, Float b) { Float *P = new Float[m_bands*(m_bands+1)/2]; m_dataSize += m_bands*(m_bands+1)/2; P[I(0, 0)] = b-a; if (m_bands == 1) return P; Float *Pa = new Float[m_bands*(m_bands+1)/2]; Float *Pb = new Float[m_bands*(m_bands+1)/2]; for (int l=0; l<m_bands; ++l) { for (int m=0; m<=l; ++m) { Pa[I(l,m)] = legendreP(l, m, a); Pb[I(l,m)] = legendreP(l, m, b); } } P[I(1,0)] = (b*b - a*a)/2; P[I(1,1)] = .5f * (-b*std::sqrt(1-b*b) - std::asin(b) + a*std::sqrt(1-a*a) + std::asin(a)); for (int l=2; l<m_bands; ++l) { for (int m=0; m<=l-2; ++m) { Float ga = (2*l-1)*(1-a*a) * Pa[I(l-1,m)]; Float gb = (2*l-1)*(1-b*b) * Pb[I(l-1,m)]; P[I(l, m)] = ((l-2)*(l-1+m)*P[I(l-2, m)]-gb+ga)/((l+1)*(l-m)); } P[I(l, l-1)] = (2*l-1)/(Float)(l+1) * ((1-a*a)*Pa[I(l-1, l-1)] - (1-b*b)*Pb[I(l-1, l-1)]); P[I(l, l)] = 1/(Float)(l+1) * (l*(2*l-3)*(2*l-1) * P[I(l-2, l-2)] + b*Pb[I(l,l)] - a*Pa[I(l, l)]); } delete[] Pa; delete[] Pb; return P; }
Float SHVector::eval(const Vector &v) const { Float result = 0; Float cosTheta = v.z, phi = std::atan2(v.y, v.x); if (phi < 0) phi += 2*M_PI; Float *sinPhi = (Float *) alloca(sizeof(Float)*m_bands), *cosPhi = (Float *) alloca(sizeof(Float)*m_bands); for (int m=0; m<m_bands; ++m) { sinPhi[m] = std::sin((m+1) * phi); cosPhi[m] = std::cos((m+1) * phi); } for (int l=0; l<m_bands; ++l) { for (int m=1; m<=l; ++m) { Float L = legendreP(l, m, cosTheta) * normalization(l, m); result += operator()(l, -m) * SQRT_TWO * sinPhi[m-1] * L; result += operator()(l, m) * SQRT_TWO * cosPhi[m-1] * L; } result += operator()(l, 0) * legendreP(l, 0, cosTheta) * normalization(l, 0); } return result; }
int BinlessEmbedComp(struct options_binless *opts, double **warped, int *n_vec, int N, int R, double **embedded) { int idx,q,h; double temp; for(idx=0;idx<N;idx++) for(h=0;h<R;h++) { temp=0; if(opts->rec_tag==0) /* episodic data */ for(q=0;q<n_vec[idx];q++) temp+=legendreP(h,warped[idx][q]); else if(opts->rec_tag==1) /* continuous data */ for(q=0;q<n_vec[idx];q++) temp += warped[idx][q]*legendreP(h,opts->w_start+q*(opts->w_end-opts->w_start)/(n_vec[idx]-1)); embedded[idx][h] = sqrt(2*h+1)*temp; } return EXIT_SUCCESS; }
Float SHVector::evalAzimuthallyInvariant(const Vector &v) const { Float result = 0, cosTheta = v.z; for (int l=0; l<m_bands; ++l) result += operator()(l, 0) * legendreP(l, 0, cosTheta) * normalization(l, 0); return result; }
Float SHVector::evalAzimuthallyInvariant(Float theta, Float phi) const { Float result = 0, cosTheta = std::cos(theta); for (int l=0; l<m_bands; ++l) result += operator()(l, 0) * legendreP(l, 0, cosTheta) * normalization(l, 0); return result; }