Advertisement
qtinio

siatka tajnych agentuw

May 15th, 2019
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.58 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <time.h>
  3.  
  4. #include "agents.h"
  5.  
  6.  
  7.  
  8. AutoPilot::AutoPilot()
  9. {
  10. }
  11. extern int cel_biere_se;
  12. extern int cel_printf;
  13. int cel = -1;
  14. float odleglosc = -1;
  15. float odleglosc_do_przedmiotu;
  16.  
  17. void AutoPilot::AutoControl(MovableObject *obj)
  18. {
  19. Terrain *_terrain = obj->terrain;
  20.  
  21. float pi = 3.1415;
  22.  
  23. //podnoszenie_przedm = 1;
  24. Vector3 vect_local_forward = obj->state.qOrient.rotate_vector(Vector3(1, 0, 0));
  25. Vector3 vect_local_right = obj->state.qOrient.rotate_vector(Vector3(0, 0, 1));
  26. // TUTAJ NALEŻY UMIEŚCIĆ ALGORYTM AUTONOMICZNEGO STEROWANIA POJAZDEM
  27. // .................................................................
  28. // .................................................................
  29. if (cel == -1)
  30. {
  31. for (int i = 0; i < _terrain->number_of_items; i++)
  32. {
  33. if (_terrain->p[i].type == ITEM_COIN && _terrain->p[i].to_take)
  34. {
  35. odleglosc_do_przedmiotu = (_terrain->p[i].vPos - obj->state.vPos + Vector3(0, obj->state.vPos.y - _terrain->p[i].vPos.y, 0)).length();
  36. if (odleglosc == -1)
  37. odleglosc = odleglosc_do_przedmiotu;
  38. else
  39. if (odleglosc > odleglosc_do_przedmiotu && _terrain->p[i].to_take)
  40. {
  41. odleglosc = odleglosc_do_przedmiotu;
  42. cel = i;
  43. cel_printf = cel;
  44.  
  45. // dobre biere se to pozdro
  46. cel_biere_se = cel;
  47. }
  48. }
  49. }
  50. }
  51.  
  52. if (cel > -1)
  53. {
  54. Vector3 x = _terrain->p[cel].vPos - obj->state.vPos;
  55. Vector3 forward = obj->state.qOrient.rotate_vector(Vector3(1, 0, 0));// obroc_wektor(Wektor3(1, 0, 0));
  56. Vector3 right = obj->state.qOrient.rotate_vector(Vector3(0, 1, 0));
  57.  
  58. float cos = (forward^x) / (x.length() * forward.length());
  59. float kat = acos(cos);
  60. odleglosc_do_przedmiotu = (_terrain->p[cel].vPos - obj->state.vPos + Vector3(0, obj->state.vPos.y - _terrain->p[cel].vPos.y, 0)).length();
  61.  
  62. if (!_terrain->p[cel].to_take) {
  63. cel = -1;
  64. cel_printf = cel;
  65. }
  66.  
  67. if (cos > 0.7)
  68. {
  69. obj->state.wheel_turn_angle = 0;
  70. }
  71. else
  72. {
  73.  
  74. if (!obj->if_keep_steer_wheel)
  75. {
  76. if (kat > PI) {
  77. obj->breaking_degree = 0.7;
  78. obj->state.wheel_turn_angle = 0.1f;
  79. }
  80. else {
  81. obj->breaking_degree = 0.7;
  82. obj->state.wheel_turn_angle = -0.1f;
  83. }
  84. }
  85. }
  86.  
  87. if (obj->state.vV.length() < 30.0) {
  88. obj->F = 5000.0;
  89. }
  90. else
  91. obj->F = 0.0;
  92.  
  93. if (odleglosc_do_przedmiotu < 30)
  94. {
  95. if (obj->state.vV.length() > 1.0)
  96. obj->breaking_degree = 0.8;
  97. }else
  98. if (odleglosc_do_przedmiotu < 45)
  99. {
  100. if (obj->state.vV.length() > 2.0)
  101. obj->breaking_degree = 0.5;
  102. }
  103. }
  104.  
  105. }
  106.  
  107. void AutoPilot::ControlTest(MovableObject *_ob, float krok_czasowy, float czas_proby)
  108. {
  109. bool koniec = false;
  110. float _czas = 0; // czas liczony od początku testu
  111. //FILE *pl = fopen("test_sterowania.txt","w");
  112. while (!koniec)
  113. {
  114. _ob->Simulation(krok_czasowy);
  115. AutoControl(_ob);
  116. _czas += krok_czasowy;
  117. if (_czas >= czas_proby) koniec = true;
  118. //fprintf(pl,"czas %f, vPos[%f %f %f], got %d, pal %f, F %f, wheel_turn_angle %f, breaking_degree %f\n",_czas,_ob->vPos.x,_ob->vPos.y,_ob->vPos.z,_ob->money,_ob->amount_of_fuel,_ob->F,_ob->wheel_turn_angle,_ob->breaking_degree);
  119. }
  120. //fclose(pl);
  121. }
  122.  
  123. // losowanie liczby z rozkladu normalnego o zadanej sredniej i wariancji
  124. float Randn(float srednia, float wariancja, long liczba_iter)
  125. {
  126. //long liczba_iter = 10; // im wiecej iteracji tym rozklad lepiej przyblizony
  127. float suma = 0;
  128. for (long i = 0; i < liczba_iter; i++)
  129. suma += (float)rand() / RAND_MAX;
  130. return (suma - (float)liczba_iter / 2)*sqrt(12 * wariancja / liczba_iter) + srednia;
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement