diff --git a/Core/Algorithms/inc/FTDistributions.h b/Core/Algorithms/inc/FTDistributions.h index 6a8bf3a811be906bc2dc05723e81eced93830308..f1b901fc5faf7ade03849742072caea6c6bd90dd 100644 --- a/Core/Algorithms/inc/FTDistributions.h +++ b/Core/Algorithms/inc/FTDistributions.h @@ -148,7 +148,7 @@ public: virtual double evaluate(double qx, double qy) const; private: - double BesselJ0(double value) const; + double BesselJ0(double value, void *params) const; }; #endif /* FTDISTRIBUTIONS_H_ */ diff --git a/Core/Algorithms/src/FTDistributions.cpp b/Core/Algorithms/src/FTDistributions.cpp index 8ad5fc276274fa59f62efa631788f6b0753e0058..a4c6194010a58055ccd54f4aa37e696018824c27 100644 --- a/Core/Algorithms/src/FTDistributions.cpp +++ b/Core/Algorithms/src/FTDistributions.cpp @@ -15,6 +15,7 @@ #include "FTDistributions.h" #include "MathFunctions.h" +#include "MemberFunctionIntegrator.h" void IFTDistribution2D::transformToStarBasis(double qX, double qY, double alpha, double a, double b, double& qa, double& qb) const @@ -152,11 +153,20 @@ double FTDistribution2DCone::evaluate(double qx, double qy) const { double scaled_q = std::sqrt(qx*qx*m_coherence_length_x*m_coherence_length_x + qy*qy*m_coherence_length_y*m_coherence_length_y); - - return 0.0; + if (scaled_q<Numeric::double_epsilon) { + return 1.0/6.0 - scaled_q*scaled_q/80.0; + } + MemberFunctionIntegrator<FTDistribution2DCone>::mem_function + p_member_function = &FTDistribution2DCone::BesselJ0; + MemberFunctionIntegrator<FTDistribution2DCone> + integrator(p_member_function, this); + double integral = integrator.integrate(0.0, scaled_q, (void*)0); + return (integral/scaled_q - MathFunctions::Bessel_J0(scaled_q) ) + /scaled_q/scaled_q; } -double FTDistribution2DCone::BesselJ0(double value) const +double FTDistribution2DCone::BesselJ0(double value, void *params) const { + (void)params; return MathFunctions::Bessel_J0(value); }