strafelib
strafelib.hpp
Go to the documentation of this file.
1 
3 #include <cmath>
4 
6 constexpr const double JUMP_SPEED = 268.3281572999748;
7 
10 template<int N>
11 inline double dot_product(const double *__restrict a, const double *__restrict b)
12 {
13  double res = 0;
14  for (int i = 0; i < N; ++i) {
15  res += a[i] * b[i];
16  }
17  return res;
18 }
19 
29 double fric_speed(double speed, double E, double tau_k)
30 {
31  if (speed >= E) {
32  return speed * (1 - tau_k);
33  }
34 
35  const double tau_E_k = tau_k * E;
36  if (speed >= tau_E_k && speed >= 0.1) {
37  return speed - tau_E_k;
38  }
39 
40  return 0;
41 }
42 
50 void fric_vel(double *__restrict vel, double speed, double E, double tau_k)
51 {
52  if (speed >= E) {
53  const double tmp = 1 - tau_k;
54  vel[0] *= tmp;
55  vel[1] *= tmp;
56  return;
57  }
58 
59  const double tau_E_k = tau_k * E;
60  if (speed >= tau_E_k && speed >= 0.1) {
61  const double tmp = tau_E_k / speed;
62  vel[0] -= vel[0] * tmp;
63  vel[1] -= vel[1] * tmp;
64  return;
65  }
66 
67  vel[0] = 0;
68  vel[1] = 0;
69 }
70 
80 double fric_speedsq(double speedsq, double E, double tau_k)
81 {
82  if (speedsq >= E * E) {
83  const double tmp = 1 - tau_k;
84  return speedsq * tmp * tmp;
85  }
86 
87  const double tau_E_k = tau_k * E;
88  const double tau_E_k_sq = tau_E_k * tau_E_k;
89  if (speedsq >= tau_E_k_sq && speedsq >= 0.01) {
90  return speedsq - 2 * std::sqrt(speedsq) * tau_E_k + tau_E_k_sq;
91  }
92 
93  return 0;
94 }
95 
99 double fme_speed(double speed, double costheta, double L, double ke_tau_M_A)
100 {
101  const double gamma2 = L - speed * costheta;
102  if (gamma2 <= 0) {
103  return speed;
104  }
105 
106  double mu = ke_tau_M_A;
107  if (gamma2 < mu) {
108  mu = gamma2;
109  }
110 
111  return std::sqrt(speed * (speed + 2 * mu * costheta) + mu * mu);
112 }
113 
124 void fme_vel_theta(double *__restrict vel, double speed, double costheta, double sintheta, double L, double ke_tau_M_A)
125 {
126  const double gamma2 = L - speed * costheta;
127  if (gamma2 <= 0) {
128  return;
129  }
130 
131  const double mu = std::min(ke_tau_M_A, gamma2);
132  const double tmp = mu / speed;
133  const double ax = vel[0] * costheta + vel[1] * sintheta;
134  const double ay = vel[1] * costheta - vel[0] * sintheta;
135  vel[0] += tmp * ax;
136  vel[1] += tmp * ay;
137 }
138 
143 void fme_maxaccel_cossin_theta(double speed, double L, double ke_tau_M_A, double *__restrict costheta, double *__restrict sintheta)
144 {
145  if (ke_tau_M_A >= 0) {
146  if (L <= ke_tau_M_A) {
147  if (L >= 0) {
148  *costheta = 0;
149  *sintheta = 1;
150  return;
151  }
152  *costheta = 1;
153  *sintheta = 0;
154  return;
155  }
156 
157  const double tmp = L - ke_tau_M_A;
158  if (tmp <= speed) {
159  const double ct = tmp / speed;
160  *costheta = ct;
161  *sintheta = std::sqrt(1 - ct * ct);
162  return;
163  }
164  *costheta = 1;
165  *sintheta = 0;
166  return;
167  }
168 
169  if (-L < speed) {
170  *costheta = -1;
171  *sintheta = 0;
172  return;
173  }
174  *costheta = 1;
175  *sintheta = 0;
176  return;
177 }
178 
184 double fme_maxaccel_speed(double speed, double L, double ke_tau_M_A)
185 {
186  if (ke_tau_M_A >= 0) {
187  if (L <= ke_tau_M_A) {
188  if (L >= 0) {
189  return std::sqrt(speed * speed + L * L);
190  }
191  return speed;
192  }
193 
194  const double tmp = L - ke_tau_M_A;
195  if (tmp <= speed) {
196  return std::sqrt(speed * speed + ke_tau_M_A * (L + tmp));
197  }
198  return speed + ke_tau_M_A;
199  }
200 
201  if (-L < speed) {
202  return speed - ke_tau_M_A;
203  }
204  return speed;
205 }
206 
231 double fme_maxaccel_speed_C(double speedsq, double L, double ke_tau_M_A)
232 {
233  if (ke_tau_M_A >= 0) {
234  if (L <= ke_tau_M_A) {
235  if (L >= 0) {
236  return L * L;
237  }
238  return 0;
239  }
240 
241  const double tmp = L - ke_tau_M_A;
242  if (tmp * tmp <= speedsq) {
243  return ke_tau_M_A * (L + tmp);
244  }
245  return (2 * std::sqrt(speedsq) + ke_tau_M_A) * ke_tau_M_A;
246  }
247 
248  if (L >= 0 || L * L < speedsq) {
249  return (ke_tau_M_A - 2 * std::sqrt(speedsq)) * ke_tau_M_A;
250  }
251  return 0;
252 }
253 
256 double fme_minaccel_speed(double speed, double L, double ke_tau_M_A)
257 {
258  if (ke_tau_M_A >= 0) {
259  if (L >= 0) {
260  if (L >= ke_tau_M_A) {
261  return std::fabs(speed - ke_tau_M_A);
262  }
263 
264  const double tmp = L - ke_tau_M_A;
265  if (L <= speed || -tmp <= speed) {
266  return std::fabs(speed - ke_tau_M_A);
267  }
268  return L;
269  }
270 
271  if (-L < speed) {
272  if (ke_tau_M_A - L <= speed) {
273  return std::fabs(speed - ke_tau_M_A);
274  }
275  return L;
276  }
277  return speed;
278  }
279 
280  return speed;
281 }
282 
286 template<int N>
287 void collision_vel(double *__restrict v, const double *__restrict n, double b)
288 {
289  const double tmp = b * dot_product<N>(v, n);
290  for (int i = 0; i < N; ++i) {
291  v[i] -= tmp * n[i];
292  }
293 }
294 
298 template<int N>
299 void snark_hunt_vel(double *__restrict v, const double *__restrict dir)
300 {
301  const double speed = std::sqrt(dot_product<N>(v, v));
302  double tmp = 1.2;
303  if (speed > 95. / 3) {
304  tmp = 50 / (speed + 10);
305  }
306  for (int i = 0; i < N; ++i) {
307  v[i] = tmp * v[i] + 300 * dir[i];
308  }
309 }
310 
313 inline double tau_g_to_p(double tau_g)
314 {
315  return 0.001 * std::floor(1000 * tau_g);
316 }
317 
321 void water_vel(double *__restrict v, double speed, const double *__restrict a, double geomfric, double M, double ke_tau_M_A)
322 {
323  const double m = 0.8 * M;
324  const double gamma2 = m - geomfric * speed;
325  if (gamma2 <= 0 || m < 0.1) {
326  return;
327  }
328 
329  const double mu = std::min(0.8 * ke_tau_M_A, gamma2);
330  for (int i = 0; i < 3; ++i) {
331  v[i] = geomfric * v[i] + mu * a[i];
332  }
333 }
void fric_vel(double *__restrict vel, double speed, double E, double tau_k)
Definition: strafelib.hpp:50
double fme_maxaccel_speed_C(double speedsq, double L, double ke_tau_M_A)
Definition: strafelib.hpp:231
double fme_minaccel_speed(double speed, double L, double ke_tau_M_A)
Definition: strafelib.hpp:256
void snark_hunt_vel(double *__restrict v, const double *__restrict dir)
Definition: strafelib.hpp:299
void collision_vel(double *__restrict v, const double *__restrict n, double b)
Definition: strafelib.hpp:287
double dot_product(const double *__restrict a, const double *__restrict b)
Definition: strafelib.hpp:11
double fme_speed(double speed, double costheta, double L, double ke_tau_M_A)
Definition: strafelib.hpp:99
double fme_maxaccel_speed(double speed, double L, double ke_tau_M_A)
Definition: strafelib.hpp:184
void water_vel(double *__restrict v, double speed, const double *__restrict a, double geomfric, double M, double ke_tau_M_A)
Definition: strafelib.hpp:321
constexpr const double JUMP_SPEED
The initial jumping speed, before gravity is applied.
Definition: strafelib.hpp:6
void fme_maxaccel_cossin_theta(double speed, double L, double ke_tau_M_A, double *__restrict costheta, double *__restrict sintheta)
Definition: strafelib.hpp:143
void fme_vel_theta(double *__restrict vel, double speed, double costheta, double sintheta, double L, double ke_tau_M_A)
Definition: strafelib.hpp:124
double fric_speedsq(double speedsq, double E, double tau_k)
Definition: strafelib.hpp:80
double tau_g_to_p(double tau_g)
Definition: strafelib.hpp:313
double fric_speed(double speed, double E, double tau_k)
Definition: strafelib.hpp:29