Guest User

Untitled

a guest
Jun 22nd, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.60 KB | None | 0 0
  1. # определение необходимых delta-v, прилагаемых по курсу движения.
  2. sub hohmann_dv {
  3. my ($rc, $rt) = @_; # $rc - Radius of Current orbit; $rt - Radius of Target orbit;
  4.  
  5. my $dv1 = sqrt($u / $rc) * (sqrt(2 * $rt / ($rc + $rt)) - 1);
  6. my $dv2 = sqrt($u / $rt) * (1 - sqrt(2 * $rc / ($rc + $rt)));
  7.  
  8. return ($dv1, $dv2);
  9. }
  10.  
  11. # приложение импульса силой $dv из точки $x, $y в направлении $cw перпендикулярно радиус-вектору
  12. sub direct_dv {
  13. my ($dv, $x, $y, $cw) = @_;
  14. return map { $_ * $dv } vec_norm(vec_vp($x, $y, 0, 0, 0, $cw))
  15. }
  16.  
  17. ...
  18.  
  19. if (1 == $stage && !defined $x1) {
  20. # first impulse, circular -> elliptic
  21. ($dvx, $dvy) = direct_dv($dv[0], $x, $y, $cw);
  22. vm_input(0x2 => $dvx, 0x3 => $dvy);
  23. ($x1, $y1) = ($x, $y);
  24. $stage++;
  25. }
  26.  
  27. if (2 == $stage && 0 > $cw * vec_sp($x1, $y1, $x, $y)) {
  28. # vec_sp - скалярное произведение векторов, $x1, $y1 - координаты первого импульса, $cw - clockwiseness
  29. # second impulse, elliptic -> circular
  30. ($dvx, $dvy) = direct_dv($dv[1], $x, $y, $cw);
  31. vm_input(0x2 => $dvx, 0x3 => $dvy);
  32. $stage++;
  33. }
  34.  
  35. ...
  36.  
  37. # а это переход с произвольной эллиптической на круговую.
  38. # то есть первый импульс рассчитывается по той же формуле гомана,
  39. # только для «якобы целевой» орбиты радиусом сильно больше нужного,
  40. # а второй импульс рассчитывается непосредственно в месте пересечения текущей и целевой орбит
  41.  
  42. if (2 == $stage && $v > (($tgt - $alt))) {
  43. # $v - модуль скорости в данный момент,
  44. # $alt - наше текущее расстояние от начала координат,
  45. # $tgt - желаемое расстояние от начала координат
  46.  
  47. my ($vx, $vy) = ($x0 - $x, $y0 - $y);
  48. # $x0, $y0 - наши координаты на прошлом тике,
  49. # $x, $y - на текущем
  50.  
  51. my ($vdx, $vdy) = map { $_ * $vf } vec_norm(vec_vp($x, $y, 0, 0, 0, $cw));
  52. # $vdx = velocity desired x, $vdy = velocity desired y
  53. # vec_vp - векторное произведение, vec_norm - нормализация вектора по длине
  54.  
  55. ($dvx, $dvy) = ($vdx - $vx, $vdy - $vy);
  56. vm_input(0x2 => $dvx, 0x3 => $dvy);
  57. $stage++;
  58. }
Add Comment
Please, Sign In to add comment