注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

游戏记忆...

竹石 Blog

 
 
 

日志

 
 

NAV导航网格寻路(3) -- 一些必要的计算几何知识   

2010-04-06 13:46:13|  分类: 游戏 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

竹石  http://blianchen.blog.163.com/

在继续下面的nav网格生成算法之前,先介绍一下涉及到的计算几何知识。这里只罗列出结论,要详细了解参考相关书籍。

  • 矢量加减法:
     设二维矢量P = ( x1, y1 ),Q = ( x2 , y2 ),则矢量加法定义为: P + Q = ( x1 + x2 , y1 + y2 ),同样的,矢量减法定义为: P - Q = ( x1 - x2 , y1 - y2 )。显然有性质 P + Q = Q + P,P - Q = - ( Q - P )。
  • 矢量叉积
    设矢量P = ( x1, y1 ),Q = ( x2, y2 ),则矢量叉积定义为由(0,0)、p1、p2和p1+p2所组成的平行四边形的带符号的面积,即:P × Q = x1*y2 - x2*y1,其结果是一个标量。显然有性质 P × Q = - ( Q × P ) 和 P × ( - Q ) = - ( P × Q )。
  • 折线段的拐向判断:
      折线段的拐向判断方法可以直接由矢量叉积的性质推出。对于有公共端点的线段p0p1和p1p2,通过计算(p2 - p0) × (p1 - p0)的符号便可以确定折线段的拐向:
      若(p2 - p0) × (p1 - p0) > 0,则p0p1在p1点拐向右侧后得到p1p2。
      若(p2 - p0) × (p1 - p0) < 0,则p0p1在p1点拐向左侧后得到p1p2。
      若(p2 - p0) × (p1 - p0) = 0,则p0、p1、p2三点共线。
  • 判断两线段是否相交:
      我们分两步确定两条线段是否相交:
      (1)快速排斥试验
        设以线段 P1P2 为对角线的矩形为R, 设以线段 Q1Q2 为对角线的矩形为T,如果R和T不相交,显然两线段不会相交。
      (2)跨立试验
        如果两线段相交,则两线段必然相互跨立对方。若P1P2跨立Q1Q2 ,则矢量 ( P1 - Q1 ) 和( P2 - Q1 )位于矢量( Q2 - Q1 ) 的两侧,即( P1 - Q1 ) × ( Q2 - Q1 ) * ( P2 - Q1 ) × ( Q2 - Q1 ) < 0。上式可改写成( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) > 0。当 ( P1 - Q1 ) × ( Q2 - Q1 ) = 0 时,说明 ( P1 - Q1 ) 和 ( Q2 - Q1 )共线,但是因为已经通过快速排斥试验,所以 P1 一定在线段 Q1Q2上;同理,( Q2 - Q1 ) ×(P2 - Q1 ) = 0 说明 P2 一定在线段 Q1Q2上。所以判断P1P2跨立Q1Q2的依据是:( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0。同理判断Q1Q2跨立P1P2的依据是:( Q1 - P1 ) × ( P2 - P1 ) * ( P2 - P1 ) × ( Q2 - P1 ) >= 0。
    NAV导航网格寻路(3) -- 一些必要的计算几何知识  - 竹石 - 游戏...
  • 凸多边形
    假设我们在一个多边形上(包括多边形的边界及边界围封的范围)任意取两点并以一条线段连结该两点,如果线段上的每一点均在该多边形上,那么我们便说这个多边形是凸的。
  • 凸包
    给定平面上的一个(有限)点集(即一组点),这个点集的凸包就是包含点集中所有点的最小面积的凸多边形。
    NAV导航网格寻路(3) -- 一些必要的计算几何知识  - 竹石 - 游戏...
  • 点在凸多边形中的判断
    假设多边形是凸的,而且顶点p0,p1,...,pn按顺时针方向排列,则点在多边形任意一边 pi-1, pi 的右面。
  • Voronoi图及对偶图
    NAV导航网格寻路(3) -- 一些必要的计算几何知识  - 竹石 - 游戏...
  • Delaunay三角剖分(Voronoi对偶图)
    NAV导航网格寻路(3) -- 一些必要的计算几何知识  - 竹石 - 游戏...
    在实际中运用的最多的三角剖分是Delaunay三角剖分,它是一种特殊的三角剖分。先从Delaunay边说起:
        【定义】Delaunay边:假设E中的一条边e(两个端点为a,b),e若满足下列条件,则称之为Delaunay边:存在一个圆经过a,b两点,圆内(注意是圆内,圆上最多三点共圆)不含点集V中任何其他的点,这一特性又称空圆特性。
        【定义】Delaunay三角剖分:如果点集V的一个三角剖分T只包含Delaunay边,那么该三角剖分称为Delaunay三角剖分。
    以下是Delaunay剖分所具备的优异特性:
        1.最接近:以最近临的三点形成三角形,且各线段(三角形的边)皆不相交。
        2.唯一性:不论从区域何处开始构建,最终都将得到一致的结果。
        3.最优性:任意两个相邻三角形形成的凸四边形的对角线如果可以互换的话,那么两个三角形六个内角中最小的角度不会变大。
        4.最规则:如果将三角网中的每个三角形的最小角进行升序排列,则Delaunay三角网的排列得到的数值最大。
        5.区域性:新增、删除、移动某一个顶点时只会影响临近的三角形。
        6.具有凸多边形的外壳:三角网最外层的边界形成一个凸多边形的外壳。
  • 多边形裁剪
    NAV导航网格寻路(3) -- 一些必要的计算几何知识  - 竹石 - 游戏...

    Weiler-Athenton算法

–主多边形:被裁剪多边形,记为A

–裁剪多边形:裁剪窗口,记为B

多边形顶点的排列顺序(使多边形区域位于有向边的左侧 )外环:逆时针 ;内环:顺时针

主多边形和裁剪多边形把二维平面分成两部分。

内裁剪:A∩B

外裁剪:A-B


NAV导航网格寻路(3) -- 一些必要的计算几何知识  - 竹石 - 游戏...

裁剪结果区域的边界由A的部分边界和B的部分边界两部分构成,并且在交点处边界发生交替,即由A的边界转至B的边界,或由B的边界转至A的边界。

如果主多边形与裁剪多边形有交点,则交点成对出现,它们被分为如下两类:

进点:主多边形边界由此进入裁剪多边形内  如,I1,I3, I5, I7, I9, I11

出点:主多边形边界由此离开裁剪多边形区域. 如, I0,I2, I4, I6, I8, I10
NAV导航网格寻路(3) -- 一些必要的计算几何知识  - 竹石 - 游戏...
算法步骤

(1)建立空的裁剪结果多边形的顶点表.

(2)选取任一没有被跟踪过的交点为始点,将其输出到结果多边形顶点表中.

(3)如果该交点为进点,跟踪主多边形边边界;否则跟踪裁剪多边形边界.

(4) 跟踪多边形边界,每遇到多边形顶点,将其输出到结果多边形顶点表中,直至遇到新的交点.

(5)将该交点输出到结果多边形顶点表中,并通过连接该交点的双向指针改变跟踪方向(如果上一步跟踪的是主多边形边界,现在改为跟踪裁剪多边形边界;如果上一步跟踪裁剪多边形边界,现在改为跟踪主多边形边界).

(6)重复(4)、(5)直至回到起点


 

 

  评论这张
 
阅读(5362)| 评论(3)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018