
-- I am too lazy to write my own documentation right now, this is what doxygen was designed for right?
400 lines
35 KiB
HTML
400 lines
35 KiB
HTML
<!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 <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 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 List</span></a></li>
|
|
<li><a href="globals.html"><span>File 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 <stdlib.h></span>
|
|
<a name="l00002"></a>00002 <span class="preprocessor">#include "<a class="code" href="_a_star_8h.html">AStar.h</a>"</span>
|
|
<a name="l00003"></a>00003 <span class="preprocessor">#include "<a class="code" href="_node_8h.html">Node.h</a>"</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'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-><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-><a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a> = 0;
|
|
<a name="l00065"></a>00065 temp-><a class="code" href="class_node.html#afb5a7ac7536a9e09488bb685420cd78a">h</a> = abs(destx - startx) + abs(desty - starty);
|
|
<a name="l00066"></a>00066 temp-><a class="code" href="class_node.html#a32fbe9e0f4fc9e9d1845ce808738d7ab">f</a> = temp-><a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a> + temp-><a class="code" href="class_node.html#afb5a7ac7536a9e09488bb685420cd78a">h</a>;
|
|
<a name="l00067"></a>00067 temp-><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-><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'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-><a class="code" href="class_node.html#a32fbe9e0f4fc9e9d1845ce808738d7ab">f</a> > node-><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-><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'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-><a class="code" href="class_node.html#a2559a716f69ccaa76d648d9f1b83065e">next</a> = addnode;
|
|
<a name="l00102"></a>00102 addnode-><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-><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-><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-><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-><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-><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-><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 < 2; i++) {
|
|
<a name="l00148"></a>00148 <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = -1; j < 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) && (j == 0) || !<a class="code" href="_node_8h.html#a65d456bd1d6bcbf35022277e41f5c9c7">Func</a>(<a class="code" href="class_a_star.html#a2c97615a0ad52039bec2a7ceaab772a2">udValid</a>, node, &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, &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-><a class="code" href="class_node.html#aff1029a518bdc2651007b8856f958364">x</a>;
|
|
<a name="l00161"></a>00161 <span class="keywordtype">int</span> y = temp-><a class="code" href="class_node.html#aa3e5b5240023b4528ae85057b3324202">y</a>;
|
|
<a name="l00162"></a>00162 <span class="keywordtype">int</span> g = temp-><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-><a class="code" href="class_node.html#a5ce833fd049e87166f1c7acb6a803fba">children</a>[node-><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 < check->g) {
|
|
<a name="l00173"></a>00173 check-><a class="code" href="class_node.html#ad8184598cdea70e4bbdfd76f2b0f9e85">parent</a> = node;
|
|
<a name="l00174"></a>00174 check-><a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a> = g;
|
|
<a name="l00175"></a>00175 check-><a class="code" href="class_node.html#a32fbe9e0f4fc9e9d1845ce808738d7ab">f</a> = g+check-><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-><a class="code" href="class_node.html#a5ce833fd049e87166f1c7acb6a803fba">children</a>[node-><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 < check->g) {
|
|
<a name="l00184"></a>00184 check-><a class="code" href="class_node.html#ad8184598cdea70e4bbdfd76f2b0f9e85">parent</a> = node;
|
|
<a name="l00185"></a>00185 check-><a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a> = g;
|
|
<a name="l00186"></a>00186 check-><a class="code" href="class_node.html#a32fbe9e0f4fc9e9d1845ce808738d7ab">f</a> = g+check-><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-><a class="code" href="class_node.html#ad8184598cdea70e4bbdfd76f2b0f9e85">parent</a> = node;
|
|
<a name="l00197"></a>00197 newnode-><a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a> = g;
|
|
<a name="l00198"></a>00198 newnode-><a class="code" href="class_node.html#afb5a7ac7536a9e09488bb685420cd78a">h</a> = abs(x - m_destx) + abs(y - m_desty);
|
|
<a name="l00199"></a>00199 newnode-><a class="code" href="class_node.html#a32fbe9e0f4fc9e9d1845ce808738d7ab">f</a> = newnode-><a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a> + newnode-><a class="code" href="class_node.html#afb5a7ac7536a9e09488bb685420cd78a">h</a>;
|
|
<a name="l00200"></a>00200 newnode-><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-><a class="code" href="class_node.html#a5ce833fd049e87166f1c7acb6a803fba">children</a>[node-><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-><a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a>;
|
|
<a name="l00212"></a>00212 <span class="keywordtype">int</span> c = node-><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 < c; i++) {
|
|
<a name="l00216"></a>00216 child = node-><a class="code" href="class_node.html#a5ce833fd049e87166f1c7acb6a803fba">children</a>[i];
|
|
<a name="l00217"></a>00217 <span class="keywordflow">if</span>(g + 1 < child-><a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a>) {
|
|
<a name="l00218"></a>00218 child-><a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a> = g + 1;
|
|
<a name="l00219"></a>00219 child-><a class="code" href="class_node.html#a32fbe9e0f4fc9e9d1845ce808738d7ab">f</a> = child-><a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a> + child-><a class="code" href="class_node.html#afb5a7ac7536a9e09488bb685420cd78a">h</a>;
|
|
<a name="l00220"></a>00220 child-><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->numC22hildren;
|
|
<a name="l00229"></a>00229 <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i < c; i++) {
|
|
<a name="l00230"></a>00230 child = parent-><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-><a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a> + 1 < child-><a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a>) {
|
|
<a name="l00233"></a>00233 child-><a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a> = parent-><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-><a class="code" href="class_node.html#a32fbe9e0f4fc9e9d1845ce808738d7ab">f</a> = child-><a class="code" href="class_node.html#a0b249888eacdec6c623ec8c58b230c48">g</a> + child-><a class="code" href="class_node.html#afb5a7ac7536a9e09488bb685420cd78a">h</a>;
|
|
<a name="l00235"></a>00235 child-><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-><a class="code" href="struct_stack.html#afb75952b7ab4d111446c905ccaac037d">data</a> = node;
|
|
<a name="l00246"></a>00246 m_stack-><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-><a class="code" href="struct_stack.html#afb75952b7ab4d111446c905ccaac037d">data</a> = node;
|
|
<a name="l00250"></a>00250 temp-><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->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-><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-><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-><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-><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-><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 22:46:22 for Unuk by 
|
|
<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"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark"> </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>
|