34 namespace ModelFitting {
38 template <
typename ImageType>
44 ssize_t image_x = std::get<0>(sample) / pixel_scale + size_x / 2.;
45 ssize_t image_y = std::get<1>(sample) / pixel_scale + size_y / 2.;
46 if (image_x >= 0 && image_x < size_x && image_y >= 0 && image_y < size_y) {
47 Traits::at(image, image_x, image_y) += std::get<2>(sample);
52 template <
typename ImageType>
58 double y_model =
y - (size_y - 1) / 2.;
61 double x_model =
x - (size_x - 1) / 2.;
64 if (!component.
insideSharpRegion(x_model - pixel_scale / 2., y_model - pixel_scale / 2.) ||
65 !component.
insideSharpRegion(x_model - pixel_scale / 2., y_model + pixel_scale / 2.) ||
66 !component.
insideSharpRegion(x_model + pixel_scale / 2., y_model - pixel_scale / 2.) ||
67 !component.
insideSharpRegion(x_model + pixel_scale / 2., y_model + pixel_scale / 2.)) {
76 template<
typename ImageType>
80 if (size_x % 2 == 0 || size_y % 2 == 0) {
82 <<
"but got (" << size_x <<
',' << size_y <<
")";
84 ImageType image = Traits::factory(size_x, size_y);
85 double r_max =
std::sqrt(size_x * size_x + size_y * size_y) / 2.;
86 for (
auto& component : m_component_list) {
87 component->updateRasterizationInfo(pixel_scale, r_max);
88 ImageType comp_image = Traits::factory(size_x, size_y);
91 for (
auto im_it = Traits::begin(image), comp_it = Traits::begin(comp_image);
92 im_it != Traits::end(image); ++im_it, ++comp_it) {
99 template<
typename ImageType>
105 for (
auto& component : component_list) {
107 auto rotated = Euclid::make_unique<RotatedModelComponent>(
std::move(scaled), rotation_angle);
112 template<
typename ImageType>
116 return std::accumulate(m_component_list.begin(), m_component_list.end(), 0.,
118 return a + b->getValue(x, y);
void addSharp(ImageType &image, double pixel_scale, ModelComponent &component)
virtual ImageType getRasterizedImage(double pixel_scale, std::size_t size_x, std::size_t size_y) const
virtual bool insideSharpRegion(double x, double y)=0
virtual std::vector< ModelSample > getSharpSampling()=0
ExtendedModel(std::vector< std::unique_ptr< ModelComponent >> &&component_list, std::shared_ptr< BasicParameter > x_scale, std::shared_ptr< BasicParameter > y_scale, std::shared_ptr< BasicParameter > rotation_angle, double width, double height, std::shared_ptr< BasicParameter > x, std::shared_ptr< BasicParameter > y)
virtual double getValue(double x, double y)=0
std::vector< std::unique_ptr< ModelComponent > > m_component_list
std::unique_ptr< T > make_unique(Args &&...args)
virtual double getValue(double x, double y) const
void addSmooth(ImageType &image, double pixel_scale, ModelComponent &component)