Files
dl/document/html/dl__astar_8h_source.html
2026-09-16 14:07:40 +08:00

528 lines
83 KiB
HTML
Vendored
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.13.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>dl: D:/dl/dl/misc/dl_astar.h 源文件</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<script type="text/javascript" src="clipboard.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">dl
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- 制作者 Doxygen 1.13.1 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() { codefold.init(0); });
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',false,false,'search.php','搜索',false);
});
/* @license-end */
</script>
<div id="main-nav"></div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function(){ initResizable(false); });
/* @license-end */
</script>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_17297ffb27ce571941f5fb5008f01a1f.html">dl</a></li><li class="navelem"><a class="el" href="dir_f0dc580f54d1d7c03c105e5f92f5d3a8.html">misc</a></li> </ul>
</div>
</div><!-- top -->
<div id="doc-content">
<div class="header">
<div class="headertitle"><div class="title">dl_astar.h</div></div>
</div><!--header-->
<div class="contents">
<a href="dl__astar_8h.html">浏览该文件的文档.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span> </div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="preprocessor">#pragma once</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span> </div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="preprocessor">#include &lt;array&gt;</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#include &lt;vector&gt;</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#include &lt;map&gt;</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#include &lt;list&gt;</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#include &lt;algorithm&gt;</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#include &lt;cassert&gt;</span></div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span> </div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#include &quot;<a class="code" href="dl__log_8h.html">io/dl_log.h</a>&quot;</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="preprocessor">#include &quot;<a class="code" href="dl__string_8h.html">base/dl_string.h</a>&quot;</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span> </div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacedl.html">dl</a></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span>{</div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> </div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> </div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"><a class="line" href="namespacedl.html#af25b35c866c22da3e60020876cd4721b"> 29</a></span> <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> <a class="code hl_variable" href="namespacedl.html#af25b35c866c22da3e60020876cd4721b">ASTAR_SHOW_LOG</a> = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span></div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> COST&gt;</div>
<div class="foldopen" id="foldopen00033" data-start="{" data-end="};">
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star.html"> 33</a></span><span class="keyword">class </span><a class="code hl_function" href="classdl_1_1_a_star.html#a8922ac9e611bdebb5d9cba8aa25ff13f">AStar</a></div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span>{</div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> <span class="comment">// 点类型</span></div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6"> 37</a></span> <span class="keyword">using </span><a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a> = <a class="code hl_enumvalue" href="namespacedl.html#a38a0162879cdbfbbe99ba16e7a170132ab9ece18c950afbfa6b0fdbfa4ff731d3">T</a>;</div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> <span class="comment">// 代价类型(float、int等)</span></div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star.html#af989ec1292396968a634165d2775ebb4"> 39</a></span> <span class="keyword">using </span><a class="code hl_typedef" href="classdl_1_1_a_star.html#af989ec1292396968a634165d2775ebb4">AStarCost</a> = COST;</div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star.html#a9d73d282510f685c3425c6d5f201e7d3"> 40</a></span> <span class="keyword">using </span><a class="code hl_typedef" href="classdl_1_1_a_star.html#a9d73d282510f685c3425c6d5f201e7d3">FuncCost</a> = std::function&lt;<a class="code hl_typedef" href="classdl_1_1_a_star.html#af989ec1292396968a634165d2775ebb4">AStarCost</a>(<span class="keyword">const</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a>&amp;, <span class="keyword">const</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a>&amp;)&gt;;</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star.html#a6ea291cdb5c440152228c200b373930b"> 41</a></span> <span class="keyword">using </span><a class="code hl_typedef" href="classdl_1_1_a_star.html#a6ea291cdb5c440152228c200b373930b">FuncLink</a> = std::function&lt;void(<a class="code hl_function" href="classdl_1_1_a_star.html#a8922ac9e611bdebb5d9cba8aa25ff13f">AStar</a>*, <span class="keyword">const</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a>&amp;)&gt;;</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> </div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> <span class="comment">//节点</span></div>
<div class="foldopen" id="foldopen00044" data-start="{" data-end="};">
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star_1_1_a_star_node.html"> 44</a></span> <span class="keyword">class </span><a class="code hl_class" href="classdl_1_1_a_star_1_1_a_star_node.html">AStarNode</a></div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> {</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star_1_1_a_star_node.html#a9d6df61067d70d20088c702caf175720"> 47</a></span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a> <a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a9d6df61067d70d20088c702caf175720">_xy</a>;</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star_1_1_a_star_node.html#a610dfd933a28cba05579041ed1ada232"> 48</a></span> <a class="code hl_class" href="classdl_1_1_a_star_1_1_a_star_node.html">AStarNode</a>* <a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a610dfd933a28cba05579041ed1ada232">_parent</a>; <span class="comment">//父节点(为空代表起点)</span></div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star_1_1_a_star_node.html#a0a06816197be632181192d5c4030a087"> 49</a></span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#af989ec1292396968a634165d2775ebb4">AStarCost</a> <a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a0a06816197be632181192d5c4030a087">_cost</a>; <span class="comment">//前往这个节点 的代价值</span></div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star_1_1_a_star_node.html#a66177d5845d6e99303f6ac137b5f571f"> 50</a></span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#af989ec1292396968a634165d2775ebb4">AStarCost</a> <a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a66177d5845d6e99303f6ac137b5f571f">_total</a>; <span class="comment">//总代价 cost + 估计代价)</span></div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star_1_1_a_star_node.html#ab64739250e449beb94600ccb5cf51fb4"> 51</a></span> <span class="keywordtype">bool</span> <a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#ab64739250e449beb94600ccb5cf51fb4">_open</a>; <span class="comment">//是否在 Open表</span></div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star_1_1_a_star_node.html#a691ccf808c67ad802d06755afda2d46f"> 52</a></span> <span class="keywordtype">bool</span> <a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a691ccf808c67ad802d06755afda2d46f">_closed</a>; <span class="comment">//是否在 Close表</span></div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> };</div>
</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> </div>
<div class="foldopen" id="foldopen00055" data-start="{" data-end="}">
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star.html#a783ed45b8123c6cf56dab800b76fb3dc"> 55</a></span> <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code hl_function" href="classdl_1_1_a_star.html#a783ed45b8123c6cf56dab800b76fb3dc">AStarNodeCompare</a>(<a class="code hl_class" href="classdl_1_1_a_star_1_1_a_star_node.html">AStarNode</a>* n1, <a class="code hl_class" href="classdl_1_1_a_star_1_1_a_star_node.html">AStarNode</a>* n2)</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> {</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> <span class="keywordflow">return</span> n1-&gt;<a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a66177d5845d6e99303f6ac137b5f571f">_total</a> &gt; n2-&gt;<a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a66177d5845d6e99303f6ac137b5f571f">_total</a>;</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> }</div>
</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> </div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <span class="comment">//优先队列</span></div>
<div class="foldopen" id="foldopen00061" data-start="{" data-end="};">
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star_1_1_a_star_priority_queue.html"> 61</a></span> <span class="keyword">class </span><a class="code hl_class" href="classdl_1_1_a_star_1_1_a_star_priority_queue.html">AStarPriorityQueue</a></div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> {</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> <span class="keyword">public</span>:</div>
<div class="foldopen" id="foldopen00064" data-start="{" data-end="}">
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star_1_1_a_star_priority_queue.html#afbbbac1145a93bd43291caad0a0a0a83"> 64</a></span> <a class="code hl_class" href="classdl_1_1_a_star_1_1_a_star_node.html">AStarNode</a>* <a class="code hl_function" href="classdl_1_1_a_star_1_1_a_star_priority_queue.html#afbbbac1145a93bd43291caad0a0a0a83">Pop</a>()</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> {</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> <a class="code hl_class" href="classdl_1_1_a_star_1_1_a_star_node.html">AStarNode</a>* node = _heap.front();</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> std::pop_heap(_heap.begin(), _heap.end(), <a class="code hl_function" href="classdl_1_1_a_star.html#a783ed45b8123c6cf56dab800b76fb3dc">AStarNodeCompare</a>);</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> _heap.pop_back();</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> <span class="keywordflow">return</span> node;</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> }</div>
</div>
<div class="foldopen" id="foldopen00071" data-start="{" data-end="}">
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star_1_1_a_star_priority_queue.html#ad943f68e1ccd3b22194e2e3a7b0aae65"> 71</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classdl_1_1_a_star_1_1_a_star_priority_queue.html#ad943f68e1ccd3b22194e2e3a7b0aae65">Push</a>(<a class="code hl_class" href="classdl_1_1_a_star_1_1_a_star_node.html">AStarNode</a>* node)</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> {</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> _heap.push_back(node);</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> std::push_heap(_heap.begin(), _heap.end(), <a class="code hl_function" href="classdl_1_1_a_star.html#a783ed45b8123c6cf56dab800b76fb3dc">AStarNodeCompare</a>);</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> }</div>
</div>
<div class="foldopen" id="foldopen00076" data-start="{" data-end="}">
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star_1_1_a_star_priority_queue.html#ab0ff2f2879075728e2d3c3e14f52abd5"> 76</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classdl_1_1_a_star_1_1_a_star_priority_queue.html#ab0ff2f2879075728e2d3c3e14f52abd5">UpdateNode</a>(<a class="code hl_class" href="classdl_1_1_a_star_1_1_a_star_node.html">AStarNode</a>* node)</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> {</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> iter = _heap.begin(); iter != _heap.end(); ++iter)</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> {</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> <span class="keywordflow">if</span> ((*iter)-&gt;_xy == node-&gt;<a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a9d6df61067d70d20088c702caf175720">_xy</a>)</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> {</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> std::push_heap(_heap.begin(), iter + 1, <a class="code hl_function" href="classdl_1_1_a_star.html#a783ed45b8123c6cf56dab800b76fb3dc">AStarNodeCompare</a>);</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> }</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> }</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> }</div>
</div>
<div class="foldopen" id="foldopen00087" data-start="{" data-end="}">
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star_1_1_a_star_priority_queue.html#a8c763f5ba3d03d74b24dbe96336832fb"> 87</a></span> <span class="keywordtype">bool</span> <a class="code hl_function" href="classdl_1_1_a_star_1_1_a_star_priority_queue.html#a8c763f5ba3d03d74b24dbe96336832fb">IsEmpty</a>()</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> {</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> <span class="keywordflow">return</span> _heap.empty();</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> }</div>
</div>
<div class="foldopen" id="foldopen00091" data-start="{" data-end="}">
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star_1_1_a_star_priority_queue.html#a248891617b06aa51998c7b2f78da9061"> 91</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classdl_1_1_a_star_1_1_a_star_priority_queue.html#a248891617b06aa51998c7b2f78da9061">Clear</a>()</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> {</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> _heap.clear();</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> }</div>
</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> <span class="keyword">private</span>:</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> std::vector&lt;AStarNode*&gt; _heap;</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> };</div>
</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> </div>
<div class="foldopen" id="foldopen00099" data-start="{" data-end="}">
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star.html#a541ab5b6e494ef516d62b108c28de034"> 99</a></span> <span class="keyword">inline</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a> <a class="code hl_function" href="classdl_1_1_a_star.html#a541ab5b6e494ef516d62b108c28de034">AbsPoint</a>(<span class="keyword">const</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a>&amp; a, <span class="keyword">const</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a>&amp; b)</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> {</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a> ret{</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> a.x &lt; b.x ? (b.x - a.x) : (a.x - b.x),</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> a.y &lt; b.y ? (b.y - a.y) : (a.y - b.y)</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> };</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> <span class="keywordflow">return</span> ret;</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> }</div>
</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span></div>
<div class="foldopen" id="foldopen00112" data-start="{" data-end="}">
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star.html#a1a5e67b04c53edf6fab70a473525f33c"> 112</a></span> <span class="keyword">inline</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#af989ec1292396968a634165d2775ebb4">AStarCost</a> <a class="code hl_function" href="classdl_1_1_a_star.html#a1a5e67b04c53edf6fab70a473525f33c">AStarGetH</a>(<span class="keyword">const</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a>&amp; p0, <span class="keyword">const</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a>&amp; p1)</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> {</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> <span class="keyword">constexpr</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#af989ec1292396968a634165d2775ebb4">AStarCost</a> ASTAR_K0 = 10;</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> <span class="keyword">constexpr</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#af989ec1292396968a634165d2775ebb4">AStarCost</a> ASTAR_K1 = 14;</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> </div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a> d = <a class="code hl_function" href="classdl_1_1_a_star.html#a541ab5b6e494ef516d62b108c28de034">AbsPoint</a>(p0, p1);</div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> <span class="keywordflow">return</span> ASTAR_K0 * (d.x + d.y) - (std::min)(d.x, d.y) * (2 * ASTAR_K0 - ASTAR_K1);</div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> }</div>
</div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> </div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span></div>
<div class="foldopen" id="foldopen00130" data-start="{" data-end="}">
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star.html#a8922ac9e611bdebb5d9cba8aa25ff13f"> 130</a></span> <a class="code hl_function" href="classdl_1_1_a_star.html#a8922ac9e611bdebb5d9cba8aa25ff13f">AStar</a>(</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a>&amp; size,</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#a9d73d282510f685c3425c6d5f201e7d3">FuncCost</a> func_g,</div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#a9d73d282510f685c3425c6d5f201e7d3">FuncCost</a> func_h = <span class="keyword">nullptr</span>,</div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#a6ea291cdb5c440152228c200b373930b">FuncLink</a> func_link = <span class="keyword">nullptr</span>,</div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> <span class="keywordtype">size_t</span> max_node = 10000) :</div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> _funcG{ func_g },</div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> _funcH{ func_h },</div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> _funcLink{ func_link },</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> _maxNode{ max_node },</div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> _bDiagonal{ true },</div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> _size{}</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> {</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> _arrNodeBank = <span class="keyword">new</span> <a class="code hl_class" href="classdl_1_1_a_star_1_1_a_star_node.html">AStarNode</a>[_maxNode];</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> _masterNode.reserve(_maxNode);</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> assert(_funcG);</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> <span class="keywordflow">if</span> (_funcH == <span class="keyword">nullptr</span>)</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> {</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> _funcH = std::bind(&amp;<a class="code hl_function" href="classdl_1_1_a_star.html#a1a5e67b04c53edf6fab70a473525f33c">AStar::AStarGetH</a>, <span class="keyword">this</span>, std::placeholders::_1, std::placeholders::_2);</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> }</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> }</div>
</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> </div>
<div class="foldopen" id="foldopen00152" data-start="{" data-end="}">
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star.html#af35a1aaa69793520a3b6f149a221f57d"> 152</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classdl_1_1_a_star.html#af35a1aaa69793520a3b6f149a221f57d">SetSize</a>(<span class="keyword">const</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a>&amp; size)</div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> {</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> _size = size;</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> }</div>
</div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span></div>
<div class="foldopen" id="foldopen00166" data-start="{" data-end="}">
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star.html#ae2ede3d24653a0eabe064d9b4804e246"> 166</a></span> <span class="keywordtype">bool</span> <a class="code hl_function" href="classdl_1_1_a_star.html#ae2ede3d24653a0eabe064d9b4804e246">Search</a>(<span class="keyword">const</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a>&amp; source, <span class="keyword">const</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a>&amp; target, <span class="keywordtype">bool</span> target_near,</div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> std::list&lt;AStarPoint&gt;&amp; list_path,</div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> std::list&lt;AStarPoint&gt;* fail_path = <span class="keyword">nullptr</span>)</div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> {</div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="namespacedl.html#af25b35c866c22da3e60020876cd4721b">ASTAR_SHOW_LOG</a>)</div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> <a class="code hl_define" href="dl__log_8h.html#a156fd6dffd62306e07b5b77739680688">log_msg</a>(<span class="stringliteral">&quot;{} -&gt; {}&quot;</span>, source, target);</div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> <span class="comment">//清空</span></div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> _bankCur = 0;</div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> _masterNode.clear();</div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> _queueOpen.Clear();</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> <span class="comment">//起点插入Open表</span></div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> <a class="code hl_class" href="classdl_1_1_a_star_1_1_a_star_node.html">AStarNode</a>* node_start = _get_node(source);</div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> node_start-&gt;<a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#ab64739250e449beb94600ccb5cf51fb4">_open</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> node_start-&gt;<a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a691ccf808c67ad802d06755afda2d46f">_closed</a> = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> node_start-&gt;<a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a0a06816197be632181192d5c4030a087">_cost</a> = 0;</div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> node_start-&gt;<a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a66177d5845d6e99303f6ac137b5f571f">_total</a> = _funcH(source, target);</div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> node_start-&gt;<a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a610dfd933a28cba05579041ed1ada232">_parent</a> = NULL;</div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> _queueOpen.Push(node_start);</div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> </div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> _nodeBest = <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> _xyTarget = target;</div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> <span class="keywordflow">while</span> (!_queueOpen.IsEmpty())</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> {</div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> <span class="comment">//取出 消耗值 最小的节点</span></div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> _nodeBest = _queueOpen.Pop();</div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="namespacedl.html#af25b35c866c22da3e60020876cd4721b">ASTAR_SHOW_LOG</a>)</div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> <a class="code hl_define" href="dl__log_8h.html#aa1cfe5444875c8eca0ea6f6993977d6d">log_info</a>(<span class="stringliteral">&quot;当前最佳节点为:{}&quot;</span>, _nodeBest-&gt;_xy);</div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> <span class="comment">//是目标节点</span></div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> <span class="keywordflow">if</span> (_nodeBest-&gt;_xy == target</div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> || (target_near &amp;&amp; _is_link_node(_nodeBest-&gt;_xy, target)))</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> {</div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> <span class="comment">//构造路径(包含首尾节点)</span></div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> list_path.clear();</div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> <span class="keywordflow">while</span> (_nodeBest)</div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> {</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> list_path.push_front(_nodeBest-&gt;_xy);</div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> _nodeBest = _nodeBest-&gt;_parent;</div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> }</div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> }</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> </div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> <span class="comment">//由于_check_connecting 会增加节点,所以提前判断,并预留一些</span></div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> <span class="keywordflow">if</span> (_bankCur + 32 &gt;= _maxNode)</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> {</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> <span class="keywordflow">if</span> (fail_path)</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> {</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> <span class="comment">//构造路径(包含首尾节点) </span></div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> fail_path-&gt;clear();</div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> <span class="keywordflow">while</span> (_nodeBest)</div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> {</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> fail_path-&gt;push_front(_nodeBest-&gt;_xy);</div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> _nodeBest = _nodeBest-&gt;_parent;</div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> }</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> }</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> }</div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> <span class="comment">//图的连接</span></div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> <span class="keywordflow">if</span> (_funcLink)</div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> _funcLink(<span class="keyword">this</span>, _nodeBest-&gt;_xy);</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> _link_node(_nodeBest-&gt;_xy);</div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> </div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> <span class="comment">//</span></div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> _nodeBest-&gt;_closed = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> }</div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> </div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> <span class="keywordflow">if</span> (fail_path)</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> {</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> <span class="comment">//构造路径(包含首尾节点) </span></div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> <span class="keywordflow">while</span> (_nodeBest)</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> {</div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> fail_path-&gt;push_front(_nodeBest-&gt;_xy);</div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> _nodeBest = _nodeBest-&gt;_parent;</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> }</div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> }</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span> }</div>
</div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> </div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span></div>
<div class="foldopen" id="foldopen00250" data-start="{" data-end="}">
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star.html#a35ce6db852876aefcdea10444ea54ac2"> 250</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classdl_1_1_a_star.html#a35ce6db852876aefcdea10444ea54ac2">AddNode</a>(<span class="keyword">const</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a>&amp; xy, <a class="code hl_typedef" href="classdl_1_1_a_star.html#af989ec1292396968a634165d2775ebb4">AStarCost</a> k_cost)</div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span> {</div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span> <span class="keywordflow">if</span> (_nodeBest-&gt;_parent == <span class="keyword">nullptr</span> ||</div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> _nodeBest-&gt;_parent-&gt;_xy != xy)</div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span> {</div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> <span class="comment">// 代价</span></div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#af989ec1292396968a634165d2775ebb4">AStarCost</a> g = _funcG(_nodeBest-&gt;_xy, xy);</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> <span class="comment">// 如果代价 等于0,说明此节点不可通行</span></div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span> <span class="keywordflow">if</span> (g == 0)</div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> </div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span> <a class="code hl_class" href="classdl_1_1_a_star_1_1_a_star_node.html">AStarNode</a>* actual_node = _get_node(xy);</div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span> </div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span> <span class="comment">// 不在close表</span></div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span> <span class="keywordflow">if</span> (actual_node-&gt;<a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a691ccf808c67ad802d06755afda2d46f">_closed</a> == <span class="keyword">false</span>)</div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span> {</div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> <span class="keywordflow">if</span> (actual_node-&gt;<a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#ab64739250e449beb94600ccb5cf51fb4">_open</a>)</div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span> {</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span> <span class="comment">// 上一个点代价 + 移到自己的代价 </span></div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#af989ec1292396968a634165d2775ebb4">AStarCost</a> new_cost = _nodeBest-&gt;_cost + g * k_cost;</div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span> <span class="comment">// 总代价,自己代价 + 估计代价</span></div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#af989ec1292396968a634165d2775ebb4">AStarCost</a> new_total = new_cost + _funcH(xy, _xyTarget);</div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span> </div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span> <span class="comment">//新的 代价更小 才刷新</span></div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span> <span class="keywordflow">if</span> (new_total &lt; actual_node-&gt;_total)</div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span> {</div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="namespacedl.html#af25b35c866c22da3e60020876cd4721b">ASTAR_SHOW_LOG</a>)</div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span> <a class="code hl_define" href="dl__log_8h.html#aa1cfe5444875c8eca0ea6f6993977d6d">log_info</a>(<span class="stringliteral">&quot;更新节点:{}{}-&gt;{}&quot;</span>, actual_node-&gt;<a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a9d6df61067d70d20088c702caf175720">_xy</a>, actual_node-&gt;<a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a0a06816197be632181192d5c4030a087">_cost</a>, new_cost);</div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> </div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> actual_node-&gt;<a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a610dfd933a28cba05579041ed1ada232">_parent</a> = _nodeBest;</div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> actual_node-&gt;<a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a0a06816197be632181192d5c4030a087">_cost</a> = new_cost;</div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> actual_node-&gt;<a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a66177d5845d6e99303f6ac137b5f571f">_total</a> = new_total;</div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span> _queueOpen.UpdateNode(actual_node);</div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> }</div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span> }</div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span> {<span class="comment">//不在open表,则加入</span></div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> actual_node-&gt;<a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a610dfd933a28cba05579041ed1ada232">_parent</a> = _nodeBest;</div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span> actual_node-&gt;<a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a0a06816197be632181192d5c4030a087">_cost</a> = _nodeBest-&gt;_cost + g * k_cost;</div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span> actual_node-&gt;<a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a66177d5845d6e99303f6ac137b5f571f">_total</a> = actual_node-&gt;<a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a0a06816197be632181192d5c4030a087">_cost</a> + _funcH(xy, _xyTarget);</div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span> </div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span> _queueOpen.Push(actual_node);</div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span> actual_node-&gt;<a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#ab64739250e449beb94600ccb5cf51fb4">_open</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span> </div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="namespacedl.html#af25b35c866c22da3e60020876cd4721b">ASTAR_SHOW_LOG</a>)</div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span> <a class="code hl_define" href="dl__log_8h.html#aa1cfe5444875c8eca0ea6f6993977d6d">log_info</a>(<span class="stringliteral">&quot;增加节点:{}{}&quot;</span>, actual_node-&gt;<a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a9d6df61067d70d20088c702caf175720">_xy</a>, actual_node-&gt;<a class="code hl_variable" href="classdl_1_1_a_star_1_1_a_star_node.html#a0a06816197be632181192d5c4030a087">_cost</a>);</div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"> 296</span> }</div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"> 297</span> }</div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno"> 298</span> }</div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno"> 299</span> }</div>
</div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</span></div>
<div class="foldopen" id="foldopen00304" data-start="{" data-end="}">
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star.html#afd64487e30a1711ced54f2bbef9d46df"> 304</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classdl_1_1_a_star.html#afd64487e30a1711ced54f2bbef9d46df">SetLinkDiagonal</a>(<span class="keywordtype">bool</span> diagonal)</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span> {</div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span> assert(_funcLink == <span class="keyword">nullptr</span>);</div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span> _bDiagonal = diagonal;</div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"> 308</span> }</div>
</div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span></div>
<div class="foldopen" id="foldopen00313" data-start="{" data-end="}">
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star.html#a6b150c00580e815157925f0ba84f50d1"> 313</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classdl_1_1_a_star.html#a6b150c00580e815157925f0ba84f50d1">SetFuncLink</a>(<a class="code hl_typedef" href="classdl_1_1_a_star.html#a6ea291cdb5c440152228c200b373930b">FuncLink</a> func_link)</div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span> {</div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span> _funcLink = func_link;</div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span> }</div>
</div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span> </div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> </div>
<div class="foldopen" id="foldopen00319" data-start="{" data-end="}">
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"><a class="line" href="classdl_1_1_a_star.html#a058c8f1ea4d14cc44d2121c5e32eec7a"> 319</a></span> <a class="code hl_function" href="classdl_1_1_a_star.html#a058c8f1ea4d14cc44d2121c5e32eec7a">~AStar</a>()</div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> {</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span> <span class="keyword">delete</span>[] _arrNodeBank;</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span> }</div>
</div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> AStarNode* _get_node(<span class="keyword">const</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a>&amp; xy)</div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span> {</div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span> <span class="comment">//如果在 主列表 直接返回,如果没有则从节点银行构造一个</span></div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</span> uint64_t index = ((uint64_t)xy.y &lt;&lt; 32) | (uint64_t)xy.x;</div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span> </div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span> AStarNode*&amp; node = _masterNode[index];</div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span> </div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> <span class="keywordflow">if</span> (node)</div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span> {</div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span> <span class="keywordflow">return</span> node;</div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span> }</div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span> {</div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span> <span class="comment">//此处会越界</span></div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span> <span class="keywordflow">if</span> (_bankCur &gt;= _maxNode)</div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"> 339</span> {</div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"> 340</span> <span class="comment">//cout &lt;&lt; &quot;寻路的节点超过上限!&quot; &lt;&lt;;</span></div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"> 341</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span> }</div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"> 343</span> </div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span> node = &amp;_arrNodeBank[_bankCur++];</div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> node-&gt;_xy = xy;</div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span> node-&gt;_open = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span> node-&gt;_closed = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span> <span class="keywordflow">return</span> node;</div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span> }</div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"> 350</span> }</div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span> <span class="keywordtype">void</span> _link_node(<span class="keyword">const</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a>&amp; p)</div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span> {</div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span> <span class="keyword">constexpr</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#af989ec1292396968a634165d2775ebb4">AStarCost</a> ASTAR_K0 = 10;</div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno"> 357</span> <span class="keyword">constexpr</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#af989ec1292396968a634165d2775ebb4">AStarCost</a> ASTAR_K1 = 14;</div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno"> 358</span> </div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno"> 359</span> <span class="keywordflow">if</span> (_size.x == 0)</div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"> 360</span> {</div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno"> 361</span> <a class="code hl_function" href="classdl_1_1_a_star.html#a35ce6db852876aefcdea10444ea54ac2">AddNode</a>({ p.x + 1, p.y }, ASTAR_K0);</div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno"> 362</span> <a class="code hl_function" href="classdl_1_1_a_star.html#a35ce6db852876aefcdea10444ea54ac2">AddNode</a>({ p.x - 1, p.y }, ASTAR_K0);</div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno"> 363</span> <a class="code hl_function" href="classdl_1_1_a_star.html#a35ce6db852876aefcdea10444ea54ac2">AddNode</a>({ p.x, p.y + 1 }, ASTAR_K0);</div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno"> 364</span> <a class="code hl_function" href="classdl_1_1_a_star.html#a35ce6db852876aefcdea10444ea54ac2">AddNode</a>({ p.x, p.y - 1 }, ASTAR_K0);</div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno"> 365</span> <span class="keywordflow">if</span> (_bDiagonal)</div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno"> 366</span> {</div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno"> 367</span> <a class="code hl_function" href="classdl_1_1_a_star.html#a35ce6db852876aefcdea10444ea54ac2">AddNode</a>({ p.x + 1, p.y + 1 }, ASTAR_K1);</div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno"> 368</span> <a class="code hl_function" href="classdl_1_1_a_star.html#a35ce6db852876aefcdea10444ea54ac2">AddNode</a>({ p.x + 1, p.y - 1 }, ASTAR_K1);</div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno"> 369</span> <a class="code hl_function" href="classdl_1_1_a_star.html#a35ce6db852876aefcdea10444ea54ac2">AddNode</a>({ p.x - 1, p.y - 1 }, ASTAR_K1);</div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno"> 370</span> <a class="code hl_function" href="classdl_1_1_a_star.html#a35ce6db852876aefcdea10444ea54ac2">AddNode</a>({ p.x - 1, p.y + 1 }, ASTAR_K1);</div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno"> 371</span> }</div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno"> 372</span> }</div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno"> 373</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno"> 374</span> {</div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno"> 375</span> <span class="keywordflow">if</span> (p.x + 1 &lt; _size.w)</div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno"> 376</span> <a class="code hl_function" href="classdl_1_1_a_star.html#a35ce6db852876aefcdea10444ea54ac2">AddNode</a>({ p.x + 1, p.y }, ASTAR_K0);</div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno"> 377</span> <span class="keywordflow">if</span> (p.x &gt; 0)</div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno"> 378</span> <a class="code hl_function" href="classdl_1_1_a_star.html#a35ce6db852876aefcdea10444ea54ac2">AddNode</a>({ p.x - 1, p.y }, ASTAR_K0);</div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno"> 379</span> <span class="keywordflow">if</span> (p.y + 1 &lt; _size.h)</div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno"> 380</span> <a class="code hl_function" href="classdl_1_1_a_star.html#a35ce6db852876aefcdea10444ea54ac2">AddNode</a>({ p.x, p.y + 1 }, ASTAR_K0);</div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno"> 381</span> <span class="keywordflow">if</span> (p.y &gt; 0)</div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno"> 382</span> <a class="code hl_function" href="classdl_1_1_a_star.html#a35ce6db852876aefcdea10444ea54ac2">AddNode</a>({ p.x, p.y - 1}, ASTAR_K0);</div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno"> 383</span> </div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno"> 384</span> <span class="keywordflow">if</span> (_bDiagonal)</div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno"> 385</span> {</div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno"> 386</span> <span class="keywordflow">if</span> (p.x + 1 &lt; _size.w &amp;&amp; p.y + 1 &lt; _size.h)</div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno"> 387</span> <a class="code hl_function" href="classdl_1_1_a_star.html#a35ce6db852876aefcdea10444ea54ac2">AddNode</a>({ p.x + 1, p.y + 1 }, ASTAR_K1);</div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno"> 388</span> <span class="keywordflow">if</span> (p.x + 1 &lt; _size.w &amp;&amp; p.y &gt; 0)</div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno"> 389</span> <a class="code hl_function" href="classdl_1_1_a_star.html#a35ce6db852876aefcdea10444ea54ac2">AddNode</a>({ p.x + 1, p.y - 1 }, ASTAR_K1);</div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno"> 390</span> <span class="keywordflow">if</span> (p.x &gt; 0 &amp;&amp; p.y &gt; 0)</div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno"> 391</span> <a class="code hl_function" href="classdl_1_1_a_star.html#a35ce6db852876aefcdea10444ea54ac2">AddNode</a>({ p.x - 1, p.y - 1 }, ASTAR_K1);</div>
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno"> 392</span> <span class="keywordflow">if</span> (p.x &gt; 0 &amp;&amp; p.y + 1 &lt; _size.h)</div>
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno"> 393</span> <a class="code hl_function" href="classdl_1_1_a_star.html#a35ce6db852876aefcdea10444ea54ac2">AddNode</a>({ p.x - 1, p.y + 1 }, ASTAR_K1);</div>
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno"> 394</span> }</div>
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno"> 395</span> }</div>
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno"> 396</span> }</div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno"> 400</span> <span class="keywordtype">bool</span> _is_link_node(<span class="keyword">const</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a>&amp; p0, <span class="keyword">const</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a>&amp; p1)</div>
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno"> 401</span> {</div>
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno"> 402</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a> p = <a class="code hl_function" href="classdl_1_1_a_star.html#a541ab5b6e494ef516d62b108c28de034">AbsPoint</a>(p0, p1);</div>
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno"> 403</span> <span class="keywordflow">if</span> (_bDiagonal)</div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno"> 404</span> {</div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno"> 405</span> <span class="keywordflow">return</span> p.x &lt;= 1 &amp;&amp; p.y &lt;= 1;</div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno"> 406</span> }</div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno"> 407</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno"> 408</span> <span class="keywordflow">return</span> p.x + p.y &lt;= 1;</div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno"> 409</span> }</div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno"> 410</span> </div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno"> 411</span> <span class="comment">// 主列表{y, x}</span></div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno"> 412</span> std::unordered_map&lt;uint64_t, AStarNode*&gt;_masterNode;</div>
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno"> 413</span> <span class="comment">// Open表</span></div>
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno"> 414</span> <a class="code hl_class" href="classdl_1_1_a_star_1_1_a_star_priority_queue.html">AStarPriorityQueue</a> _queueOpen;</div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno"> 415</span> <span class="comment">// 节点银行</span></div>
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno"> 416</span> <a class="code hl_class" href="classdl_1_1_a_star_1_1_a_star_node.html">AStarNode</a>* _arrNodeBank;</div>
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno"> 417</span> <span class="comment">// 每次搜索前置0</span></div>
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno"> 418</span> <span class="keywordtype">size_t</span> _bankCur;</div>
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno"> 419</span> <span class="comment">// 遍历节点上限(也是节点银行大小)</span></div>
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno"> 420</span> <span class="keywordtype">size_t</span> _maxNode;</div>
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno"> 421</span> </div>
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno"> 422</span> <span class="comment">// 是否可斜穿</span></div>
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno"> 423</span> <span class="keywordtype">bool</span> _bDiagonal;</div>
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno"> 424</span> <span class="comment">// 不为0则检查越界</span></div>
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno"> 425</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a> _size;</div>
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno"> 426</span> </div>
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno"> 427</span> <span class="comment">//回调函数</span></div>
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno"> 428</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#a9d73d282510f685c3425c6d5f201e7d3">FuncCost</a> _funcG;</div>
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno"> 429</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#a9d73d282510f685c3425c6d5f201e7d3">FuncCost</a> _funcH;</div>
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno"> 430</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#a6ea291cdb5c440152228c200b373930b">FuncLink</a> _funcLink;</div>
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno"> 431</span> </div>
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno"> 432</span> <span class="comment">//临时缓存</span></div>
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno"> 433</span> <a class="code hl_class" href="classdl_1_1_a_star_1_1_a_star_node.html">AStarNode</a>* _nodeBest;</div>
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno"> 434</span> <a class="code hl_typedef" href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">AStarPoint</a> _xyTarget;</div>
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno"> 435</span>};</div>
</div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno"> 436</span>}</div>
<div class="ttc" id="aclassdl_1_1_a_star_1_1_a_star_node_html"><div class="ttname"><a href="classdl_1_1_a_star_1_1_a_star_node.html">dl::AStar::AStarNode</a></div><div class="ttdef"><b>定义</b> <a href="#l00044">dl_astar.h:45</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_1_1_a_star_node_html_a0a06816197be632181192d5c4030a087"><div class="ttname"><a href="classdl_1_1_a_star_1_1_a_star_node.html#a0a06816197be632181192d5c4030a087">dl::AStar::AStarNode::_cost</a></div><div class="ttdeci">AStarCost _cost</div><div class="ttdef"><b>定义</b> <a href="#l00049">dl_astar.h:49</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_1_1_a_star_node_html_a610dfd933a28cba05579041ed1ada232"><div class="ttname"><a href="classdl_1_1_a_star_1_1_a_star_node.html#a610dfd933a28cba05579041ed1ada232">dl::AStar::AStarNode::_parent</a></div><div class="ttdeci">AStarNode * _parent</div><div class="ttdef"><b>定义</b> <a href="#l00048">dl_astar.h:48</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_1_1_a_star_node_html_a66177d5845d6e99303f6ac137b5f571f"><div class="ttname"><a href="classdl_1_1_a_star_1_1_a_star_node.html#a66177d5845d6e99303f6ac137b5f571f">dl::AStar::AStarNode::_total</a></div><div class="ttdeci">AStarCost _total</div><div class="ttdef"><b>定义</b> <a href="#l00050">dl_astar.h:50</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_1_1_a_star_node_html_a691ccf808c67ad802d06755afda2d46f"><div class="ttname"><a href="classdl_1_1_a_star_1_1_a_star_node.html#a691ccf808c67ad802d06755afda2d46f">dl::AStar::AStarNode::_closed</a></div><div class="ttdeci">bool _closed</div><div class="ttdef"><b>定义</b> <a href="#l00052">dl_astar.h:52</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_1_1_a_star_node_html_a9d6df61067d70d20088c702caf175720"><div class="ttname"><a href="classdl_1_1_a_star_1_1_a_star_node.html#a9d6df61067d70d20088c702caf175720">dl::AStar::AStarNode::_xy</a></div><div class="ttdeci">AStarPoint _xy</div><div class="ttdef"><b>定义</b> <a href="#l00047">dl_astar.h:47</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_1_1_a_star_node_html_ab64739250e449beb94600ccb5cf51fb4"><div class="ttname"><a href="classdl_1_1_a_star_1_1_a_star_node.html#ab64739250e449beb94600ccb5cf51fb4">dl::AStar::AStarNode::_open</a></div><div class="ttdeci">bool _open</div><div class="ttdef"><b>定义</b> <a href="#l00051">dl_astar.h:51</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_1_1_a_star_priority_queue_html"><div class="ttname"><a href="classdl_1_1_a_star_1_1_a_star_priority_queue.html">dl::AStar::AStarPriorityQueue</a></div><div class="ttdef"><b>定义</b> <a href="#l00061">dl_astar.h:62</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_1_1_a_star_priority_queue_html_a248891617b06aa51998c7b2f78da9061"><div class="ttname"><a href="classdl_1_1_a_star_1_1_a_star_priority_queue.html#a248891617b06aa51998c7b2f78da9061">dl::AStar::AStarPriorityQueue::Clear</a></div><div class="ttdeci">void Clear()</div><div class="ttdef"><b>定义</b> <a href="#l00091">dl_astar.h:91</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_1_1_a_star_priority_queue_html_a8c763f5ba3d03d74b24dbe96336832fb"><div class="ttname"><a href="classdl_1_1_a_star_1_1_a_star_priority_queue.html#a8c763f5ba3d03d74b24dbe96336832fb">dl::AStar::AStarPriorityQueue::IsEmpty</a></div><div class="ttdeci">bool IsEmpty()</div><div class="ttdef"><b>定义</b> <a href="#l00087">dl_astar.h:87</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_1_1_a_star_priority_queue_html_ab0ff2f2879075728e2d3c3e14f52abd5"><div class="ttname"><a href="classdl_1_1_a_star_1_1_a_star_priority_queue.html#ab0ff2f2879075728e2d3c3e14f52abd5">dl::AStar::AStarPriorityQueue::UpdateNode</a></div><div class="ttdeci">void UpdateNode(AStarNode *node)</div><div class="ttdef"><b>定义</b> <a href="#l00076">dl_astar.h:76</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_1_1_a_star_priority_queue_html_ad943f68e1ccd3b22194e2e3a7b0aae65"><div class="ttname"><a href="classdl_1_1_a_star_1_1_a_star_priority_queue.html#ad943f68e1ccd3b22194e2e3a7b0aae65">dl::AStar::AStarPriorityQueue::Push</a></div><div class="ttdeci">void Push(AStarNode *node)</div><div class="ttdef"><b>定义</b> <a href="#l00071">dl_astar.h:71</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_1_1_a_star_priority_queue_html_afbbbac1145a93bd43291caad0a0a0a83"><div class="ttname"><a href="classdl_1_1_a_star_1_1_a_star_priority_queue.html#afbbbac1145a93bd43291caad0a0a0a83">dl::AStar::AStarPriorityQueue::Pop</a></div><div class="ttdeci">AStarNode * Pop()</div><div class="ttdef"><b>定义</b> <a href="#l00064">dl_astar.h:64</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_html_a058c8f1ea4d14cc44d2121c5e32eec7a"><div class="ttname"><a href="classdl_1_1_a_star.html#a058c8f1ea4d14cc44d2121c5e32eec7a">dl::AStar::~AStar</a></div><div class="ttdeci">~AStar()</div><div class="ttdef"><b>定义</b> <a href="#l00319">dl_astar.h:319</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_html_a1a5e67b04c53edf6fab70a473525f33c"><div class="ttname"><a href="classdl_1_1_a_star.html#a1a5e67b04c53edf6fab70a473525f33c">dl::AStar::AStarGetH</a></div><div class="ttdeci">AStarCost AStarGetH(const AStarPoint &amp;p0, const AStarPoint &amp;p1)</div><div class="ttdoc">默认获取H方法</div><div class="ttdef"><b>定义</b> <a href="#l00112">dl_astar.h:112</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_html_a35ce6db852876aefcdea10444ea54ac2"><div class="ttname"><a href="classdl_1_1_a_star.html#a35ce6db852876aefcdea10444ea54ac2">dl::AStar::AddNode</a></div><div class="ttdeci">void AddNode(const AStarPoint &amp;xy, AStarCost k_cost)</div><div class="ttdoc">添加节点(在func_link回调函数使用)</div><div class="ttdef"><b>定义</b> <a href="#l00250">dl_astar.h:250</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_html_a541ab5b6e494ef516d62b108c28de034"><div class="ttname"><a href="classdl_1_1_a_star.html#a541ab5b6e494ef516d62b108c28de034">dl::AStar::AbsPoint</a></div><div class="ttdeci">AStarPoint AbsPoint(const AStarPoint &amp;a, const AStarPoint &amp;b)</div><div class="ttdef"><b>定义</b> <a href="#l00099">dl_astar.h:99</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_html_a6b150c00580e815157925f0ba84f50d1"><div class="ttname"><a href="classdl_1_1_a_star.html#a6b150c00580e815157925f0ba84f50d1">dl::AStar::SetFuncLink</a></div><div class="ttdeci">void SetFuncLink(FuncLink func_link)</div><div class="ttdoc">修改连接函数</div><div class="ttdef"><b>定义</b> <a href="#l00313">dl_astar.h:313</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_html_a6ea291cdb5c440152228c200b373930b"><div class="ttname"><a href="classdl_1_1_a_star.html#a6ea291cdb5c440152228c200b373930b">dl::AStar::FuncLink</a></div><div class="ttdeci">std::function&lt; void(AStar *, const AStarPoint &amp;)&gt; FuncLink</div><div class="ttdef"><b>定义</b> <a href="#l00041">dl_astar.h:41</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_html_a783ed45b8123c6cf56dab800b76fb3dc"><div class="ttname"><a href="classdl_1_1_a_star.html#a783ed45b8123c6cf56dab800b76fb3dc">dl::AStar::AStarNodeCompare</a></div><div class="ttdeci">static bool AStarNodeCompare(AStarNode *n1, AStarNode *n2)</div><div class="ttdef"><b>定义</b> <a href="#l00055">dl_astar.h:55</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_html_a8922ac9e611bdebb5d9cba8aa25ff13f"><div class="ttname"><a href="classdl_1_1_a_star.html#a8922ac9e611bdebb5d9cba8aa25ff13f">dl::AStar::AStar</a></div><div class="ttdeci">AStar(const AStarPoint &amp;size, FuncCost func_g, FuncCost func_h=nullptr, FuncLink func_link=nullptr, size_t max_node=10000)</div><div class="ttdoc">定制一个A星寻路</div><div class="ttdef"><b>定义</b> <a href="#l00130">dl_astar.h:130</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_html_a9d73d282510f685c3425c6d5f201e7d3"><div class="ttname"><a href="classdl_1_1_a_star.html#a9d73d282510f685c3425c6d5f201e7d3">dl::AStar::FuncCost</a></div><div class="ttdeci">std::function&lt; AStarCost(const AStarPoint &amp;, const AStarPoint &amp;)&gt; FuncCost</div><div class="ttdef"><b>定义</b> <a href="#l00040">dl_astar.h:40</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_html_aa93d8f2aa4aeb8ef15b1f741078e1ab6"><div class="ttname"><a href="classdl_1_1_a_star.html#aa93d8f2aa4aeb8ef15b1f741078e1ab6">dl::AStar::AStarPoint</a></div><div class="ttdeci">T AStarPoint</div><div class="ttdef"><b>定义</b> <a href="#l00037">dl_astar.h:37</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_html_ae2ede3d24653a0eabe064d9b4804e246"><div class="ttname"><a href="classdl_1_1_a_star.html#ae2ede3d24653a0eabe064d9b4804e246">dl::AStar::Search</a></div><div class="ttdeci">bool Search(const AStarPoint &amp;source, const AStarPoint &amp;target, bool target_near, std::list&lt; AStarPoint &gt; &amp;list_path, std::list&lt; AStarPoint &gt; *fail_path=nullptr)</div><div class="ttdoc">搜索</div><div class="ttdef"><b>定义</b> <a href="#l00166">dl_astar.h:166</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_html_af35a1aaa69793520a3b6f149a221f57d"><div class="ttname"><a href="classdl_1_1_a_star.html#af35a1aaa69793520a3b6f149a221f57d">dl::AStar::SetSize</a></div><div class="ttdeci">void SetSize(const AStarPoint &amp;size)</div><div class="ttdef"><b>定义</b> <a href="#l00152">dl_astar.h:152</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_html_af989ec1292396968a634165d2775ebb4"><div class="ttname"><a href="classdl_1_1_a_star.html#af989ec1292396968a634165d2775ebb4">dl::AStar::AStarCost</a></div><div class="ttdeci">COST AStarCost</div><div class="ttdef"><b>定义</b> <a href="#l00039">dl_astar.h:39</a></div></div>
<div class="ttc" id="aclassdl_1_1_a_star_html_afd64487e30a1711ced54f2bbef9d46df"><div class="ttname"><a href="classdl_1_1_a_star.html#afd64487e30a1711ced54f2bbef9d46df">dl::AStar::SetLinkDiagonal</a></div><div class="ttdeci">void SetLinkDiagonal(bool diagonal)</div><div class="ttdoc">设置是否对角线可走(使用默认连接函数才有效)</div><div class="ttdef"><b>定义</b> <a href="#l00304">dl_astar.h:304</a></div></div>
<div class="ttc" id="adl__log_8h_html"><div class="ttname"><a href="dl__log_8h.html">dl_log.h</a></div><div class="ttdoc">日志系统</div></div>
<div class="ttc" id="adl__log_8h_html_a156fd6dffd62306e07b5b77739680688"><div class="ttname"><a href="dl__log_8h.html#a156fd6dffd62306e07b5b77739680688">log_msg</a></div><div class="ttdeci">#define log_msg(...)</div><div class="ttdef"><b>定义</b> <a href="dl__log_8h_source.html#l00281">dl_log.h:281</a></div></div>
<div class="ttc" id="adl__log_8h_html_aa1cfe5444875c8eca0ea6f6993977d6d"><div class="ttname"><a href="dl__log_8h.html#aa1cfe5444875c8eca0ea6f6993977d6d">log_info</a></div><div class="ttdeci">#define log_info(...)</div><div class="ttdef"><b>定义</b> <a href="dl__log_8h_source.html#l00280">dl_log.h:280</a></div></div>
<div class="ttc" id="adl__string_8h_html"><div class="ttname"><a href="dl__string_8h.html">dl_string.h</a></div><div class="ttdoc">字符串相关</div></div>
<div class="ttc" id="anamespacedl_html"><div class="ttname"><a href="namespacedl.html">dl</a></div><div class="ttdef"><b>定义</b> <a href="dl__array_8h_source.html#l00021">dl_array.h:22</a></div></div>
<div class="ttc" id="anamespacedl_html_a38a0162879cdbfbbe99ba16e7a170132ab9ece18c950afbfa6b0fdbfa4ff731d3"><div class="ttname"><a href="namespacedl.html#a38a0162879cdbfbbe99ba16e7a170132ab9ece18c950afbfa6b0fdbfa4ff731d3">dl::KeyCode::T</a></div><div class="ttdeci">@ T</div><div class="ttdef"><b>定义</b> <a href="dl__input_8h_source.html#l00121">dl_input.h:121</a></div></div>
<div class="ttc" id="anamespacedl_html_af25b35c866c22da3e60020876cd4721b"><div class="ttname"><a href="namespacedl.html#af25b35c866c22da3e60020876cd4721b">dl::ASTAR_SHOW_LOG</a></div><div class="ttdeci">constexpr bool ASTAR_SHOW_LOG</div><div class="ttdef"><b>定义</b> <a href="#l00029">dl_astar.h:29</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
制作者&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.13.1
</small></address>
</div><!-- doc-content -->
</body>
</html>