SourceXtractorPlusPlus 1.0.3
SourceXtractor++, the next generation SExtractor
Loading...
Searching...
No Matches
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
28namespace 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
58
59double 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
67void 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}
void updateRasterizationInfo(double scale, double r_max) override
bool insideSharpRegion(double x, double y) override
double getValue(double x, double y) override
std::unique_ptr< ModelComponent > m_component
std::vector< ModelSample > getSharpSampling() override
TransformModelComponent(std::unique_ptr< ModelComponent > component, std::tuple< double, double, double, double > transform)
T fabs(T... args)
T min(T... args)
T move(T... args)
STL namespace.
T sqrt(T... args)
T transform(T... args)