recast_navigation dtIntersectSegmentPoly2D 2D上的线段与多边形相交计算 产生结果:是否相交,线段跨越的开始和结束百分比,相交的边

dtIntersectSegmentPoly2D(startPos, endPos, verts, nv, tmin, tmax, segMin, segMax):

 

 

参看: http://geomalgorithms.com/vector_products.html

 

首先:

2D perp Operator

表示一个向量(v1,v2)的逆时针法线

 

然后,在2D空间上,还有一个概念叫做Perp Product

起含义是:

(signed) area of the 2D parallelogram spanned by v and w,也就是v和w所覆盖2D 平的行四边形的有向面积

 

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

 

inline float dtVperp2D(const float* u, const float* v)
{

    return u[2]*v[0] - u[0]*v[2];

}

 

解释:所有的都是映射到xz平面上进行的,perp2D前面加V所以是反的。

 

const float n = dtVperp2D(edge, diff);表示的是diff product edge

const float d = dtVperp2D(dir, edge);

fabsf(d) < EPS 表示edge与要测试的这条线平行,

n < 0表示edge在diff的右边,则表示没机会相交了,

如果>=0 也就是有可能与多边形相交,continue

 

t = n / d;

 

d<0 说明dir在edge的右边

也就是说明dir是向着多边形里面来的

这个时候会影响tmin

如果t > tmin说明找到了更加先碰撞到的边所以要更新tmin和tseg

一开始tmin是0,什么时候会t>0? 也就是d<0,且n<0?也就是edge在diff右边,且dir在edge右边

也就是说如果最后tmin是被修改过了的,那么p0在多边形内部

 

 

总之这个函数判断线段与poly是否相交

segMin和segMax分别表示最先和最后碰撞到的线段

tmin,tmax表示的是这条线段目前相交的部分是从百分之多少到百分之多少

如果终点在polygon里面,则tmax大于1

以tmin计算为例:

 

很明显当t=0的时候说明n=0说明出发点在edge上

阅读更多
个人分类: 算法 寻路
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭