Advertisement
RyDeR_

Dijkstra.inc

Apr 20th, 2012
1,880
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 1.44 KB | None | 0 0
  1. /*
  2.     Dijkstra.inc - Dijkstra Pathfinding Algorithm
  3.     Copyright © 2012 RyDeR`
  4. */
  5.  
  6. #if defined _Dijkstra_Included
  7.     #endinput
  8. #endif
  9.  
  10. #define _Dijkstra_Included
  11.  
  12. #if !defined MAX_NODES
  13.     #define MAX_NODES (512)
  14. #endif
  15.  
  16. enum e_Nodes {
  17.     Float: e_fNX,
  18.     Float: e_fNY,
  19.     Float: e_fNZ,
  20.     e_iLink1,
  21.     e_iLink2,
  22.     e_iLink3,
  23.     e_iLink4
  24. };
  25.  
  26. stock Dijkstra(const aeNodes[][], iStart, iEnd, aiPath[], const iSize = sizeof(aeNodes)) {
  27.     if(iStart == iEnd) {
  28.         return 0;
  29.     }
  30.     iStart ^= iEnd, iEnd ^= iStart, iStart ^= iEnd;
  31.    
  32.     new
  33.         Float: fDist,
  34.         Float: afDist[MAX_NODES] = { Float: 0x7F800000, ... },
  35.        
  36.         bool: abVisited[MAX_NODES char]
  37.     ;
  38.     afDist[iStart] = 0.0;
  39.     aiPath[iStart] = -1;
  40.    
  41.     while(iStart != iEnd) {
  42.         abVisited{iStart} = true;
  43.        
  44.         for(new e_Nodes: e = e_iLink1, i = 0; e <= e_iLink4; ++e) {
  45.             i = aeNodes[iStart][e];
  46.            
  47.             if(i >= iSize) {
  48.                 continue;
  49.             }
  50.             if(i != -1) {
  51.                 fDist = afDist[iStart] + floatsqroot(floatpower(aeNodes[iStart][e_fNX] - aeNodes[i][e_fNX], 2.0) + floatpower(aeNodes[iStart][e_fNY] - aeNodes[i][e_fNY], 2.0) + floatpower(aeNodes[iStart][e_fNZ] - aeNodes[i][e_fNZ], 2.0));
  52.                
  53.                 if(fDist < afDist[i]) {
  54.                     aiPath[i] = iStart;
  55.                     afDist[i] = fDist;
  56.                 }
  57.             }
  58.         }
  59.         fDist = Float: 0x7F800000;
  60.        
  61.         for(new i = 0; i < iSize; ++i) {
  62.             if(!abVisited{i} && afDist[i] < fDist) {
  63.                 iStart = i;
  64.                 fDist = afDist[i];
  65.             }
  66.         }
  67.         if(iStart == iEnd) {
  68.             return 1;
  69.         }
  70.     }
  71.     return 0;
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement