Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}
Exemple #4
0
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;
}
Exemple #5
0
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;
}
Exemple #6
0
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;
}