Advertisement
BratokHR

Untitled

Apr 7th, 2018
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.91 KB | None | 0 0
  1. /*
  2. ================
  3. reset_noe
  4.  
  5. Удаляет ноды
  6. ================
  7. */
  8. void reset_node()
  9. {
  10.     size_t i;
  11.  
  12.     for ( i = 0; i < nodes.size(); i++ )
  13.     {
  14.         nodes[ i ].arcs.clear();
  15.         nodes[ i ].dists.clear();
  16.     }
  17.  
  18.     for ( i = 0; i < routes.size(); i++ )
  19.         routes[ i ].clear();
  20.  
  21.     for ( i = 0; i < routedists.size(); i++ )
  22.         routedists[ i ].clear();
  23.  
  24.     nodes.clear();
  25.     routes.clear();
  26.     routedists.clear();
  27. }
  28.  
  29. /*
  30. ================
  31. create_nodes_by_count
  32.  
  33. Находит ближайший нод для origin
  34. ================
  35. */
  36. int get_num_closestnode( float *origin )
  37. {
  38.     size_t i;
  39.     int ret = -1;
  40.  
  41.     if ( nodes.empty() )
  42.         return ret;
  43.  
  44.     for ( i = 0; i < nodes.size(); i++ )
  45.     {
  46.         if ( IsVisible( nodes[ i ].origin, origin ) )
  47.         {
  48.             if ( ret == -1 )
  49.                 ret = i;
  50.             else if ( closer( origin, nodes[ i ].origin, nodes[ ret ].origin ) )
  51.                 ret = i;
  52.         }
  53.     }
  54.  
  55.     return ret;
  56. }
  57.  
  58. /*
  59. ================
  60. create_nodes_by_count
  61.  
  62. Создает  ноды  распределяя  их  по ширине и высоте
  63. Если  num  ==  -1,  то  кол-во нодов расчитывается
  64. автоматически
  65. ================
  66. */
  67. void create_nodes_by_count( float *origin, int width, int height, int range )
  68. {
  69.     int min_dist = 100; // минимум юнитов между нодами
  70.  
  71.     if ( !nodes.empty() )
  72.         reset_node();
  73.  
  74.     count = 500;
  75.     int crnt_count = 0;
  76.  
  77.     // добавляем первый нод
  78.     node_t node;
  79.     vec3_t start = { origin[ 0 ], origin[ 1 ], origin[ 2 ] };
  80.     vec3_t end = { origin[ 0 ], origin[ 1 ], origin[ 2 ] - 1000000 };
  81.     GetPositionBulletTrace( node.origin, start, end );
  82.     node.origin[ 2 ] += 10;
  83.     node.load = false;
  84.     nodes.push_back( node );
  85.  
  86.     for ( size_t n = 0; crnt_count < count; n++ )
  87.     {
  88.         if ( n >= nodes.size() )
  89.             break;
  90.  
  91.         if ( nodes[ n ].load )
  92.             continue;
  93.  
  94.         float pw[ 4 ] = { -1, 1, 0, 0 };
  95.         float ph[ 4 ] = { 0, 0, -1, 1 };
  96.  
  97.         for ( int i = 0; i < 4; i++ )
  98.         {
  99.             float to_pos[ 3 ] = {
  100.                 nodes[ n ].origin[ 0 ] + min_dist * pw[ i ],
  101.                 nodes[ n ].origin[ 1 ] + min_dist * ph[ i ],
  102.                 nodes[ n ].origin[ 2 ]
  103.             };
  104.  
  105.             if ( IsVisible( nodes[ n ].origin, to_pos ) )
  106.             {
  107.                 float new_to_pos[ 3 ];
  108.                 VectorCopy( to_pos, new_to_pos );
  109.                 new_to_pos[ 2 ] -= 1000000;
  110.  
  111.                 GetPositionBulletTrace( new_to_pos, to_pos, new_to_pos );
  112.                 new_to_pos[ 2 ] += 10;
  113.  
  114.                 if ( IsVisible( nodes[ n ].origin, new_to_pos ) )
  115.                 {
  116.                     bool found = false;
  117.  
  118.                     for ( int j = 0; j < nodes.size(); j++ )
  119.                     {
  120.                         if ( GetDistance( nodes[ j ].origin, new_to_pos ) < 5 )
  121.                         {
  122.                             found = true;
  123.                             break;
  124.                         }
  125.                     }
  126.  
  127.                     if ( !found )
  128.                     {
  129.                         node_t new_node;
  130.                         new_node.load = false;
  131.                         VectorCopy( new_to_pos, new_node.origin );
  132.  
  133.                         nodes.push_back( new_node );
  134.                         crnt_count++;
  135.                     }
  136.                 }
  137.             }
  138.         }
  139.  
  140.         nodes[ n ].load = true;
  141.     }
  142.  
  143.     load_routes();
  144. }
  145.  
  146. /*
  147. ================
  148. load_routes
  149.  
  150. Дополняет ноды и строит все маршруты
  151. ================
  152. */
  153. void load_routes()
  154. {
  155.     size_t i, j, n;
  156.  
  157.     for ( i = 0; i < nodes.size(); i++ )
  158.     {
  159.         for ( j = 0; j < nodes.size(); j++ )
  160.         {
  161.             if ( i != j && IsVisible( nodes[ i ].origin, nodes[ j ].origin ) )
  162.             {
  163.                 nodes[ i ].arcs.push_back( j );
  164.                 nodes[ i ].dists.push_back( GetDistance( nodes[ i ].origin, nodes[ j ].origin ) );
  165.             }
  166.         }
  167.     }
  168.  
  169.     for ( n = 0; n < nodes.size(); n++ )
  170.     {
  171.         std::vector<int> d, p, q;
  172.         std::vector<bool> done;
  173.         std::vector<int> invp;
  174.  
  175.         for ( i = 0; i < nodes.size(); i++ )
  176.         {
  177.             d.push_back( MAX_DIST_ROUTE );
  178.             q.push_back( -1 );
  179.             p.push_back( -1 );
  180.             invp.push_back( -1 );
  181.             done.push_back( false );
  182.  
  183.         }
  184.  
  185.         d[ n ] = 0;
  186.         q[ n ] = 0;
  187.         invp[ n ] = 0;
  188.  
  189.         while ( getSizeMass( q ) > 0 )
  190.         {
  191.             int min = MAX_DIST_ROUTE;
  192.             int u = -1;
  193.  
  194.             for ( i = 0; i < nodes.size(); i++ )
  195.             {
  196.                 if ( q[ i ] != -1 && q[ i ] < min )
  197.                 {
  198.                     min = q[ i ];
  199.                     u = i;
  200.                 }
  201.             }
  202.  
  203.             done[ u ] = true;
  204.             q[ u ] = -1;
  205.  
  206.             for ( i = 0; i < nodes[ u ].arcs.size(); i++ )
  207.             {
  208.                 if ( !done[ nodes[ u ].arcs[ i ] ] && d[ nodes[ u ].arcs[ i ] ] > d[ u ] + nodes[ u ].dists[ i ] )
  209.                 {
  210.                     d[ nodes[ u ].arcs[ i ] ] = d[ u ] + nodes[ u ].dists[ i ];
  211.                     p[ nodes[ u ].arcs[ i ] ] = u;
  212.                     q[ nodes[ u ].arcs[ i ] ] = d[ u ] + nodes[ u ].dists[ i ];
  213.                 }
  214.             }
  215.         }
  216.        
  217.         for ( i = 0; i < p.size(); i++ )
  218.         {
  219.             if ( i != n )
  220.             {
  221.                 int last = i;
  222.                 int cur = i;
  223.  
  224.                 while ( cur != n )
  225.                 {
  226.                     last = cur;
  227.                     cur = p[ cur ];
  228.                 }
  229.  
  230.                 invp[ i ] = last;
  231.             }
  232.         }
  233.        
  234.         routes.push_back( invp );
  235.         routedists.push_back( d );
  236.     }
  237. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement