<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>Unuk: src/libUnuk/AStar.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body onload='searchBox.OnSelectItem(0);'>
<!-- Generated by Doxygen 1.7.4 -->
<script type="text/javascript"><!--
var searchBox = new SearchBox("searchBox", "search",false,'Search');
--></script>
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
  <td style="padding-left: 0.5em;">
   <div id="projectname">Unuk&#160;<span id="projectnumber">1.0</span></div>
  </td>
 </tr>
 </tbody>
</table>
</div>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
      <li id="searchli">
        <div id="MSearchBox" class="MSearchBoxInactive">
        <span class="left">
          <img id="MSearchSelect" src="search/mag_sel.png"
               onmouseover="return searchBox.OnSearchSelectShow()"
               onmouseout="return searchBox.OnSearchSelectHide()"
               alt=""/>
          <input type="text" id="MSearchField" value="Search" accesskey="S"
               onfocus="searchBox.OnSearchFieldFocus(true)" 
               onblur="searchBox.OnSearchFieldFocus(false)" 
               onkeyup="searchBox.OnSearchFieldChange(event)"/>
          </span><span class="right">
            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
          </span>
        </div>
      </li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="globals.html"><span>File&#160;Members</span></a></li>
    </ul>
  </div>
</div>
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
  initNavTree('_a_star_8cpp.html','');
</script>
<div id="doc-content">
<div class="header">
  <div class="headertitle">
<div class="title">src/libUnuk/AStar.cpp</div>  </div>
</div>
<div class="contents">
<a href="_a_star_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#include &lt;stdlib.h&gt;</span>
<a name="l00002"></a>00002 <span class="preprocessor">#include &quot;<a class="code" href="_a_star_8h.html">AStar.h</a>&quot;</span>
<a name="l00003"></a>00003 <span class="preprocessor">#include &quot;<a class="code" href="_node_8h.html">Node.h</a>&quot;</span>
<a name="l00004"></a>00004 
<a name="l00005"></a><a class="code" href="class_a_star.html#ac24e9dfcf9b10e277a2b84d864786cd8">00005</a> <a class="code" href="class_a_star.html#ac24e9dfcf9b10e277a2b84d864786cd8">AStar::AStar</a>(<span class="keywordtype">void</span>) {
<a name="l00006"></a>00006   m_open          = <a class="code" href="_node_8h.html#a070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
<a name="l00007"></a>00007   m_stack         = <a class="code" href="_node_8h.html#a070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
<a name="l00008"></a>00008   m_best          = <a class="code" href="_node_8h.html#a070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
<a name="l00009"></a>00009   
<a name="l00010"></a>00010   <a class="code" href="class_a_star.html#a6daaa58fc52045c6a4fad6b7a1fec60a">udCost</a>          = <a class="code" href="_node_8h.html#a070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
<a name="l00011"></a>00011   <a class="code" href="class_a_star.html#a2c97615a0ad52039bec2a7ceaab772a2">udValid</a>         = <a class="code" href="_node_8h.html#a070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
<a name="l00012"></a>00012   <a class="code" href="class_a_star.html#ab5a6376f40d9746e71447acb3b8a05bd">udNotifyChild</a>   = <a class="code" href="_node_8h.html#a070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;  
<a name="l00013"></a>00013   <a class="code" href="class_a_star.html#a1a4896338d482138954cfbfbd9e93641">udNotifyList</a>    = <a class="code" href="_node_8h.html#a070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
<a name="l00014"></a>00014 }
<a name="l00015"></a>00015 
<a name="l00016"></a><a class="code" href="class_a_star.html#a6a19cecaac38d0cc8f7f812f027ea98e">00016</a> <a class="code" href="class_a_star.html#a6a19cecaac38d0cc8f7f812f027ea98e">AStar::~AStar</a>(<span class="keywordtype">void</span>) {
<a name="l00017"></a>00017   ClearNodes();
<a name="l00018"></a>00018 }
<a name="l00019"></a>00019 
<a name="l00020"></a><a class="code" href="class_a_star.html#a49456dd3428034ad96ab7e2bcdae6397">00020</a> <span class="keywordtype">bool</span> <a class="code" href="class_a_star.html#a49456dd3428034ad96ab7e2bcdae6397">AStar::GeneratePath</a>(<span class="keywordtype">int</span> startx, <span class="keywordtype">int</span> starty, <span class="keywordtype">int</span> destx, <span class="keywordtype">int</span> desty) {
<a name="l00021"></a>00021   <span class="comment">// Grab the next node from the f position.</span>
<a name="l00022"></a>00022   <a class="code" href="class_a_star.html#ae0a4ccaa8582189a62afdb04f73c43b7">InitStep</a>(startx, starty, destx, desty);
<a name="l00023"></a>00023 
<a name="l00024"></a>00024   <span class="keywordtype">int</span> retval = 0;
<a name="l00025"></a>00025   <span class="keywordflow">while</span>(retval == 0) {
<a name="l00026"></a>00026     <span class="comment">// Go find the next node.</span>
<a name="l00027"></a>00027     retval = <a class="code" href="class_a_star.html#ab7acb36f1266e9149b674a8b59c2671d">Step</a>();
<a name="l00028"></a>00028   }
<a name="l00029"></a>00029   
<a name="l00030"></a>00030   <span class="keywordflow">if</span>(retval == 0 || !m_best) {
<a name="l00031"></a>00031     <span class="comment">// Set m_best to NULL so we can go and check for the next best node.</span>
<a name="l00032"></a>00032     m_best = <a class="code" href="_node_8h.html#a070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
<a name="l00033"></a>00033     <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00034"></a>00034   }
<a name="l00035"></a>00035   <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00036"></a>00036 }
<a name="l00037"></a>00037 
<a name="l00038"></a><a class="code" href="class_a_star.html#ab7acb36f1266e9149b674a8b59c2671d">00038</a> <span class="keywordtype">int</span> <a class="code" href="class_a_star.html#ab7acb36f1266e9149b674a8b59c2671d">AStar::Step</a>(<span class="keywordtype">void</span>) {
<a name="l00039"></a>00039   <span class="comment">// If we don&#39;t get the most efficent route, then go back</span>
<a name="l00040"></a>00040   <span class="comment">// and check some more nodes plox!</span>
<a name="l00041"></a>00041   <span class="keywordflow">if</span>(!(m_best == GetBest())) { <span class="keywordflow">return</span> -1; }
<a name="l00042"></a>00042   <span class="comment">// Ok, we found the best route.</span>
<a name="l00043"></a>00043   <span class="keywordflow">if</span>(m_best-&gt;<a class="code" href="class_node.html#a59a543130a10c95f1e8642cf8c5645e8">id</a>  == m_ID)    { <span class="keywordflow">return</span> 1; }
<a name="l00044"></a>00044   
<a name="l00045"></a>00045   <span class="comment">// Please set the best route as a child node.</span>
<a name="l00046"></a>00046   CreateChildren(m_best);
<a name="l00047"></a>00047  
<a name="l00048"></a>00048   <span class="keywordflow">return</span> 0;
<a name="l00049"></a>00049 }
<a name="l00050"></a>00050 
<a name="l00051"></a><a class="code" href="class_a_star.html#ae0a4ccaa8582189a62afdb04f73c43b7">00051</a> <span class="keywordtype">int</span> <a class="code" href="class_a_star.html#ae0a4ccaa8582189a62afdb04f73c43b7">AStar::InitStep</a>(<span class="keywordtype">int</span> startx, <span class="keywordtype">int</span> starty, <span class="keywordtype">int</span> destx, <span class="keywordtype">int</span> desty) {
<a name="l00052"></a>00052   <span class="comment">// Prepare for the next pass by clearing our previous nodes.</span>
<a name="l00053"></a>00053   ClearNodes();
<a name="l00054"></a>00054   
<a name="l00055"></a>00055   <span class="comment">// Initialize our variables.</span>
<a name="l00056"></a>00056   m_startx = startx;
<a name="l00057"></a>00057   m_starty = starty;
<a name="l00058"></a>00058   m_destx  = destx;
<a name="l00059"></a>00059   m_desty  = desty;
<a name="l00060"></a>00060   m_ID = Coord2Id(destx, desty);
<a name="l00061"></a>00061  
<a name="l00062"></a>00062   <span class="comment">// Set the node for our start location.</span>
<a name="l00063"></a>00063   <a class="code" href="class_node.html">Node</a> *temp = <span class="keyword">new</span> <a class="code" href="class_node.html">Node</a>(startx, starty);
<a name="l00064"></a>00064   temp-&gt;<a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a> = 0;
<a name="l00065"></a>00065   temp-&gt;<a class="code" href="class_node.html#afb5a7ac7536a9e09488bb685420cd78a">h</a> = abs(destx - startx) + abs(desty - starty);
<a name="l00066"></a>00066   temp-&gt;<a class="code" href="class_node.html#a32fbe9e0f4fc9e9d1845ce808738d7ab">f</a> = temp-&gt;<a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a> + temp-&gt;<a class="code" href="class_node.html#afb5a7ac7536a9e09488bb685420cd78a">h</a>;
<a name="l00067"></a>00067   temp-&gt;<a class="code" href="class_node.html#a59a543130a10c95f1e8642cf8c5645e8">id</a> = Coord2Id(startx, starty);
<a name="l00068"></a>00068   m_open = temp;
<a name="l00069"></a>00069 
<a name="l00070"></a>00070   <span class="keywordflow">return</span> 0;
<a name="l00071"></a>00071 }
<a name="l00072"></a>00072 
<a name="l00073"></a>00073 <span class="keywordtype">void</span> AStar::AddToOpen(<a class="code" href="class_node.html">Node</a> *addnode) {
<a name="l00074"></a>00074   <a class="code" href="class_node.html">Node</a> *node = m_open;
<a name="l00075"></a>00075   <a class="code" href="class_node.html">Node</a> *prev = <a class="code" href="_node_8h.html#a070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
<a name="l00076"></a>00076   
<a name="l00077"></a>00077   <span class="keywordflow">if</span>(!m_open) {
<a name="l00078"></a>00078     <span class="comment">// Add a a new node to the open list.</span>
<a name="l00079"></a>00079     m_open = addnode;
<a name="l00080"></a>00080   
<a name="l00081"></a>00081     m_open-&gt;<a class="code" href="class_node.html#a2559a716f69ccaa76d648d9f1b83065e">next</a> = <a class="code" href="_node_8h.html#a070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
<a name="l00082"></a>00082 
<a name="l00083"></a>00083     <span class="comment">// Start a new open list with our new node.</span>
<a name="l00084"></a>00084     <span class="comment">//Func(udNotifyList, NULL, addnode, NL_STARTOPEN, NCData);</span>
<a name="l00085"></a>00085  
<a name="l00086"></a>00086     <span class="keywordflow">return</span>;
<a name="l00087"></a>00087   }
<a name="l00088"></a>00088   
<a name="l00089"></a>00089   <span class="keywordflow">while</span>(node) {
<a name="l00090"></a>00090     <span class="comment">// If our addnode&#39;s f is greater than the currently open node</span>
<a name="l00091"></a>00091     <span class="comment">// then add the open node to the to previous to make room for</span>
<a name="l00092"></a>00092     <span class="comment">// add node to be on the open list.</span>
<a name="l00093"></a>00093     <span class="keywordflow">if</span>(addnode-&gt;<a class="code" href="class_node.html#a32fbe9e0f4fc9e9d1845ce808738d7ab">f</a> &gt; node-&gt;<a class="code" href="class_node.html#a32fbe9e0f4fc9e9d1845ce808738d7ab">f</a>) {
<a name="l00094"></a>00094       prev = node;
<a name="l00095"></a>00095       <span class="comment">// Now we have our new node go to next.</span>
<a name="l00096"></a>00096       node = node-&gt;<a class="code" href="class_node.html#a2559a716f69ccaa76d648d9f1b83065e">next</a>;
<a name="l00097"></a>00097     } <span class="keywordflow">else</span> {
<a name="l00098"></a>00098       <span class="comment">// go to the next node, and set it on our open list to check it&#39;s</span>
<a name="l00099"></a>00099       <span class="comment">// f value.</span>
<a name="l00100"></a>00100       <span class="keywordflow">if</span>(prev) {
<a name="l00101"></a>00101         prev-&gt;<a class="code" href="class_node.html#a2559a716f69ccaa76d648d9f1b83065e">next</a> = addnode;
<a name="l00102"></a>00102         addnode-&gt;<a class="code" href="class_node.html#a2559a716f69ccaa76d648d9f1b83065e">next</a> = node;
<a name="l00103"></a>00103         <a class="code" href="_node_8h.html#a65d456bd1d6bcbf35022277e41f5c9c7">Func</a>(<a class="code" href="class_a_star.html#a1a4896338d482138954cfbfbd9e93641">udNotifyList</a>, prev, addnode, <a class="code" href="_node_8h.html#ab05545428df79998c9e194b94af5719e">NL_ADDOPEN</a>, <a class="code" href="class_a_star.html#a4fe11c564dceb3cac1352c7fadc0efef">NCData</a>);
<a name="l00104"></a>00104       } <span class="keywordflow">else</span> {
<a name="l00105"></a>00105         <span class="comment">// We will only ever run through this once per instance. We have no nodes currently</span>
<a name="l00106"></a>00106         <span class="comment">// so we set an open list with this node.</span>
<a name="l00107"></a>00107         <a class="code" href="class_node.html">Node</a> *temp = m_open;
<a name="l00108"></a>00108       
<a name="l00109"></a>00109         m_open = addnode;
<a name="l00110"></a>00110         m_open-&gt;<a class="code" href="class_node.html#a2559a716f69ccaa76d648d9f1b83065e">next</a> = temp;
<a name="l00111"></a>00111         <span class="comment">//Func(udNotifyList, temp, addnode, NL_STARTOPEN, NCData);</span>
<a name="l00112"></a>00112       } 
<a name="l00113"></a>00113       <span class="keywordflow">return</span>;
<a name="l00114"></a>00114     }
<a name="l00115"></a>00115   }
<a name="l00116"></a>00116   <span class="comment">// Get the next node and add it to the open list.</span>
<a name="l00117"></a>00117   prev-&gt;<a class="code" href="class_node.html#a2559a716f69ccaa76d648d9f1b83065e">next</a> = addnode;
<a name="l00118"></a>00118   <span class="comment">//Func(udNotifyList, prev, addnode, NL_ADDOPEN, NCData);              </span>
<a name="l00119"></a>00119 }
<a name="l00120"></a>00120 
<a name="l00121"></a>00121 <span class="keywordtype">void</span> AStar::ClearNodes(<span class="keywordtype">void</span>) {
<a name="l00122"></a>00122   <a class="code" href="class_node.html">Node</a> *temp  = <a class="code" href="_node_8h.html#a070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
<a name="l00123"></a>00123   <a class="code" href="class_node.html">Node</a> *temp2 = <a class="code" href="_node_8h.html#a070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
<a name="l00124"></a>00124   
<a name="l00125"></a>00125   <span class="keywordflow">if</span>(m_open) {
<a name="l00126"></a>00126     <span class="keywordflow">while</span>(m_open) {
<a name="l00127"></a>00127       temp = m_open-&gt;<a class="code" href="class_node.html#a2559a716f69ccaa76d648d9f1b83065e">next</a>;
<a name="l00128"></a>00128       <span class="keyword">delete</span> m_open;
<a name="l00129"></a>00129       m_open = temp;
<a name="l00130"></a>00130     }
<a name="l00131"></a>00131   }
<a name="l00132"></a>00132   <span class="keywordflow">if</span>(m_closed) {
<a name="l00133"></a>00133     <span class="keywordflow">while</span>(m_closed) {
<a name="l00134"></a>00134       temp = m_closed-&gt;<a class="code" href="class_node.html#a2559a716f69ccaa76d648d9f1b83065e">next</a>;
<a name="l00135"></a>00135       <span class="keyword">delete</span> m_closed;
<a name="l00136"></a>00136       m_closed = temp;
<a name="l00137"></a>00137     }
<a name="l00138"></a>00138   }
<a name="l00139"></a>00139 }
<a name="l00140"></a>00140 
<a name="l00141"></a>00141 <span class="keywordtype">void</span> AStar::CreateChildren(<a class="code" href="class_node.html">Node</a> *node) {
<a name="l00142"></a>00142   <a class="code" href="class_node.html">Node</a> temp;
<a name="l00143"></a>00143   <span class="keywordtype">int</span> <a class="code" href="wglext_8h.html#ad77deca22f617d3f0e0eb786445689fc">x</a> = node-&gt;<a class="code" href="class_node.html#aff1029a518bdc2651007b8856f958364">x</a>;
<a name="l00144"></a>00144   <span class="keywordtype">int</span> <a class="code" href="wglext_8h.html#a9298c7ad619074f5285b32c6b72bfdea">y</a> = node-&gt;<a class="code" href="class_node.html#aa3e5b5240023b4528ae85057b3324202">y</a>;
<a name="l00145"></a>00145  
<a name="l00146"></a>00146   <span class="comment">// Loop through the grid and add the children to the list.</span>
<a name="l00147"></a>00147   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = -1; i &lt; 2; i++) {
<a name="l00148"></a>00148     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = -1; j &lt; 2; j++) {
<a name="l00149"></a>00149       temp.<a class="code" href="class_node.html#aff1029a518bdc2651007b8856f958364">x</a> = x+i;
<a name="l00150"></a>00150       temp.<a class="code" href="class_node.html#aa3e5b5240023b4528ae85057b3324202">y</a> = y+j;
<a name="l00151"></a>00151       <span class="keywordflow">if</span>((i == 0) &amp;&amp; (j == 0) || !<a class="code" href="_node_8h.html#a65d456bd1d6bcbf35022277e41f5c9c7">Func</a>(<a class="code" href="class_a_star.html#a2c97615a0ad52039bec2a7ceaab772a2">udValid</a>, node, &amp;temp, <a class="code" href="_node_8h.html#a71037a5b18b40a73fdfbca2e6ab14992">NC_INITIALADD</a>, <a class="code" href="class_a_star.html#a5a3067f9cf62dd1542f91f90c2b5dc0a">CBData</a>)) <span class="keywordflow">continue</span>;
<a name="l00152"></a>00152         
<a name="l00153"></a>00153       LinkChild(node, &amp;temp);
<a name="l00154"></a>00154     }
<a name="l00155"></a>00155   }     
<a name="l00156"></a>00156 }
<a name="l00157"></a>00157 
<a name="l00158"></a>00158 <span class="keywordtype">void</span> AStar::LinkChild(<a class="code" href="class_node.html">Node</a> *node, <a class="code" href="class_node.html">Node</a> *temp) {
<a name="l00159"></a>00159   <span class="comment">// Initialize variables for our temp node.</span>
<a name="l00160"></a>00160   <span class="keywordtype">int</span> x = temp-&gt;<a class="code" href="class_node.html#aff1029a518bdc2651007b8856f958364">x</a>;
<a name="l00161"></a>00161   <span class="keywordtype">int</span> y = temp-&gt;<a class="code" href="class_node.html#aa3e5b5240023b4528ae85057b3324202">y</a>;
<a name="l00162"></a>00162   <span class="keywordtype">int</span> g = temp-&gt;<a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a> + <a class="code" href="_node_8h.html#a65d456bd1d6bcbf35022277e41f5c9c7">Func</a>(<a class="code" href="class_a_star.html#a6daaa58fc52045c6a4fad6b7a1fec60a">udCost</a>, node, temp, 0, <a class="code" href="class_a_star.html#a5a3067f9cf62dd1542f91f90c2b5dc0a">CBData</a>);
<a name="l00163"></a>00163   <span class="comment">// Grabbing a unique ID before adding the node to the open list.</span>
<a name="l00164"></a>00164   <span class="keywordtype">int</span> <span class="keywordtype">id</span> = Coord2Id(x, y);
<a name="l00165"></a>00165   
<a name="l00166"></a>00166   <a class="code" href="class_node.html">Node</a> *check = <a class="code" href="_node_8h.html#a070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
<a name="l00167"></a>00167   
<a name="l00168"></a>00168   <span class="keywordflow">if</span>(check = CheckList(m_open, <span class="keywordtype">id</span>)) {
<a name="l00169"></a>00169     node-&gt;<a class="code" href="class_node.html#a5ce833fd049e87166f1c7acb6a803fba">children</a>[node-&gt;<a class="code" href="class_node.html#a5037540b2e3d6349d66ea25b062b6aa8">numChildren</a>++] = check;
<a name="l00170"></a>00170     
<a name="l00171"></a>00171     <span class="comment">// We have found an awesome route, update the node and variables.</span>
<a name="l00172"></a>00172     <span class="keywordflow">if</span>(g &lt; check-&gt;g) {
<a name="l00173"></a>00173       check-&gt;<a class="code" href="class_node.html#ad8184598cdea70e4bbdfd76f2b0f9e85">parent</a> = node;
<a name="l00174"></a>00174       check-&gt;<a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a>      = g;
<a name="l00175"></a>00175       check-&gt;<a class="code" href="class_node.html#a32fbe9e0f4fc9e9d1845ce808738d7ab">f</a>      = g+check-&gt;<a class="code" href="class_node.html#afb5a7ac7536a9e09488bb685420cd78a">h</a>;
<a name="l00176"></a>00176       <span class="comment">//Func(udNotifyChild, node, check, NC_OPENADD_UP, NCData);</span>
<a name="l00177"></a>00177     } <span class="keywordflow">else</span> {
<a name="l00178"></a>00178       <span class="comment">//Func(udNotifyChild, node, check, 2, NCData);</span>
<a name="l00179"></a>00179     }
<a name="l00180"></a>00180   } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(check = CheckList(m_closed, <span class="keywordtype">id</span>)) {
<a name="l00181"></a>00181     node-&gt;<a class="code" href="class_node.html#a5ce833fd049e87166f1c7acb6a803fba">children</a>[node-&gt;<a class="code" href="class_node.html#a5037540b2e3d6349d66ea25b062b6aa8">numChildren</a>++] = check;
<a name="l00182"></a>00182       
<a name="l00183"></a>00183     <span class="keywordflow">if</span>(g &lt; check-&gt;g) {
<a name="l00184"></a>00184     check-&gt;<a class="code" href="class_node.html#ad8184598cdea70e4bbdfd76f2b0f9e85">parent</a> = node;
<a name="l00185"></a>00185     check-&gt;<a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a>      = g;
<a name="l00186"></a>00186     check-&gt;<a class="code" href="class_node.html#a32fbe9e0f4fc9e9d1845ce808738d7ab">f</a>      = g+check-&gt;<a class="code" href="class_node.html#afb5a7ac7536a9e09488bb685420cd78a">h</a>;
<a name="l00187"></a>00187     <span class="comment">//Func(udNotifyChild, node, check, 3, NCData);</span>
<a name="l00188"></a>00188 
<a name="l00189"></a>00189     <span class="comment">// Update the parents.</span>
<a name="l00190"></a>00190     UpdateParents(check);
<a name="l00191"></a>00191     } <span class="keywordflow">else</span> {
<a name="l00192"></a>00192       <span class="comment">//Func(udNotifyChild, node, check, 4, NCData);</span>
<a name="l00193"></a>00193     }
<a name="l00194"></a>00194   } <span class="keywordflow">else</span> {
<a name="l00195"></a>00195     <a class="code" href="class_node.html">Node</a> *newnode = <span class="keyword">new</span> <a class="code" href="class_node.html">Node</a>(x, y);
<a name="l00196"></a>00196     newnode-&gt;<a class="code" href="class_node.html#ad8184598cdea70e4bbdfd76f2b0f9e85">parent</a> = node;
<a name="l00197"></a>00197     newnode-&gt;<a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a>  = g;
<a name="l00198"></a>00198     newnode-&gt;<a class="code" href="class_node.html#afb5a7ac7536a9e09488bb685420cd78a">h</a>  = abs(x - m_destx) + abs(y - m_desty);
<a name="l00199"></a>00199     newnode-&gt;<a class="code" href="class_node.html#a32fbe9e0f4fc9e9d1845ce808738d7ab">f</a>  = newnode-&gt;<a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a> + newnode-&gt;<a class="code" href="class_node.html#afb5a7ac7536a9e09488bb685420cd78a">h</a>;
<a name="l00200"></a>00200     newnode-&gt;<a class="code" href="class_node.html#a59a543130a10c95f1e8642cf8c5645e8">id</a> = Coord2Id(x, y);
<a name="l00201"></a>00201         
<a name="l00202"></a>00202     AddToOpen(newnode);
<a name="l00203"></a>00203     node-&gt;<a class="code" href="class_node.html#a5ce833fd049e87166f1c7acb6a803fba">children</a>[node-&gt;<a class="code" href="class_node.html#a5037540b2e3d6349d66ea25b062b6aa8">numChildren</a>++] = newnode;
<a name="l00204"></a>00204     
<a name="l00205"></a>00205     <span class="comment">//Func(udNotifyChild, node, newnode, 5, NCData);</span>
<a name="l00206"></a>00206   }
<a name="l00207"></a>00207 }  
<a name="l00208"></a>00208 
<a name="l00209"></a>00209 
<a name="l00210"></a>00210 <span class="keywordtype">void</span> AStar::UpdateParent(<a class="code" href="class_node.html">Node</a> *node) {
<a name="l00211"></a>00211   <span class="keywordtype">int</span> g = node-&gt;<a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a>;
<a name="l00212"></a>00212   <span class="keywordtype">int</span> c = node-&gt;<a class="code" href="class_node.html#a5037540b2e3d6349d66ea25b062b6aa8">numChildren</a>;
<a name="l00213"></a>00213   
<a name="l00214"></a>00214   <a class="code" href="class_node.html">Node</a> *child = <a class="code" href="_node_8h.html#a070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
<a name="l00215"></a>00215   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i &lt; c; i++) {
<a name="l00216"></a>00216     child = node-&gt;<a class="code" href="class_node.html#a5ce833fd049e87166f1c7acb6a803fba">children</a>[i];
<a name="l00217"></a>00217     <span class="keywordflow">if</span>(g + 1 &lt; child-&gt;<a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a>) {
<a name="l00218"></a>00218       child-&gt;<a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a> = g + 1;
<a name="l00219"></a>00219       child-&gt;<a class="code" href="class_node.html#a32fbe9e0f4fc9e9d1845ce808738d7ab">f</a> = child-&gt;<a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a> + child-&gt;<a class="code" href="class_node.html#afb5a7ac7536a9e09488bb685420cd78a">h</a>;
<a name="l00220"></a>00220       child-&gt;<a class="code" href="class_node.html#ad8184598cdea70e4bbdfd76f2b0f9e85">parent</a> = node;
<a name="l00221"></a>00221       Push(child);
<a name="l00222"></a>00222     } 
<a name="l00223"></a>00223   }
<a name="l00224"></a>00224   <a class="code" href="class_node.html">Node</a> *parent;
<a name="l00225"></a>00225   
<a name="l00226"></a>00226   <span class="keywordflow">while</span>(m_stack) {
<a name="l00227"></a>00227     parent = Pop();
<a name="l00228"></a>00228     c = parent-&gt;numC22hildren;
<a name="l00229"></a>00229     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i &lt; c; i++) {
<a name="l00230"></a>00230       child = parent-&gt;<a class="code" href="class_node.html#a5ce833fd049e87166f1c7acb6a803fba">children</a>[i];
<a name="l00231"></a>00231 
<a name="l00232"></a>00232       <span class="keywordflow">if</span>(parent-&gt;<a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a> + 1 &lt; child-&gt;<a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a>) {
<a name="l00233"></a>00233         child-&gt;<a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a> = parent-&gt;<a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a> + <a class="code" href="_node_8h.html#a65d456bd1d6bcbf35022277e41f5c9c7">Func</a>(<a class="code" href="class_a_star.html#a6daaa58fc52045c6a4fad6b7a1fec60a">udCost</a>, parent, child, <a class="code" href="_node_8h.html#a71037a5b18b40a73fdfbca2e6ab14992">NC_INITIALADD</a>, <a class="code" href="class_a_star.html#a5a3067f9cf62dd1542f91f90c2b5dc0a">CBData</a>);
<a name="l00234"></a>00234         child-&gt;<a class="code" href="class_node.html#a32fbe9e0f4fc9e9d1845ce808738d7ab">f</a> = child-&gt;<a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a> + child-&gt;<a class="code" href="class_node.html#afb5a7ac7536a9e09488bb685420cd78a">h</a>;
<a name="l00235"></a>00235         child-&gt;<a class="code" href="class_node.html#ad8184598cdea70e4bbdfd76f2b0f9e85">parent</a> = parent;
<a name="l00236"></a>00236         Push(child);
<a name="l00237"></a>00237       }
<a name="l00238"></a>00238     }
<a name="l00239"></a>00239   }
<a name="l00240"></a>00240 }
<a name="l00241"></a>00241 
<a name="l00242"></a>00242 <span class="keywordtype">void</span> AStar::Push(<a class="code" href="class_node.html">Node</a> *node) {
<a name="l00243"></a>00243   <span class="keywordflow">if</span>(!m_stack) {
<a name="l00244"></a>00244      m_stack = <span class="keyword">new</span> <a class="code" href="struct_stack.html">Stack</a>;
<a name="l00245"></a>00245      m_stack-&gt;<a class="code" href="struct_stack.html#afb75952b7ab4d111446c905ccaac037d">data</a> = node;
<a name="l00246"></a>00246      m_stack-&gt;<a class="code" href="struct_stack.html#a7a6cf9dd6bb0d7f33317bbeb1e6a044d">next</a> = <a class="code" href="_node_8h.html#a070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
<a name="l00247"></a>00247   } <span class="keywordflow">else</span> {
<a name="l00248"></a>00248     <a class="code" href="struct_stack.html">Stack</a> *temp = <span class="keyword">new</span> <a class="code" href="struct_stack.html">Stack</a>;
<a name="l00249"></a>00249     temp-&gt;<a class="code" href="struct_stack.html#afb75952b7ab4d111446c905ccaac037d">data</a>  = node;
<a name="l00250"></a>00250     temp-&gt;<a class="code" href="struct_stack.html#a7a6cf9dd6bb0d7f33317bbeb1e6a044d">next</a>  = m_stack;
<a name="l00251"></a>00251     m_stack = temp;
<a name="l00252"></a>00252   }    
<a name="l00253"></a>00253 }
<a name="l00254"></a>00254 
<a name="l00255"></a><a class="code" href="_a_star_8cpp.html#a2a890e9394c92425d095475eb32414ab">00255</a> <a class="code" href="class_node.html">Node</a> <a class="code" href="class_a_star.html">AStar</a>::*<a class="code" href="_a_star_8cpp.html#a2a890e9394c92425d095475eb32414ab">Pop</a>(<span class="keywordtype">void</span>) {
<a name="l00256"></a>00256   <a class="code" href="class_node.html">Node</a> *data  = m_stack-&gt;data;
<a name="l00257"></a>00257   <a class="code" href="struct_stack.html">Stack</a> *temp = m_stack;
<a name="l00258"></a>00258 
<a name="l00259"></a>00259   m_stack = temp-&gt;<a class="code" href="struct_stack.html#a7a6cf9dd6bb0d7f33317bbeb1e6a044d">next</a>;
<a name="l00260"></a>00260   <span class="keyword">delete</span> temp;
<a name="l00261"></a>00261 
<a name="l00262"></a>00262   <span class="keywordflow">return</span> data;
<a name="l00263"></a>00263 }
<a name="l00264"></a>00264 
<a name="l00265"></a><a class="code" href="_a_star_8cpp.html#a63d29989b6c8be8ca755005b31c93d2c">00265</a> <a class="code" href="class_node.html">Node</a> <a class="code" href="class_a_star.html">AStar</a>::*<a class="code" href="_a_star_8cpp.html#a63d29989b6c8be8ca755005b31c93d2c">CheckList</a>(<a class="code" href="class_node.html">Node</a> *node, <span class="keywordtype">int</span> <span class="keywordtype">id</span>) {
<a name="l00266"></a>00266   <span class="keywordflow">while</span>(node) {
<a name="l00267"></a>00267     <span class="keywordflow">if</span>(node-&gt;<a class="code" href="class_node.html#a59a543130a10c95f1e8642cf8c5645e8">id</a> == <span class="keywordtype">id</span>)  <span class="keywordflow">return</span> node; 
<a name="l00268"></a>00268     
<a name="l00269"></a>00269     node = node-&gt;<a class="code" href="class_node.html#a2559a716f69ccaa76d648d9f1b83065e">next</a>;
<a name="l00270"></a>00270   }
<a name="l00271"></a>00271   <span class="keywordflow">return</span> <a class="code" href="_node_8h.html#a070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
<a name="l00272"></a>00272 }
<a name="l00273"></a>00273 
<a name="l00274"></a>00274 <span class="comment">// Get the best node in the open list to enable us to find</span>
<a name="l00275"></a>00275 <span class="comment">// the best route to take.</span>
<a name="l00276"></a><a class="code" href="_a_star_8cpp.html#a5242fe86fc1b29c82815726805e456ad">00276</a> <a class="code" href="class_node.html">Node</a> <a class="code" href="class_a_star.html">AStar</a>::*<a class="code" href="_a_star_8cpp.html#a5242fe86fc1b29c82815726805e456ad">GetBest</a>(<span class="keywordtype">void</span>) {
<a name="l00277"></a>00277   <span class="keywordflow">if</span>(!m_open) { <span class="keywordflow">return</span> <a class="code" href="_node_8h.html#a070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>; }
<a name="l00278"></a>00278   
<a name="l00279"></a>00279   <a class="code" href="class_node.html">Node</a> *temp  = m_open;
<a name="l00280"></a>00280   <a class="code" href="class_node.html">Node</a> *temp2 = m_closed;
<a name="l00281"></a>00281   m_open = temp-&gt;<a class="code" href="class_node.html#a2559a716f69ccaa76d648d9f1b83065e">next</a>;
<a name="l00282"></a>00282 
<a name="l00283"></a>00283   <span class="comment">//Func(udNotifyList, NULL, temp, NL_DELETEOPEN, NCData);                           </span>
<a name="l00284"></a>00284   m_closed = temp;
<a name="l00285"></a>00285   m_closed-&gt;<a class="code" href="class_node.html#a2559a716f69ccaa76d648d9f1b83065e">next</a> = temp2;
<a name="l00286"></a>00286   <span class="comment">//Func(udNotifyList, NULL, m_closed, NL_ADDCLOSED, NCData);</span>
<a name="l00287"></a>00287 
<a name="l00288"></a>00288   <span class="keywordflow">return</span> temp;
<a name="l00289"></a>00289 }
</pre></div></div>
</div>
  <div id="nav-path" class="navpath">
    <ul>
      <li class="navelem"><a class="el" href="_a_star_8cpp.html">AStar.cpp</a>      </li>
      <li class="footer">Generated on Wed Nov 2 2011 23:04:26 for Unuk by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </li>
    </ul>
  </div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark">&#160;</span>Defines</a></div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>


</body>
</html>