dtNavMeshQuery::findLocalNeighbourhood(dtPolyRef startRef, const float* centerPos, const float radius, const dtQueryFilter* filter,

dtPolyRef* resultRef, dtPolyRef* resultParent, int* resultCount, const int maxResult):

先把startNode加入stack

把startNode加入resultRef中

While(stack不空)

{

dtNode* curNode = stack[0];出队列

获得curTile和curPoly

遍历curPoly的所有link

{

根据link->ref获得neighbourRef

neighbourNode = 在m_tinyNodePool 中getNode

如果找到了则返回这个node,如果没有找到就分配一个node

如果这个node已经DT_NODE_CLOSED访问过了,则continue

然后获得neighbourTile, neighbourPoly

如果neighbour是offmeshconnection,或者不能passFilter,则continue

getPortalPoints获得两个polygon的portal    va   vb

dtDistancePtSegSqr2D (centerPos, va, vb, tseg);算出centerPos到va,vb的距离,也就是到neibour的距离

这一步,centerpos的y轴是有影响的

如果距离超过了radiusSqr,则continue;

neighbourNode设置为DT_NODE_CLOSED,且其pidx设置为当前node

接下来检查这个neighbourPoly是否与我们已经找到的polygon重叠

Pa记录neighbourPoly的顶点

从resultRef中掏出所有的polygon

{

先判断是否跟curPoly连接,如果连接则说明肯定不是重叠的

否则把这个polygon的顶点放在pb里面

dtOverlapPolyPoly2D(pa,npa, pb,npb) 判断是否重叠

这一步因为是映射到了xz平面所以y轴的值是没有影响的

}

if (overlap) continue;

否则 放入resultRef

放入stack中

}遍历curPoly的所有link结束

}stack空

最多找到的结果不能超过maxResult个,超过了就返回status |= DT_BUFFER_TOO_SMALL

总之就是:一个一个node进队列,找neighbour,直到都超过距离了,队列空了为止,或者超过了设置的上限。

=========================================================================================

m_tinyNodePool->getNode

通过dtHashRef算出bucket

在m_first哈希表中找到m_Nodes的坐标

m_nodes[i]中记录的id和state都对应上了,就是找到了

否则在m_next[i]获得m_nodes中的下一个位置

找到了就返回,找不到的话这个i就是我们要插入node的位置

其实就是对m_nodes[i]进行init

然后

m_next[i] = m_first[bucket];

m_first[bucket] = i;

相当于插在了链表的最前边

=====

dtHashRef整数哈希?

https://www.cnblogs.com/napoleon_liu/archive/2010/12/29/1920839.html

目的: 1. 函数要是可逆的(1对1的映射) 
       2. 雪崩效应(输入中1bit的变化 影响 输出中1/4 到 1/2的bits变化)

可逆靠的是可逆操作:

key + const_value 加法是可逆 
    key - const_value 减法是可逆 
    key ^ const_value 异或是可逆的 
    ~key 取反也是可逆的 
    key * const_value 乘以一个奇数也是可逆的

====

getPortalPoints (dtPolyRef
from,
const
dtPoly*
fromPoly,
const
dtMeshTile*
fromTile,

dtPolyRef to,
const
dtPoly*
toPoly,
const
dtMeshTile*
toTile,
float*
left,
float*
right):

从fromPoly的每一个link开始找,如果ref是toPoly,就是找到了

找不到说明参数错了

如果fromPoly是offmeshconnection那么找到ref对应的to的边的两个点存在left和right

如果toPoly是offmeshconnection那么找到ref对应的from的边的两个点存在left和right

否则就是用之前找到的link获得两个点赋给left和right

最后,如果if (link->side
!= 0xff)是tile的boundry

用link->bmin和link->bmax解压出插值的比例算出left和right

====

dtOverlapPolyPoly2D (const
float*
polya,
const
int
npolya,

const float*
polyb,
const
int
npolyb):

for(polya中的所有边)

{

根据每个边算出n[3]
= { vb[2]-va[2],
0, -(vb[0]-va[0])
};

N相当于这个边在xz轴上投影,然后垂直

把n当成轴,进行

projectPoly(n,
polya,
npolya,
amin,amax);

projectPoly(n,
polyb,
npolyb,
bmin,bmax);

也就是把每个边分辨在n上投影,算出投影在n轴上的整个poly的坐标amin,amax

然后overlapRange(amin,amax,
bmin,bmax,
eps)看两个poly投影的结果是否有重叠。但凡有没重叠的情况,两个poly肯定不想交。

}

与上面相同,遍历polyb

dtNavMeshQuery::findLocalNeighbourhood m_tinyNodePool->getNode dtHashRef整数哈希 getPortalPoints dtOverlapPolyPoly2D的更多相关文章

  1. 【算法】哈希表的诞生(Java)

    参考资料 <算法(java)>                           — — Robert Sedgewick, Kevin Wayne <数据结构>       ...

  2. Map容器——HashMap及常用API,及put,get方法解析,哈希码的产生和使用

    Map接口 ①   映射(map)是一个存储键/值对的对象.给定一个键,可以查询到它的值,键和值都是对象; ②   键必须是唯一的,值可以重复; ③   有些映射可以接收null键和null值,而有的 ...

  3. 哈希,hash

    Hash,一般翻译做散列.杂凑,或音译为哈希.----摘自百度百科 先来看个题:给你一坨一些键值集<key,value>,\(key\)的范围是\([1,10^{10}]\),每次询问\( ...

  4. 全面了解一致性哈希算法及PHP代码实现

    在设计一个分布式系统的架构时,为了提高系统的负载能力,需要把不同的数据分发到不同的服务节点上.因此这里就需要一种分发的机制,其实就是一种算法,来实现这种功能.这里我们就用到了Consistent Ha ...

  5. 浅谈MatrixOne如何用Go语言设计与实现高性能哈希表

    目录 MatrixOne数据库是什么? 哈希表数据结构基础 哈希表基本设计与对性能的影响 碰撞处理 链地址法 开放寻址法 Max load factor Growth factor 空闲桶探测方法 一 ...

  6. HashMap:从源码分析到面试题

    1 HashMap简介 HashMap是实现map接口的一个重要实现类,在我们无论是日常还是面试,以及工作中都是一个经常用到角色.它的结构如下: 它的底层是用我们的哈希表和红黑树组成的.所以我们在学习 ...

  7. memcached的分布式

    今天写点周末在火车上看的memcached的东西: 一:memcached的分布式 虽然memcached被称为“分布式”缓存服务器,但是服务器端并没有“分布式”的功能.而是通过客户端来实现的. Me ...

  8. Memcache笔记04-Memcached机制深入了解

    Memcached机制深入了解 ①基于c/s架构 ,协议简单 c/s架构,此时memcached为服务器端,我们可以使用如PHP,c/c++等程序连接memcached服务器. memcached的服 ...

  9. Memcache技术分享:介绍、使用、存储、算法、优化、命中率

    1.memcached 介绍 1.1 memcached 是什么? memcached 是以LiveJournal旗下Danga Interactive 公司的Brad Fitzpatric 为首开发 ...

随机推荐

  1. 初步认识Promise

    在解释什么是Promise之前,先看一道练习题,做完练习题也就知道Promise到底是干嘛用的了. 假设现在有个需求:你要封装一个方法,我给你一个要读取文件的路径,你这个方法能帮我读取文件,并把内容返 ...

  2. python 读写文件中 w与wt ; r与rt 的区别

    w,r,wt,rt都是python里面文件操作的模式.w是写模式,r是读模式.t是windows平台特有的所谓text mode(文本模式),区别在于会自动识别windows平台的换行符.类Unix平 ...

  3. 【原创】大数据基础之Spark(4)RDD原理及代码解析

    一 简介 spark核心是RDD,官方文档地址:https://spark.apache.org/docs/latest/rdd-programming-guide.html#resilient-di ...

  4. 【原创】大数据基础之Ambari(1)简介、编译安装、使用

    官方:http://ambari.apache.org/ The Apache Ambari project is aimed at making Hadoop management simpler ...

  5. 【原创】大叔问题定位分享(28)openssh升级到7.4之后ssh跳转异常

    服务器集群之间忽然ssh跳转不通 # ssh 192.168.0.1The authenticity of host '192.168.0.1 (192.168.0.1)' can't be esta ...

  6. activiti 涉及的内容

    1 JAVA 委派模式(Delegate) https://blog.csdn.net/mayaofr/article/details/52082665 2 Activiti中的activiti:ex ...

  7. 新建的亚马逊云服务器EC2 ping 不通 解决方案

    在EC2配置安全组里面新加一条规则

  8. 利用Centos服务器来搭建自己的splash,不再被安装的各种环境繁琐而担忧

    Centos7.5 ----- docker ------- splash               第一步:服务器环境的配置               第二步:dcoker环境的配置       ...

  9. pta编程总结1

    7-1 打印沙漏 (20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 所谓"沙漏形状",是指每行输出奇数个符 ...

  10. [原创]Zynq AXI-CDMA测试结果

    经过研究与demo,在zynq上使用axi-cmda效率还是很高,测试报告如下所示 对于读取32KB,GP0和HP0的测试结果如下: