SourceXtractorPlusPlus  0.14
Please provide a description of the project.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
TransformModelComponent.cpp
Go to the documentation of this file.
1 
17 /*
18  * TransformModelComponent.cpp
19  *
20  * Created on: Jun 22, 2018
21  * Author: mschefer
22  */
23 
24 #include <cmath>
25 #include <assert.h>
27 
28 namespace ModelFitting {
29 
32  : m_component(std::move(component)) {
33 
34  m_transform[0] = std::get<0>(transform);
35  m_transform[1] = std::get<1>(transform);
36  m_transform[2] = std::get<2>(transform);
37  m_transform[3] = std::get<3>(transform);
38 
39  double inv_det = 1. / (m_transform[0] * m_transform[3] - m_transform[2] * m_transform[1]);
40  m_inv_transform[0] = m_transform[3] * inv_det; m_inv_transform[1] = -m_transform[1] * inv_det;
41  m_inv_transform[2] = -m_transform[2] * inv_det; m_inv_transform[3] = m_transform[0] * inv_det;
42 
43  assert(m_transform[0] * m_inv_transform[0] + m_transform[1] * m_inv_transform[2] >= 1 - 1e-8);
44  assert(m_transform[0] * m_inv_transform[1] + m_transform[1] * m_inv_transform[3] <= 1e-8);
45  assert(m_transform[2] * m_inv_transform[0] + m_transform[3] * m_inv_transform[2] <= 1e-8);
46  assert(m_transform[2] * m_inv_transform[1] + m_transform[3] * m_inv_transform[3] >= 1 - 1e-8);
47 }
48 
50  for (int i = 0; i < 4; i++) {
51  m_transform[i] = other.m_transform[i];
52  m_inv_transform[i] = other.m_inv_transform[i];
53  }
54 }
55 
57 }
58 
59 double TransformModelComponent::getValue(double x, double y) {
60  auto area_correction = fabs(m_transform[0] * m_transform[3] - m_transform[1] * m_transform[2]);
61 
62  double new_x = x * m_inv_transform[0] + y * m_inv_transform[2];
63  double new_y = x * m_inv_transform[1] + y * m_inv_transform[3];
64  return m_component->getValue(new_x, new_y) / area_correction;
65 }
66 
67 void TransformModelComponent::updateRasterizationInfo(double scale, double r_max) {
68  double x_scale = std::sqrt(m_transform[0] * m_transform[0] + m_transform[1] * m_transform[1]);
69  double y_scale = std::sqrt(m_transform[2] * m_transform[2] + m_transform[3] * m_transform[3]);
70  double new_scale = scale / std::min(x_scale, y_scale);
71  double new_r_max = r_max / std::min(x_scale, y_scale);
72  m_component->updateRasterizationInfo(new_scale, new_r_max);
73 }
74 
76  std::vector<ModelSample> result = m_component->getSharpSampling();
77  for (auto& sample : result) {
78  double new_x = std::get<0>(sample) * m_transform[0] + std::get<1>(sample) * m_transform[2];
79  double new_y = std::get<0>(sample) * m_transform[1] + std::get<1>(sample) * m_transform[3];
80  std::get<0>(sample) = new_x;
81  std::get<1>(sample) = new_y;
82  }
83  return result;
84 }
85 
87  double new_x = x * m_inv_transform[0] + y * m_inv_transform[2];
88  double new_y = x * m_inv_transform[1] + y * m_inv_transform[3];
89  return m_component->insideSharpRegion(new_x, new_y);
90 }
91 
92 }
constexpr double e
TransformModelComponent(std::unique_ptr< ModelComponent > component, std::tuple< double, double, double, double > transform)
T min(T...args)
void updateRasterizationInfo(double scale, double r_max) override
std::unique_ptr< ModelComponent > m_component
T fabs(T...args)
T move(T...args)
STL class.
STL class.
T sqrt(T...args)
double getValue(double x, double y) override
std::vector< ModelSample > getSharpSampling() override
bool insideSharpRegion(double x, double y) override
std::pair< double, double > transform(int x, int y, const std::array< double, 4 > &t)