28 namespace ModelFitting {
30 template <
typename Profile>
31 template <
typename... ProfileParameters>
34 ProfileParameters&&... proj_parameters)
35 : m_sharp_manager{
std::move(sharp_manager)},
36 m_profile(std::forward<ProfileParameters>(proj_parameters)...) {
39 template <
typename Profile>
42 template <
typename Profile>
47 template <
typename Profile>
49 double scale,
double r_max) {
50 m_sharp_manager->updateRasterizationInfo(scale, r_max,
std::ref(m_profile));
53 template <
typename Profile>
58 for (
double r2=0.; m_sharp_manager->insideSharpRegion(r2); r1=r2) {
60 std::tie(r2, angle_no) = m_sharp_manager->nextRadiusAndAngleNo(r1);
61 double r_half = (r1 + r2) / 2.;
62 double area = M_PI * (r2*r2 - r1*r1);
63 double integral = m_profile(r_half) * area / angle_no;
64 double angle_step = 2 * M_PI / angle_no;
65 for (
double angle=0.; angle_no!=0; --angle_no, angle+=angle_step) {
68 result.emplace_back(x, y, integral);
74 template <
typename Profile>
76 return m_sharp_manager->insideSharpRegion(
std::sqrt(x*x + y*y));
virtual void updateRasterizationInfo(double scale, double r_max)
virtual double getValue(double x, double y)
std::shared_ptr< DependentParameter< std::shared_ptr< EngineParameter > > > x
virtual bool insideSharpRegion(double x, double y)
std::shared_ptr< DependentParameter< std::shared_ptr< EngineParameter > > > y
virtual ~CircularlySymmetricModelComponent()
virtual std::vector< ModelSample > getSharpSampling()
CircularlySymmetricModelComponent(std::unique_ptr< SharpRegionManager > sharp_manager, ProfileParameters &&...proj_parameters)