随笔-4  评论-40  文章-117  trackbacks-0

  
     在进行图形求交时,常常需要判定两个图形间是否有包含关系。如点是否包含在线段、平面区域、三维形体中,线段是否包含在平面区域、三维形体中,等等。许多包含判定问题可转化为点的包含判定问题,如判断线段是否在平面上可以转化为判断其两端点是否在平面上。因此下面主要讨论关于点的包含判定算法。

判断点与线段的包含关系,也就是判断点与线的最短距离是否位于容差范围内。造型中常用的线段有三种:

(1)直线段,(2)圆锥曲线段(主要是圆弧),(3)参数曲线(主要是Bezier,B样条与NURBS曲线)。点与面的包含判定也类似地分为三种情况。下面分别讨论。

1、点与直线段的包含判定

假设点坐标为P(x, y, z),直线段端点为P1(x1, y1, z1),P2(x2,y2,z2),则点P到线段P1P2的距离的平方为

d2=(x-x1)2+(y-y1)2+(z-z1)2-[(x2-x1)(x-x1)+(y2-y1)(y-y1)+(z2-z1)(z-z1)]2/[(x2-x1)2+(y2-y1)2+(z2-z1)2]

当d2<a2时,认为点在线段(或其延长线)上,这时还需进一步判断点是否落在直线段的有效区间内。只要对坐标分量进行比较,假设线段两端点的x分量不等(否则所有分量均相等,那么线段两端点重合,线段退化为一点),那么当x-x1与x-x2反号时,点P在线段的有效区间内。

2、点与圆锥曲线段的包含判定

以圆弧为例,假设点的坐标为(x, y, z),圆弧的中心为(x0, y0, z0),半径为r,起始角a1,终止角a2。这些角度都是相对于局部坐标系x轴而言。圆弧所在平面为

    ax+by+cz+d=0

先判断点是否在该平面上,若不在,则点不可能被包含。若在,则通过坐标变换,把问题转换到二维的问题。

给定中心为(x0, y0),半径为r,起始角a1,终止角a2的圆弧,对平面上一点P(x, y),判断P是否在圆弧上,可分二步进行。第一步判断P是否在圆心为(x0, y0),半径为r的圆的圆周上,即下式是否成立:

    

第二步判断P是否在有效的圆弧段内。

3、点与参数曲线的包含判定

设点坐标为P(x, y, z),参数曲线为Q(t)=(x(t), y(t), z(t))。点也参数曲线的求交计算包括三个步骤:

(1)计算参数t值,使P到Q(t)的距离最小;

(2)判断t是否在有效参数区间内(通常为[0,1]);

(3)判断Q(t)与P的距离是否小于a 。若(2),(3)步的判断均为“是”,则点在曲线上;否则点不在曲线上。

第一步应计算t,使得|P-Q(t)|最小,

即 R(t)=(P-Q(t))(P-Q(t))=|P-Q(t)|2最小

根据微积分知识,在该处R'(t)=0即

Q'(t)[P-Q(t)]=0

用数值方法解出t值,再代入曲线参数方程可求出曲线上对应点的坐标。第(2)、(3)步的处理比较简单,不再详述。

4、点与平面区域的包含判定

设点坐标为P(x, y, z),平面方程为ax+by+cz+d=0。则点到平面的距离为

    d=

若d<a ,则认为点在平面上,否则认为点不在平面上。在造型系统中,通常使用平面上的有界区域作为形体的表面。在这种情况下,对落在平面上的点还应进一步判别它是否落在有效区域内。若点落在该区域内,则认为点与该面相交,否则不相交。下面以平面区域多边形为例,介绍有关算法。

判断平面上一个点是否包含在同平面的一个多边形内,有许多种算法,这里仅介绍常用的三种:叉积判断法、夹角之和检验法以及交点计数检验法。

(1)叉积判断法

假设判断点为P0。多边形顶点按顺序排列为P1P2…Pn。如图2.5.2所示。令Vi=Pi-P0, i=1, 2, …, n, Vn+1=V1

那么,P0在多边形内的充要条件是叉积ViXVi+1(i=1, 2, …, n)的符号相同。叉积判断法仅适用于凸多边形。当多边形为凹时,尽管点在多边形内也不能保证上述叉积符号都相同。这时可采用后面介绍的两种方法。

2_5_2.gif (4875 bytes)

图2.5.2 叉积判断法

(2)夹角之和检验法

假设某平面上有点P0和多边形P1P2P3P4P5,如图2.5.3所示。将点P0分别与Pi相连,构成向量Vi=P-P0。假设角 PiP0Pi+1=ai。如果=0,则点P0在多边形之外,如图2.5.3(a)所示。如果=2π,则点P0在多边形之内,如图2.5.3(b)所示。ai可通过下列公式计算:令Si=Vi? Vi+1, Ci=Vi·Vi+1,则tg(ai)=Si/Ci,所以ai=arctg(Si/Ci)且

ai的符号即代表角度的方向。

2_5_3.gif (5201 bytes)

图2.5.3 夹角之和检验法

在多边形边数不太多(<44)的情况下,可以采用下列近似公式计算ai

    当 |Si|≤|Ci|

  当 |Si|>|Ci|

其中d=0.0355573为常数。当Σαi≥π

时,可判P0在多边形内。当Σαi<π 时,可判P0在多边形外。证明略。

(3)交点计数检验法

当多边形是凹多边形,甚至还带孔时,可采用交点计数法判断点是否在多边形内。具体做法是,从判断点作一射线至无穷远:

求射线与多边形边的交点个数。若个数为奇数,则点在多边形内,否则,点在多边形外。

如图2.5.4所示,射线a, c分别与多边形交于二点和四点,为偶数,故判断点A,C在多边形外。而射线b, d与多边形交三点和一点,为奇数,所以B,D在多边形内。

当射线穿过多边形顶点时,必须特殊对待。如图2.5.4所示,射线f过顶点,若将交点计数为2,则会错误地判断F在多边形外。但是,若规定射线过顶点时,计数为1,则又会错误地判断点E在多边形内。正确的方法是,若共享顶点的两边在射线的同一侧,则交点计数加2,否则加1。按这种方法,E点计为2,所以在多边形外;F点计数为1,所以在多边形内。读者可以自己另取一些点来验证。

2_5_4.gif (3218 bytes)

图2.5.4 交点计数法

5、点与二次曲面/参数曲面的包含判定

假设点坐标为P(x0, y0, z0),二次曲面方程为Q(x, y, z)=0,则当|Q(x0, y0, z0)|<? 时,认为点在该二次曲面上,在造型系统中,通常使用裁剪的二次曲面。在这种情况下,还要判断点是否在有效范围内。裁剪的二次曲面通常用有理Bezier或有理B样条的参数空间上的闭合曲线来定义曲面的有效范围,故要把点所对应的参数空间的参数坐标计算出来,再判断该参数坐标是否在参数空间有效区域上。

6、点与三维形体的包含判定

判断点是否被三维形体所包含,可先用前面的方法判断点是否在三维形体的表面上,然后判断点是否在形体内部,其方法因形体不同而异。下面以凸多面体为例说明。

设凸多面体某个面的平面方程为ax+by+cz+d=0,调整方程系数的符号,使当ax+by+cz+d<0时,点(x,y,z)位于该平面两侧中包含该凸多面体的一侧。于是要检验一个点是否在凸多面体内部,只要检验是否它对凸多面体的每一个面均满足以上的不等式即可。

posted on 2007-12-09 20:26 李阳 阅读(4167) 评论(0)  编辑 收藏 引用 所属分类: 算法

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理