dtNavMeshQuery::findLocalNeighbourhood m_tinyNodePool->getNode dtHashRef整数哈希 getPortalPoints dtOverlapPolyPoly2D
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的更多相关文章
- 【算法】哈希表的诞生(Java)
参考资料 <算法(java)> — — Robert Sedgewick, Kevin Wayne <数据结构> ...
- Map容器——HashMap及常用API,及put,get方法解析,哈希码的产生和使用
Map接口 ① 映射(map)是一个存储键/值对的对象.给定一个键,可以查询到它的值,键和值都是对象; ② 键必须是唯一的,值可以重复; ③ 有些映射可以接收null键和null值,而有的 ...
- 哈希,hash
Hash,一般翻译做散列.杂凑,或音译为哈希.----摘自百度百科 先来看个题:给你一坨一些键值集<key,value>,\(key\)的范围是\([1,10^{10}]\),每次询问\( ...
- 全面了解一致性哈希算法及PHP代码实现
在设计一个分布式系统的架构时,为了提高系统的负载能力,需要把不同的数据分发到不同的服务节点上.因此这里就需要一种分发的机制,其实就是一种算法,来实现这种功能.这里我们就用到了Consistent Ha ...
- 浅谈MatrixOne如何用Go语言设计与实现高性能哈希表
目录 MatrixOne数据库是什么? 哈希表数据结构基础 哈希表基本设计与对性能的影响 碰撞处理 链地址法 开放寻址法 Max load factor Growth factor 空闲桶探测方法 一 ...
- HashMap:从源码分析到面试题
1 HashMap简介 HashMap是实现map接口的一个重要实现类,在我们无论是日常还是面试,以及工作中都是一个经常用到角色.它的结构如下: 它的底层是用我们的哈希表和红黑树组成的.所以我们在学习 ...
- memcached的分布式
今天写点周末在火车上看的memcached的东西: 一:memcached的分布式 虽然memcached被称为“分布式”缓存服务器,但是服务器端并没有“分布式”的功能.而是通过客户端来实现的. Me ...
- Memcache笔记04-Memcached机制深入了解
Memcached机制深入了解 ①基于c/s架构 ,协议简单 c/s架构,此时memcached为服务器端,我们可以使用如PHP,c/c++等程序连接memcached服务器. memcached的服 ...
- Memcache技术分享:介绍、使用、存储、算法、优化、命中率
1.memcached 介绍 1.1 memcached 是什么? memcached 是以LiveJournal旗下Danga Interactive 公司的Brad Fitzpatric 为首开发 ...
随机推荐
- Coroutine的原理以及实现
最近在写WinForm,在UI界面需要用到异步的操作,比如加载数据的同时刷系进度条,WinForm提供了不少多线程的操作, 但是多线程里,无法直接修改主线程里添加的UI的get/set属性访问器(可以 ...
- ZH奶酪:Ubuntu 14.04安装LAMP(Linux,Apache,MySQL,PHP)
(Linux Operating System,Apache Web Server,MySQL database,PHP) 首先,一个三行命令搞定的方法: sudo apt-get update su ...
- 分布式系列四: HTTP及HTTPS协议
分布式系列四: HTTP及HTTPS协议 非常全面的一篇HTTP的文章: 关于HTTP协议,一篇就够了 还有一个帮助理解HTTPS的文章: 也许,这样理解HTTPS更容易 本文的一些描述摘自这篇文章 ...
- MATLAB更换编辑器配色方案
MATLAB的默认编辑配色方案白色,长时间面对高亮度的白色界面容易产生眼睛疲劳的感觉,那么如何更换编辑器配色方案呢?经过不断探索以及查阅资料,发现了下列几种配色方案.配色文件来源于https://gi ...
- 论文阅读 | 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 摘 ...
- Java Spring Boot VS .NetCore (九) Spring Security vs .NetCore Security
Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...
- 移动 ProgramData\Package Cache 文件夹
装完vs2017 发现C盘快木有空间了… 瞅瞅C盘下有啥能删的好释放下空间 就找到了 Package Cache 文件夹,占用空间接近15G… 查查这个文件夹还不建议删除… (http://super ...
- Pylon5 SDK搭配OpenCV使用入门
本文假设已经安装了Basler官网提供的Pylon 目前最新的版本是5.0.5,如果上述链接打不开,请直接所有Basler官网下载,需要注意的是在安装Pylon5时要选择Developer模式,这样才 ...
- [转]Windows 安装Kafka
来源:https://www.cnblogs.com/liuyuhua/p/5329926.html https://www.cnblogs.com/xinlingyoulan/p/6054361.h ...
- 一、ESP8266入门(基于LUA开发)
序 一入坑便停不下来... 还挺有意思的哈,233,,,, 资料杂,自己一个一个去找确实浪费了不少时间,而且大多还都是英文的,需要硬着头皮看. 这次实践入门,更是对英语的重要确信无疑.Github必须 ...