74 {
75 static const double pow_25_to_7 = pow(25, 7);
76
77 const double C1 = sqrt(lab1.
a * lab1.
a + lab1.
b * lab1.
b);
78 const double C2 = sqrt(lab2.
a * lab2.
a + lab2.
b * lab2.
b);
79 const double CMean = (C1 + C2) / 2.0;
80 const double pow_CMean_to_7 = pow(CMean, 7);
81 const double G = 0.5 * (1 - sqrt(pow_CMean_to_7 / (pow_CMean_to_7 + pow_25_to_7)));
82
83 const double p_l1 = lab1.
l;
84 const double p_l2 = lab2.
l;
85 const double p_a1 = (1. + G) * lab1.
a;
86 const double p_a2 = (1. + G) * lab2.
a;
87 const double p_b1 = lab1.
b;
88 const double p_b2 = lab2.
b;
89 const double p_c1 = sqrt(p_a1 * p_a1 + p_b1 * p_b1);
90 const double p_c2 = sqrt(p_a2 * p_a2 + p_b2 * p_b2);
91 double p_h1;
92 if (p_a1 == 0 && p_b1 == 0)
93 p_h1 = 0;
94 else {
95 p_h1 = atan2(p_b1, p_a1);
96 if (p_h1 < 0)
98 }
99 double p_h2;
100 if (p_a2 == 0 && p_b2 == 0)
101 p_h2 = 0;
102 else {
103 p_h2 = atan2(p_b2, p_a2);
104 if (p_h2 < 0)
106 }
107
108 const double delta_L = p_l2 - p_l1;
109 const double delta_C = p_c2 - p_c1;
110
111 double delta_H;
112 const double p_c_multi = p_c1 * p_c2;
113 if (p_c_multi == 0)
114 delta_H = 0;
115 else {
116 delta_H = p_h2 - p_h1;
119 else if (delta_H >
M_PI)
121 delta_H = 2 * sqrt(p_c_multi) * sin(delta_H / 2.);
122 }
123
124
125 double p_L_mean = (p_l1 + p_l2) / 2.0;
126 double p_C_mean = (p_c1 + p_c2) / 2.0;
127
128 double p_H_mean, p_H_sum = p_h1 + p_h2;
129 if (p_c1 * p_c2 == 0) {
130 p_H_mean = p_H_sum;
131 }
132 else {
133 if (fabs(p_h1 - p_h2) <=
M_PI)
134 p_H_mean = p_H_sum / 2;
135 else {
136 if (p_H_sum < 2 *
M_PI)
137 p_H_mean = (p_H_sum + 2 *
M_PI) / 2.0;
138 else
139 p_H_mean = (p_H_sum - 2 *
M_PI) / 2.0;
140 }
141 }
142
143 const double T = 1 - 0.17 * cos(p_H_mean -
deg_to_rad(30)) + 0.24 * cos(2 * p_H_mean) + 0.32 * cos(3 * p_H_mean +
deg_to_rad(6)) - 0.2 * cos(4 * p_H_mean -
deg_to_rad(63));
145
146 const double pow_p_cmean_to_7 = pow(p_C_mean, 7);
147 const double R_C = 2 * sqrt(pow_p_cmean_to_7 / (pow_p_cmean_to_7 + pow_25_to_7));
148
149 const double pow_p_lmean_to_2 = pow(p_L_mean - 50, 2);
150 const double S_L = 1 + (0.015 * pow_p_lmean_to_2) / sqrt(20 + pow_p_lmean_to_2);
151 const double S_C = 1 + 0.045 * p_C_mean;
152 const double S_H = 1 + 0.015 * p_C_mean * T;
153 const double R_T = -sin(2 * dtheta) * R_C;
154
155 const double K_L = 1.0, K_C = 1.0, K_H = 1.0;
156
157 double de = sqrt(
158 pow(delta_L / (K_L * S_L), 2) + pow(delta_C / (K_C * S_C), 2) + pow(delta_H / (K_H * S_H), 2) + (R_T * (delta_C / (K_C * S_C)) * (delta_H / (K_H * S_H)))
159 );
160 return de;
161 }
#define M_PI
Definition ExtrusionSimulator.cpp:31
static double deg_to_rad(double deg)
Definition FlushVolPredictor.cpp:24
double b
Definition FlushVolPredictor.hpp:24
double a
Definition FlushVolPredictor.hpp:23
double l
Definition FlushVolPredictor.hpp:22