19 inline T square(
const T
value)
25 inline T
clamp(
const T min,
const T
value,
const T max)
28 if (
value > max)
return max;
34 double mTot(
const double m,
const double d,
const double rm,
const double R,
const double del)
36 const double m2 = square(
m);
37 const double m3 = m2 *
m;
38 const double m5 = m3 * m2;
39 const double d2 = square(d);
40 const double d3 = d2 *
d;
41 const double rm2 = square(rm);
42 const double rm4 = square(rm2);
43 const double R2 = square(R);
44 const double R3 = R2 * R;
45 const double R4 = R3 * R;
46 const double del2 = square(del);
47 const double del3 = del2 *
del;
48 const double del4 = del3 *
del;
49 const double m2p1 = m2 + 1.0;
50 const double m2p12 = square(m2p1);
51 const double m2p13 = m2p12 * m2p1;
52 const double Rddel = R +
d -
del;
53 const double Rddel2 = square(Rddel);
54 const double Rddelrm = Rddel + rm;
55 const double para1 = R * rm - 2.0 * R *
del - 2.0 *
d *
del +
d * rm - 2.0 *
del * rm + 2.0 * del2 + 4.0 * R2 * m2 + 2.0 * del2 * m2 +
d * m2 * rm - 2.0 *
del * m2 * rm + 4.0 * R *
d * m2 - 6.0 * R *
del * m2 + 3.0 * R * m2 * rm - 2.0 *
d *
del * m2;
56 const double para2 = (8 * R * del3 + 8.0 *
d * del3 - 4.0 * del4 - 4.0 * R2 * del2 - 16.0 * R4 * m2 + R2 * rm2 - 4.0 * d2 * del2 - 4.0 * del4 * m2 + d2 * rm2 + 4.0 * del2 * rm2 - 32.0 * R3 *
d * m2 + 24 * R * del3 * m2 + 48.0 * R3 *
del * m2 + 8.0 *
d * del3 * m2 - 16.0 * R2 * d2 * m2 - 52.0 * R2 * del2 * m2 + 9.0 * R2 * m2 * rm2 - 4.0 * d2 * del2 * m2 + d2 * m2 * rm2 + 4.0 * del2 * m2 * rm2 - 8.0 * R *
d * del2 + 2.0 * R *
d * rm2 - 4.0 * R *
del * rm2 - 4.0 *
d *
del * rm2 - 40 * R *
d * del2 * m2 + 16 * R * d2 *
del * m2 + 64.0 * R2 *
d *
del * m2 + 6.0 * R *
d * m2 * rm2 - 12.0 * R *
del * m2 * rm2 - 4.0 *
d *
del * m2 * rm2);
57 const double para3 = 2.0 * R *
d - 2.0 * R *
del - 2.0 *
d *
del + R2 + d2 - 3.0 * R2 * m2 + d2 * m2 + 2.0 * R *
d * m2 + 2.0 * R *
del * m2 - 2.0 *
d *
del * m2;
58 const double para4 = 18.0 * R4 *
m * rm2 - 36.0 * R4 * m3 * rm2 - 54.0 * R4 * m5 * rm2 + 54.0 * R2 * d2 *
m * rm2 + 36 * R * d3 * m3 * rm2 + 36.0 * R3 *
d * m3 * rm2 + 18 * R * d3 * m5 * rm2 - 18.0 * R3 *
d * m5 * rm2 + 36.0 * R2 * del2 *
m * rm2 + 36.0 * R3 *
del * m3 * rm2 + 90.0 * R3 *
del * m5 * rm2 + 108.0 * R2 * d2 * m3 * rm2 + 54.0 * R2 * d2 * m5 * rm2 - 36.0 * R2 * del2 * m5 * rm2 + 18 * R * d3 *
m * rm2 + 54.0 * R3 *
d *
m * rm2 - 54.0 * R3 *
del *
m * rm2 + 36 * R *
d * del2 *
m * rm2 - 54 * R * d2 *
del *
m * rm2 - 108.0 * R2 *
d *
del *
m * rm2 + 72 * R *
d * del2 * m3 * rm2 - 108.0 * R * d2 *
del * m3 * rm2 - 144.0 * R2 *
d *
del * m3 * rm2 + 36.0 * R *
d * del2 * m5 * rm2 - 54 * R * d2 *
del * m5 * rm2 - 36.0 * R2 *
d *
del * m5 * rm2;
59 const std::complex<double> para10 = (m2p13 * std::pow(para2, 3) + 108.0 * R2 * m2 * rm4 * m2p12 * Rddel2 * square(para3));
60 const std::complex<double> para11 = std::sqrt(para10);
61 const std::complex<double> para5 = std::pow((1.7320508075688 * para11 + para4), (1.0 / 3.0));
62 const std::complex<double> para6 = 4330209751607469.0 * para5;
63 const double para7 = 2.49809726143892e16 * m2p1 * para2;
64 const double para8 = 9007199254740992 * R *
m * Rddelrm;
65 const std::complex<double> para9 = 36028797018963968 * R *
m * Rddelrm * para5;
66 const std::complex<double> ret = std::pow(((6.0 * Rddel) / Rddelrm - (2.0 * Rddel) / Rddelrm + std::pow(para1, 2) / (4.0 * R2 * m2 * std::pow(Rddelrm, 2)) + para6 / para8 - para7 / para9), 0.5) * 0.5 - std::pow(((2.0 * Rddel) / Rddelrm - ((2.0 * (2.0 * R * del + R * rm + 2.0 * d * del + d * rm - 2.0 * del * rm - 2.0 * del2 - 4.0 * R2 * m2 - 2.0 * del2 * m2 + d * m2 * rm - 2.0 * del * m2 * rm - 4.0 * R * d * m2 + 6.0 * R * del * m2 + 3.0 * R * m2 * rm + 2.0 * d * del * m2)) / (R *
m * Rddelrm) + std::pow(para1, 3.0) / (4.0 * R3 * m3 * std::pow(Rddelrm, 3)) + (6.0 * (Rddel)*para1) / (R *
m * std::pow(Rddelrm, 2))) / std::pow(((6.0 * Rddel) / Rddelrm - (2.0 * Rddel) / Rddelrm + std::pow(para1, 2.0) / (4.0 * R2 * m2 * std::pow(Rddelrm, 2.0)) + para6 / para8 - para7 / para9), 0.5) + (6.0 * Rddel) / Rddelrm + std::pow(para1, 2.0) / (2.0 * R2 * m2 * std::pow(Rddelrm, 2)) - para6 / para8 + para7 / para9), 0.5) * 0.5 - para1 / (4 * R *
m * Rddelrm);
72 double d = static_params.
h + sqrt(square(static_params.
R) - square(static_params.
r_o));
73 double del = static_params.
R - sqrt(square(static_params.
R) - square(static_params.
r_m));
74 double x = mTot(tan(
params.theta / 2.0), d, static_params.
r_m, static_params.
R, del);
75 double phi = 2.0 * atan(
x);
76 phi = atan(sin(phi) / (((static_params.
R - del) + d) / static_params.
r_m - cos(phi)));
77 const double l1 = static_params.
L * tan(static_params.
epsilon - phi);
78 const double l2 = static_params.
L * tan(static_params.
epsilon + phi);
80 del = (-l1 + l2) / 2.0;
81 phi =
del * sin(static_params.
epsilon) / cos(phi);
82 phi = sqrt(square(del) - square(phi));
83 x = cos(
params.psi - M_PI / 2.0);
84 d = sin(
params.psi - M_PI / 2.0);
85 phi = sqrt(1.0 / (square(
x) / square(del) + square(d) / square(phi)));
88 (-l1 - l2) / 2.0 + phi * cos(
params.psi - M_PI / 2.0),
89 phi * sin(
params.psi - M_PI / 2.0)
130 .L = 8.4476252817457738,
131 .epsilon = 0.059068559067049511,
173 const double x = 40.0 / 3.0;
174 const double y = 7.5;
175 const double s = 10.8 / 7.5;
181 return sphere2Plane(static_params, p1_params);
186 return sphere2Plane(static_params, p2_params);
189 const auto p = sphere2Plane(static_params,
coord);
190 Vector2<double> a(-159.78000000000009 / (p1.x - p2.x), -248.13 / (p1.y - p2.y));
201 float *
const lookup_table =
new float[lookup_table_size];
202 for (std::size_t i = 0; i < lookup_table_size; ++i)
206 const double theta_range = max.
theta -
min.theta;
207 const double psi_range = max.
psi -
min.psi;
209 const auto generate_range = [&](
const std::size_t begin_y,
const std::size_t end_y) {
210 for (std::size_t
y = begin_y;
y < end_y; ++
y)
212 for (std::size_t
x = 0;
x <
size.x; ++
x)
214 const double frac_x =
static_cast<double>(
x) /
size.x;
215 const double frac_y =
static_cast<double>(
y) /
size.y;
218 min.theta + frac_y * theta_range,
219 min.psi + frac_x * psi_range
222 const std::size_t t_x = t.x;
223 const std::size_t t_y = t.y;
228 if ((tx != t_x || ty != t_y))
235 lookup_table[
index + 0] = frac_x;
236 lookup_table[
index + 1] = frac_y;
239 lookup_table[
index + 2] = 1.0;
244 const std::uint32_t num_threads = std::thread::hardware_concurrency();
246 std::vector<std::thread> threads;
248 for (std::uint32_t i = 0; i < num_threads; ++i)
250 const std::size_t begin_y = (
size.y / num_threads) * i;
251 const std::size_t end_y = std::min((
size.y / num_threads) * (i + 1),
size.y);
252 threads.emplace_back(std::bind(generate_range, begin_y, end_y));
255 for (
auto &thread : threads) {