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. Coroutine的原理以及实现

    最近在写WinForm,在UI界面需要用到异步的操作,比如加载数据的同时刷系进度条,WinForm提供了不少多线程的操作, 但是多线程里,无法直接修改主线程里添加的UI的get/set属性访问器(可以 ...

  2. ZH奶酪:Ubuntu 14.04安装LAMP(Linux,Apache,MySQL,PHP)

    (Linux Operating System,Apache Web Server,MySQL database,PHP) 首先,一个三行命令搞定的方法: sudo apt-get update su ...

  3. 分布式系列四: HTTP及HTTPS协议

    分布式系列四: HTTP及HTTPS协议 非常全面的一篇HTTP的文章: 关于HTTP协议,一篇就够了 还有一个帮助理解HTTPS的文章: 也许,这样理解HTTPS更容易 本文的一些描述摘自这篇文章 ...

  4. MATLAB更换编辑器配色方案

    MATLAB的默认编辑配色方案白色,长时间面对高亮度的白色界面容易产生眼睛疲劳的感觉,那么如何更换编辑器配色方案呢?经过不断探索以及查阅资料,发现了下列几种配色方案.配色文件来源于https://gi ...

  5. 论文阅读 | A Curriculum Domain Adaptation Approach to the Semantic Segmentation of Urban Scenes

    paper链接:https://arxiv.org/pdf/1812.09953.pdf code链接:https://github.com/YangZhang4065/AdaptationSeg 摘 ...

  6. Java Spring Boot VS .NetCore (九) Spring Security vs .NetCore Security

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

  7. 移动 ProgramData\Package Cache 文件夹

    装完vs2017 发现C盘快木有空间了… 瞅瞅C盘下有啥能删的好释放下空间 就找到了 Package Cache 文件夹,占用空间接近15G… 查查这个文件夹还不建议删除… (http://super ...

  8. Pylon5 SDK搭配OpenCV使用入门

    本文假设已经安装了Basler官网提供的Pylon 目前最新的版本是5.0.5,如果上述链接打不开,请直接所有Basler官网下载,需要注意的是在安装Pylon5时要选择Developer模式,这样才 ...

  9. [转]Windows 安装Kafka

    来源:https://www.cnblogs.com/liuyuhua/p/5329926.html https://www.cnblogs.com/xinlingyoulan/p/6054361.h ...

  10. 一、ESP8266入门(基于LUA开发)

    序 一入坑便停不下来... 还挺有意思的哈,233,,,, 资料杂,自己一个一个去找确实浪费了不少时间,而且大多还都是英文的,需要硬着头皮看. 这次实践入门,更是对英语的重要确信无疑.Github必须 ...