32 void DeterminantRadius::assignFromQuadrupole(
double ixx,
double iyy,
double ixy, Distortion& distortion) {
33 _value =
std::pow(ixx * iyy - ixy * ixy, 0.25);
34 distortion.setE1((ixx - iyy) / (ixx + iyy));
35 distortion.setE2(2.0 * ixy / (ixx + iyy));
38 BaseCore::Jacobian DeterminantRadius::dAssignFromQuadrupole(
double ixx,
double iyy,
double ixy,
39 Distortion& distortion) {
40 double xx_yy = ixx + iyy;
42 _value =
std::pow(ixx * iyy - ixy * ixy, 0.25);
43 distortion.setE1((ixx - iyy) / xx_yy);
44 distortion.setE2(2.0 * ixy / xx_yy);
45 result.block<2, 2>(0, 0).setConstant(2.0 / (xx_yy * xx_yy));
50 result(1, 2) = 2.0 / xx_yy;
51 result.row(2).setConstant(1.0 / (4.0 * _value * _value * _value));
54 result(2, 2) *= -2.0 * ixy;
58 void DeterminantRadius::assignToQuadrupole(Distortion
const& distortion,
double& ixx,
double& iyy,
61 double r2 = _value * _value;
62 ixx = r2 * (1.0 + distortion.getE1()) / den;
63 iyy = r2 * (1.0 - distortion.getE1()) / den;
64 ixy = r2 * distortion.getE2() / den;
67 BaseCore::Jacobian DeterminantRadius::dAssignToQuadrupole(Distortion
const& distortion,
double& ixx,
68 double& iyy,
double& ixy)
const {
71 result.col(2).setConstant(2.0 * _value / den);
72 double r2 = _value * _value;
73 ixx = r2 * (1.0 + distortion.getE1()) / den;
74 iyy = r2 * (1.0 - distortion.getE1()) / den;
75 ixy = r2 * distortion.getE2() / den;
76 result.block<3, 2>(0, 0).setConstant(r2 / (den * den * den));
77 result(0, 0) *= (distortion.getE1() + 1.0 - distortion.getE2() * distortion.getE2());
78 result(1, 0) *= (distortion.getE1() - 1.0 + distortion.getE2() * distortion.getE2());
79 result(2, 0) *= distortion.getE1() * distortion.getE2();
80 result(0, 1) *= distortion.getE2() * (1.0 + distortion.getE1());
81 result(1, 1) *= distortion.getE2() * (1.0 - distortion.getE1());
82 result(2, 1) *= (1.0 - distortion.getE1() * distortion.getE1());
83 result(0, 2) *= (1.0 + distortion.getE1());
84 result(1, 2) *= (1.0 - distortion.getE1());
85 result(2, 2) *= distortion.getE2();
89 void TraceRadius::assignFromQuadrupole(
double ixx,
double iyy,
double ixy, Distortion& distortion) {
91 distortion.setE1((ixx - iyy) / (ixx + iyy));
92 distortion.setE2(2.0 * ixy / (ixx + iyy));
95 BaseCore::Jacobian TraceRadius::dAssignFromQuadrupole(
double ixx,
double iyy,
double ixy,
96 Distortion& distortion) {
97 double xx_yy = ixx + iyy;
100 distortion.setE1((ixx - iyy) / xx_yy);
101 distortion.setE2(2.0 * ixy / xx_yy);
102 result.block<2, 2>(0, 0).setConstant(2.0 / (xx_yy * xx_yy));
107 result(1, 2) = 2.0 / xx_yy;
108 result(2, 0) = 0.25 / _value;
109 result(2, 1) = 0.25 / _value;
113 void TraceRadius::assignToQuadrupole(Distortion
const& distortion,
double& ixx,
double& iyy,
115 double r2 = _value * _value;
116 ixx = r2 * (1.0 + distortion.getE1());
117 iyy = r2 * (1.0 - distortion.getE1());
118 ixy = r2 * distortion.getE2();
121 BaseCore::Jacobian TraceRadius::dAssignToQuadrupole(Distortion
const& distortion,
double& ixx,
double& iyy,
124 result.col(2).setConstant(2.0 * _value);
125 result(0, 2) *= (1.0 + distortion.getE1());
126 result(1, 2) *= (1.0 - distortion.getE1());
127 result(2, 2) *= distortion.getE2();
128 double r2 = _value * _value;
129 ixx = r2 * (1.0 + distortion.getE1());
130 iyy = r2 * (1.0 - distortion.getE1());
131 ixy = r2 * distortion.getE2();
138 void LogDeterminantRadius::assignFromQuadrupole(
double ixx,
double iyy,
double ixy, Distortion& distortion) {
139 _value = 0.25 *
std::log(ixx * iyy - ixy * ixy);
140 distortion.setE1((ixx - iyy) / (ixx + iyy));
141 distortion.setE2(2.0 * ixy / (ixx + iyy));
144 BaseCore::Jacobian LogDeterminantRadius::dAssignFromQuadrupole(
double ixx,
double iyy,
double ixy,
145 Distortion& distortion) {
146 double xx_yy = ixx + iyy;
148 double det = ixx * iyy - ixy * ixy;
150 distortion.setE1((ixx - iyy) / xx_yy);
151 distortion.setE2(2.0 * ixy / xx_yy);
152 result.block<2, 2>(0, 0).setConstant(2.0 / (xx_yy * xx_yy));
157 result(1, 2) = 2.0 / xx_yy;
164 void LogDeterminantRadius::assignToQuadrupole(Distortion
const& distortion,
double& ixx,
double& iyy,
168 ixx = r2 * (1.0 + distortion.getE1()) / den;
169 iyy = r2 * (1.0 - distortion.getE1()) / den;
170 ixy = r2 * distortion.getE2() / den;
173 BaseCore::Jacobian LogDeterminantRadius::dAssignToQuadrupole(Distortion
const& distortion,
double& ixx,
174 double& iyy,
double& ixy)
const {
177 result.col(2).setConstant(2.0 * _value / den);
179 ixx = r2 * (1.0 + distortion.getE1()) / den;
180 iyy = r2 * (1.0 - distortion.getE1()) / den;
181 ixy = r2 * distortion.getE2() / den;
182 result.block<3, 2>(0, 0).setConstant(r2 / (den * den * den));
183 result(0, 0) *= distortion.getE1() + 1.0 - distortion.getE2() * distortion.getE2();
184 result(1, 0) *= distortion.getE1() - 1.0 + distortion.getE2() * distortion.getE2();
185 result(2, 0) *= distortion.getE1() * distortion.getE2();
186 result(0, 1) *= distortion.getE2() * (1.0 + distortion.getE1());
187 result(1, 1) *= distortion.getE2() * (1.0 - distortion.getE1());
188 result(2, 1) *= 1.0 - distortion.getE1() * distortion.getE1();
195 void LogTraceRadius::assignFromQuadrupole(
double ixx,
double iyy,
double ixy, Distortion& distortion) {
196 _value = 0.5 *
std::log(0.5 * (ixx + iyy));
197 distortion.setE1((ixx - iyy) / (ixx + iyy));
198 distortion.setE2(2.0 * ixy / (ixx + iyy));
201 BaseCore::Jacobian LogTraceRadius::dAssignFromQuadrupole(
double ixx,
double iyy,
double ixy,
202 Distortion& distortion) {
203 double xx_yy = ixx + iyy;
205 _value = 0.5 *
std::log(0.5 * xx_yy);
206 distortion.setE1((ixx - iyy) / xx_yy);
207 distortion.setE2(2.0 * ixy / xx_yy);
208 result.block<2, 2>(0, 0).setConstant(2.0 / (xx_yy * xx_yy));
213 result(1, 2) = 2.0 / xx_yy;
214 result(2, 0) = 0.5 / xx_yy;
215 result(2, 1) = 0.5 / xx_yy;
219 void LogTraceRadius::assignToQuadrupole(Distortion
const& distortion,
double& ixx,
double& iyy,
222 ixx = r2 * (1.0 + distortion.getE1());
223 iyy = r2 * (1.0 - distortion.getE1());
224 ixy = r2 * distortion.getE2();
227 BaseCore::Jacobian LogTraceRadius::dAssignToQuadrupole(Distortion
const& distortion,
double& ixx,
double& iyy,
231 ixx = r2 * (1.0 + distortion.getE1());
232 iyy = r2 * (1.0 - distortion.getE1());
233 ixy = r2 * distortion.getE2();
Eigen::Matrix3d Jacobian
Parameter Jacobian matrix type.
A base class for image defects.