Advertisement
Guest User

zzz

a guest
Sep 22nd, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.29 KB | None | 0 0
  1. #define DEBUG_MODE 0
  2. #define VAL_INF 1000.0f
  3. #define NUM_DEBRIS_2D 11
  4. #define NUM_LAYERS 3
  5. #define NUM_WAYPOINTS 3 /// puncte road
  6. #define SET_POSITION_TARGET_THRESHOLD 0.2f
  7. #define SET_POSITION_TARGET_WAYPOINT 0.01f
  8. #define SET_WAYPOINT_VELOCITY 0.02f
  9. #define DELTA_RVOUS_Y 0.2f
  10. #define RVOUS_VELOCITY 0.005f
  11. #define RVOUS_ANGULAR 0.0175f
  12.  
  13. #define COMPARE_EPS 0.005
  14. #define NUM_AFFECTED_INT_2D (NUM_DEBRIS_2D + 2) // trebuie modificat la 3D
  15. #define INTERVAL_EPS (DIM_ROBOT / 2.0)
  16.  
  17. float MOVE_SPEED_COEFFICIENT;
  18.  
  19. #define DIM_ROBOT 0.25 /// 0.22
  20. #define DIM_AREA_X 0.66 /// 0.64
  21. float DIM_DEBRIS[NUM_LAYERS];
  22. float PENALTY_DEBRIS[NUM_LAYERS];
  23.  
  24. struct Point{
  25.     double x, y, z;
  26. };
  27. struct Debris{
  28.     Point position;
  29.     float radius;
  30. };
  31.  
  32. struct Diapazon{
  33.     int index;
  34.     double left, right;
  35.     Diapazon (int INDEX = 0, int LEFT = 0, int RIGHT = 0) : index(INDEX), left(LEFT), right(RIGHT) {}
  36. };
  37.  
  38. inline double max(double a, double b){
  39.     return a > b ? a : b;
  40. }
  41.  
  42. inline double min(double a, double b){
  43.     return a < b ? a : b;
  44. }
  45.  
  46. inline our_abs(double x) { // there should be no my_abs()
  47.     if (x > 0.0)
  48.         return x;
  49.     return -x;
  50. }
  51.  
  52. inline bool is_equal(double A, double B) {
  53.     return our_abs(A - B) < COMPARE_EPS;
  54. }
  55.  
  56. inline bool greater(Diapazon A, Diapazon B){
  57.     if (is_equal(A.left, B.left))
  58.         return A.right > B.right;
  59.     return A.left < B.left;
  60. }
  61.  
  62. void sort(Diapazon v[], int n) {
  63.     for(int i = 0; i < n; i++) {
  64.         for(int j = i + 1; j < n; j++)
  65.             if(!greater(v[i], v[j])) {
  66.                 Diapazon aux = v[i];
  67.                 v[i] = v[j];
  68.                 v[j] = aux;
  69.             }
  70.     }
  71. }
  72. inline int layer(int index){
  73.     if(index <= 3) return 0;
  74.     if(index <= 7) return 1;
  75.     return 2;
  76. }
  77.  
  78. void move_thruster_damage () {
  79.     int health = game.getThrusterHealth ();
  80.     if ( health <= 85 && myZRState[1] <= 0.6 ) /// imminent collision with a green asteroid penalty >= 10 && penalty < 25
  81.         MOVE_SPEED_COEFFICIENT = 0.125f;
  82.  
  83.     if ( health <= 65 && myZRState[1] <= 0.4 ) /// imminent collision with a purple asteroid
  84.         MOVE_SPEED_COEFFICIENT = 0.075f;
  85. }
  86.  
  87. float debris_pos[NUM_DEBRIS_2D][4];
  88. Debris debris[NUM_DEBRIS_2D];
  89. Diapazon affected_interval[NUM_DEBRIS_2D];
  90. Diapazon found_gap;
  91. float expected_penalty;
  92. int road_index;
  93. int excluded_ast[NUM_DEBRIS_2D]; /// asteroizi exclusi
  94. int time_stop; /// the robot should stop at least 3 seconds at a waypoint to reset momentum
  95.  
  96. float target[3]; /// target position
  97. float myZRState[12]; /// current position
  98. float otherZRState[12]; /// other position
  99. Diapazon interv[NUM_AFFECTED_INT_2D]; /// bitmask
  100. Point road[NUM_WAYPOINTS]; /// traseu
  101.  
  102. void move ( float positionToMoveTo[3] ) {
  103.     move_thruster_damage ();
  104.     float delta[3]; /// auxiliary vector for subtraction
  105.     mathVecSubtract(delta, positionToMoveTo, myZRState, 3); // Set delta to be the displacement of positionToMove to from myZRState.
  106.     float velocity[3] = { myZRState[3], myZRState[4], myZRState[5] };
  107.     bool rvous_result = false;
  108.     float smallarea_coef = 1.0f;
  109.    
  110.     if ( road_index > 0 )
  111.         smallarea_coef = 3.0f;
  112.  
  113.     if ( mathVecMagnitude ( delta, 3 ) > SET_POSITION_TARGET_THRESHOLD ) {
  114.         time_stop = api.getTime ();
  115.         float between[3];
  116.         for ( int index = 0; index < 3; index++ )
  117.             between[index] = MOVE_SPEED_COEFFICIENT * ( positionToMoveTo[index] - myZRState[index] );
  118.  
  119.         api.setVelocityTarget (between);
  120.     }
  121.     else if ( mathVecMagnitude ( delta, 3 ) <= smallarea_coef * SET_POSITION_TARGET_WAYPOINT
  122.     && ( mathVecMagnitude ( velocity, 3 ) <= SET_WAYPOINT_VELOCITY || road_index > 0 )
  123.     && api.getTime() - time_stop >= 3 && road_index + 1 < NUM_WAYPOINTS ) {
  124.         DEBUG (( "next road index %d Ox vrut %f Ox curent %f speed %f", road_index, road[road_index].x, myZRState[0], mathVecMagnitude ( velocity, 3 ) ));
  125.         road_index++;
  126.     }
  127.     else { /// close enough, shift to other moving function
  128.         api.setPositionTarget(positionToMoveTo);
  129.        
  130.         if ( road_index + 1 == NUM_WAYPOINTS )
  131.         {
  132.             /// doesn't point at target
  133.             DEBUG (( "attempt rendezvous" ));
  134.             float attitude[3] = { otherZRState[6], otherZRState[7], otherZRState[8] };
  135.             api.setAttitudeTarget ( attitude );
  136.             float angular[3] = { myZRState[9], myZRState[10], myZRState[11] };
  137.            
  138.             if ( mathVecMagnitude ( velocity, 3 ) < RVOUS_VELOCITY && mathVecMagnitude ( angular, 3 ) < RVOUS_ANGULAR )
  139.             {
  140.                 DEBUG (( "try" ));
  141.                 rvous_result = game.completeRendezvous ();
  142.             }
  143.                
  144.             if ( rvous_result == true )
  145.                 road_index++;
  146.         }
  147.         else
  148.             DEBUG(("pos x %f curr %f v %f time diff %d", positionToMoveTo[0], myZRState[0], mathVecMagnitude ( velocity, 3 ), api.getTime() - time_stop ));
  149.     }
  150. }
  151.  
  152. void init(){
  153.     MOVE_SPEED_COEFFICIENT = 0.15f;
  154.     road_index = 0;
  155.  
  156.     /// precalc
  157.     DIM_DEBRIS[0] = 0.030;
  158.     DIM_DEBRIS[1] = 0.045;
  159.     DIM_DEBRIS[2] = 0.1; /// 0.090 -- reuseste sa se atinga ff usor de asteroizii mari desi nu trebuie
  160.     PENALTY_DEBRIS[0] = 10.0;
  161.     PENALTY_DEBRIS[1] = 25.0;
  162.     PENALTY_DEBRIS[2] = 50.0;
  163.  
  164.     game.getDebris (debris_pos);
  165.  
  166.     for(int i = 0; i < NUM_DEBRIS_2D; i++){
  167.         debris[i].position.x = debris_pos[i][0];
  168.         debris[i].position.y = debris_pos[i][1];
  169.         debris[i].position.z = debris_pos[i][2];
  170.         debris[i].radius = debris_pos[i][3];
  171.  
  172.         affected_interval[i] = Diapazon(i, debris[i].position.x - debris[i].radius - INTERVAL_EPS, debris[i].position.x + debris[i].radius + INTERVAL_EPS);
  173.     }
  174.    
  175.     affected_interval[NUM_AFFECTED_INT_2D - 2] = Diapazon(-1, -DIM_AREA_X * 2.0, -DIM_AREA_X + INTERVAL_EPS); // interval auxiliar in stanga
  176.     affected_interval[NUM_AFFECTED_INT_2D - 1] = Diapazon(-1, DIM_AREA_X - INTERVAL_EPS, 2.0 * DIM_AREA_X); // interval auxiliar in dreapta
  177.    
  178.     sort(affected_interval, NUM_AFFECTED_INT_2D);
  179.  
  180.     for(int i = 0; i < NUM_DEBRIS_2D + 2; i++){
  181.         DEBUG(("index initial: %d -> %f %f", affected_interval[i].index, affected_interval[i].left, affected_interval[i].right));
  182.     }
  183.  
  184.     double min_penalty = 100.0, penalty;
  185.    
  186.     ///COD SCHIMBAT AICI
  187.    
  188.     int num_interv = 0;
  189.     interv[num_interv++] = affected_interval[0];
  190.     for (int i = 1; i < NUM_AFFECTED_INT_2D; ++i)
  191.         if (interv[num_interv - 1].right < affected_interval[i].right)
  192.             interv[num_interv++] = affected_interval[i];
  193.  
  194.     double left = 0.0, right = 0.0;
  195.     for (int i = 0; i < (1 << num_interv); ++i) {
  196.         penalty = 0.0;
  197.         for (int j = 1; j < num_interv - 1; ++j)
  198.             if (i & (1 << interv[j].index))
  199.               penalty += PENALTY_DEBRIS[layer(interv[j].index)];
  200.         if (penalty < min_penalty) {
  201.             bool ok = 0;
  202.             double maximum = interv[0].right;
  203.             for (int j = 1; j < num_interv && ok == 0; ++j)
  204.                 if (interv[j].index == -1 || (i & (1 << interv[j].index)) == 0){
  205.                     if (interv[j].left > maximum){
  206.                         ok = 1;
  207.                         left = maximum;
  208.                         right = interv[j].left;
  209.                         min_penalty = penalty;
  210.                     }
  211.                     maximum = max(maximum, interv[j].right);
  212.                 }
  213.         }
  214.     }
  215.  
  216.     found_gap.left = left;
  217.     found_gap.right = right;
  218.     expected_penalty = min_penalty;
  219.     // DEBUG(("%f %f %f", left, right, min_penalty));
  220.  
  221.     /// CODMEISTER AICI
  222.    
  223.     DEBUG(("gap ox %f penalty %f", best_gap, expected_penalty));
  224.  
  225.     api.getMyZRState( myZRState );
  226.     /// movement
  227.     road[0].x = best_gap; road[0].y = myZRState[1]; road[0].z = myZRState[2];
  228.     road[1].x = road[0].x; road[1].y = -0.3; road[1].z = road[0].z;
  229.     /// time
  230.     time_stop = api.getTime ();
  231. }
  232.  
  233. void loop(){
  234.     api.getMyZRState( myZRState );
  235.     api.getOtherZRState( otherZRState );
  236.     /// update road[2]
  237.     road[2].x = otherZRState[0]; road[2].y = otherZRState[1] + DELTA_RVOUS_Y; road[2].z = otherZRState[2];
  238.  
  239.     target[0] = road[road_index].x;
  240.     target[1] = road[road_index].y;
  241.     target[2] = road[road_index].z;
  242.    
  243.     if ( road_index < NUM_WAYPOINTS )
  244.         move( target );
  245. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement