• CAGD: 第七章 NURBS曲线的计算与应用


        第七章 NURBS曲线的计算与应用    

    7.1 有理de Casteljau算法

    对于给定的有理Bézier曲线:

             7.1.1

    由于它是带权控制顶点定义的非有理次Bézier曲线在超平面上的透视投影,因此对于的计算可直接采用非有理Bézier曲线的de Casteljau算法计算由定义的高一维空间的非有理次Bézier曲线,最后取其在超平面的投影即可。这也可以看作分别同时对的分子和分母执行非有理的de Casteljau算法,最后相除即可。下面我们举例说明这一计算过程。

    给定控制顶点及权因子,定义一条平面有理二次Bézier曲线

    求曲线上参数为的点。求解步骤如下:

    1. 确定带权控制顶点

    2. 以参数对带权控制顶点执行de Casteljau算法:

    3. 上的中心投影,即用最后一个表示权因子的坐标除以其余各坐标分量,得到该有理二次Bézier曲线上所求的点

    由此例可以看出,对于有理Bézier曲线上点的计算,其方法与非有理Bézier曲线的方法完全一样,所不同的是计算量有所增加,增加了乘法、加法和一次除法。已有的基于de Casteljau算法的程序几乎不加改动就可使用。

    然而,如果某些权因子较大,那么de Casteljau算法产生的中间控制顶点就不在原控制顶点的凸包之内,这将导致计算精度的损失。因而必须寻求另外的计算有理Bézier曲线的算法,即有理de Casteljau算法。

    有理de Casteljau算法的基本思想是将非有理de Casteljau算法产生的每一中间带权控制顶点投影到超平面上,即:

    7.1.2

    7.1.3

    那么,

    中间控制顶点可显式表示如下:

    7.1.4

    有理de Casteljau算法显然花费较大,但却更准确和稳定。因为对于非负的权因子,中间点位于的凸包之内,因此保证了数值稳定性。

    有理de Casteljau算法的提出类似于非有理de Casteljau算法。非有理de Casteljau算法源于抛物线的三切线定理,利用了仿射参数变换共线三点的定比不变。而有理de Casteljau算法则源于抛物线的四切线定理,利用了射影变换共线四点的交比不变。下面我们对其进一步作以讨论。

    是顺序两个中间带权控制顶点连线的中点:

    那么,有:

    该四点在超平面上的四个投影点之交比保持不变,即:

    带权辅助顶点的投影如下:

    时,有。由此可见,辅助顶点直接与原始控制顶点及权因子相关。在原始控制顶点固定的条件下,给定权因子就能求出。反之,给定辅助顶点也能求出权因子。因此,,可以用作形状参数。沿控制多边形的边移动将影响曲线的形状。当移动靠近时,曲线将被拉向该顶点;反之则推离该顶点。对设计者来说,通过这种间接的方法改变权因子比直接改变权因子更为方便直观。

    7.2 有理Bézier曲线的分割与升阶

    7.2.1 有理Bézier曲线的分割

    如同非有理的de Casteljau算法可以用来分割曲线一样,有理de Casteljau算法亦可用来进行曲线分割。

    对于给定的有理Bézier曲线:

    曲线上的点分成两段,其每一段仍然是有理次Bézier曲线,定义它们的控制顶点和权因子就是用有理de Casteljau算法计算点时所得到的一系列中间控制顶点和中间权因子。

    具体说,若用分别表示两侧的有理Bézier曲线,且其控制顶点和权因子分别记为,则

    (7.2.1)

    即:

    7.2.2

    7.2.3

    7.2.2 有理Bézier曲线的升阶

    一条有理Bézier曲线形式上可表示为一条有理Bézier曲线,即:

    其中:

    7.2.4

    这实质上等价于先对带权控制顶点定义的非有理Bézier曲线应用非有理Bézier曲线的升阶算法,然后再将生成的新的带权控制顶点投影到超平面上,即得到升阶后新的控制顶点。

    证明

    更一般地,一条有理Bézier曲线可以形式上表示成一条有理Bézier曲线:

    其中:

    7.2.5

    7.3 有理Bézier曲线的几何作图

    非有理Bézier曲线可以方便地应用几何作图法求曲线上的点,其理论原理就是de Casteljau算法,分割是它的副产品,升阶算法也可以用几何作图给出。上面我们介绍的有理Bézier曲线的计算都可以通过对带权控制顶点执行相应的非有理Bézier曲线的算法,然后取其投影得到。由于带权控制顶点要比给定控制顶点高一维,因而对带权控制顶点的几何作图不可能进行,而只能凭想象与计算进行。那么我们能否直接对控制顶点进行几何作图呢?我们先以有理二次Bézier曲线为例作以讨论。

    给定控制顶点及权因子,所定义的有理二次Bézier曲线如下:

    其中

    若令

    则有

    的几何意义是点以比例 将边分成两部分;的几何意义是点以比例 将边分成两部分。那么将的连线以比例分成两部分的点就是有理二次Bézier曲线上参数为的点。这就是有理二次Bézier曲线的几何作图法。

    有理二次Bézier曲线还有另外一种几何作图法:先按上述方法求出点,然后以比例分割弦线,求得分割点,那么连线之交点即为参数为的点。其根据是所有控制顶点及首末权因子不变,仅改变内权因子时,所得的一族有理二次Bézier曲线上等参数值的点都位于过控制顶点的直线上。

    下面,我们进一步讨论有理Bézier曲线的几何作图问题。由有理de Casteljau算法,可知:

    (7.3.1)

    可见,第一级中间控制顶点分控制多边形的边成两段的长度比为:

    相应地,式(7.3.1)可改写为:

    (7.3.2)

    重复上述过程,一般地有:

    (7.3.3)

    至第级几何作图得到一个点,即为所求曲线上的点。特别,当所有的时,就得到了非有理Bézier曲线的几何作图法。

    7.4 有理Bézier曲线的导矢

    前面介绍的所有的有理Bézier曲线的算法实质上都是非有理Bézier曲线相应算法的推广。然而,导矢的计算却不能推广,其原因是带权控制顶点定义的非有理Bézier曲线的导矢在超平面上的投影不等于曲线投影的导矢,因此,求导只能对有理分式进行。与非有理相比,有理Bézier曲线的导矢计算要复杂得多。

    ,则,即。对其两边关于阶导数,则有:

    从而有

    (7.4.1)

    这就是有理次Bézier曲线的导数递推公式。

    对于首末两端点而言,其一阶导矢和曲率分别如下:

    7.4.2

    7.4.3

    7.5 有理de Boor-Cox算法

    对于给定的NURBS曲线:

    其中次B样条基函数由节点矢量所确定。为了计算NURBS曲线上参数为的点,同样可应用非有理B样条曲线的de Boor-Cox算法计算由带权控制顶点定义的高一维空间的非有理B样条曲线上的点,然后取其在超平面上的投影即可,这样做所带来的弊端与有理Bézier曲线情况下一样。因此,我们这里给出有理de Boor-Cox算法。

    ,那么,有理de Boor-Cox算法如下:

    7.5.1

    7.5.2

    其中,是节点的重数,若不是节点,则。那么

    1. NURBS曲线的节点插入与顶点插入

    7.6.1 节点插入

    NURBS曲线的节点插入算法类似于非有理B样条,它实质上是有理de Boor-Cox算法求NURBS曲线上一点时的第一级递推。

    若将参数作为新的节点插入到节点矢量之中后,那么NURBS曲线可表示成如下的形式

    其中, 是节点矢量定义的次规范B样条基函数,控制顶点和权因子满足以下条件:

    7.6.1

    7.6.2

    7.6.3

    这仅涉及到个节点,个控制顶点,以及个权因子,即用生成的中间顶点和权因子取代老顶点与老权因子,而保持其余顶点与权因子不变。该算法可图解如下:

    图7.2 节点插入

    7.6.2 顶点插入

    若在控制多边形的边上指定一点,将其作为NURBS曲线的一个控制顶点点,我们反求需要插入的节点

    我们知道控制顶点仅影响到段曲线只影响曲线段,那么两个顶点共同影响的曲线段为 。由于点位于边上,所以,要插入的节点必属于上述个节点区间之一,即

     

    那么参数即为要插入的节点。

    1. NURBS曲线的形状修改

    7.7.1 重新定位控制顶点

    移动控制顶点以修改NURBS曲线的形状,这是一种最简单的形状修改方法。然而,简单地移动顶点对曲线进行形状修改往往是试探性的和交互进行的。因而通常采用的方法是使曲线在其上指定点沿指定方向移动某个距离,反算出要被移动的控制顶点的新位置。

    给定一条NURBS曲线,由控制顶点,权因子,及节点矢量定义。用有理基函数表示为:

    其中,

    若指定该曲线上参数为的点,一个方向矢量和一距离,计算控制顶点的新位置,以使曲线上的点沿移动距离到新位置可表示如下:

    由此可得

    于是,有

    (7.7.1)

    从而立即得到新的控制顶点

    这里存在一个应该移动哪个顶点的问题,如果选择不当将事与愿违,达不到修形的目的。当我们指定曲线上一点后,该点的参数可能已经知道。若未知,可通过反算得到。所在的节点区间也就确定,因此曲线上该点至多与个控制顶点有关。若移动其他顶点,对点所在的那段曲线将不会产生影响。所以,所选顶点应是这个顶点之一,并且应考虑这顶点中对曲线上点影响最大的顶点或某个合适的顶点,以免移动顶点引起曲线其他部分不希望的过影响。最大影响顶点对应于点参数处的一组有理基函数中取最大值的那个基函数,即标号满足条件:

    (7.7.2)

    1. 重新确定权因子

    权因子对NURBS曲线的影响,是当保持控制顶点与其他权因子不变,某个权因子的减小或增大将使曲线远离或拉近相应顶点。

    假设给定一条NURBS曲线上参数为的点,要使曲线在该点拉向或推离控制顶点一个距离,以得到一个新位置。这可通过重新确定相应权因子的新值来达到,下面我们求之值。

    设曲线上点的参数,那么所在曲线段与个控制顶点个权因子相关。便是这个权因子中的一个。

    根据权因子的几何意义,新的权因子是四点 的交比:

    是四点的交比:

    联立两式,则有:

    (7.7.3)

    这里取有向距离,若之间,即曲线被拉向顶点,则为正,反之为负。

    重新确定权因子的修改方法可按以下步骤实现:

    1. 拾取曲线上一点,并确定该点的参数值
    2. 拾取控制多边形的一个顶点
    3. 在直线上拾取一点
    4. 根据公式(7.7.3)计算出新的权因子,重新生成修改后的曲线.

    在步骤(2)中拾取的点不必一定是控制多边形的顶点,也可以是某一条边上的点。在这种情况下,必须利用前面的顶点插入技术插入一个新的节点,以使拾取的点成为一个新的控制顶点。

    1. 同时改变两个权因子

    在较多情况下,想要曲线在点同时拉向或推离顺序相邻的两个顶点,以得到新位置。这时就需要同时改变两个老权因子成为

    在三角形内,则有:

    中,也应在三角形内,所以:

    若令,则

    (7.7.4)

    其实,这些常数不必通过计算有理基函数来求得,可通过图7.3 中所示的几何关系给出。由于它们分别是点在三角形中的两个重心坐标,于是有:

    7.7.5

    这里,都是控制多边形的边上的点,。为了使不为零,必须有;为使非零,必须有。要使两者均不为零,参数,否则向两个控制顶点的同时推拉将变成向其中一个控制顶点的推拉。

    1. 对界定曲线部分的修改

    所谓对界定曲线部分的修改,是指对指定的那部分曲线进行修改,而不改变其他部分曲线。因此,首先要使界定的NURBS曲线部分局部化。这有两种方法:其一是在该部分的定义区间两端设置重节点,这可由插入节点实现。然而,插入节点后新的控制顶点随后被移动,可能会导致曲线参数以及几何不连续。这样的曲线一旦用于曲面构造,将引起曲面的不光滑。另一种方法是对所拾取的曲线部分所在定义区间通过插入单个节点对该界定部分曲线进行细分。首先判别区间端点参数值是否为现有节点,若不是,则把它们插入节点矢量。然后逐次找出区间内的最长节点区间,取中点参数值,插入节点矢量中。重复这一过程,直到定义区间内包括两端节点在内的节点数目等于个为止。记住,控制顶点与权因子仅影响定义在上的那部分曲线,把区间两端节点计在内,该区间共含有个节点。

    一旦细化节点矢量确定下来,可由节点插入算法计算出新控制顶点以代替老控制顶点。其中就有某一新顶点及相关的权因子将仅仅影响所界定的那部分曲线。现在,就可用前述方法对该曲线部分进行形状修改。

    这种形状修改方法的缺点是:节点矢量细化后,相应部分控制多边形更靠近曲线。由于变差缩减性,曲线在所选取两端点邻近将不会有太大的改变。当然,新控制多边形靠曲线太近也是一个缺陷,因为此时,控制多边形与曲线之间的有效空间更小,限制了拉操作的范围。采用同时推拉,可在一定程度上消除这一缺陷。

    当然,这里介绍的形状修改只是基于距离的,那么如何通过曲线与控制多边形之间所围面积的改变,或者封闭曲线所围面积的改变来修改曲线的形状呢?有关这一问题,尚没有解决方法的报道。

    7.8 有理插值

    7.8.1 整体有理插值

    插值是非常重要的离散数据拟合技术之一尤其以三次插值曲线最为常用。在有理参数曲线情况下,插值问题的一般提法是:给定三维数据点,参数值及数据点处的权因子,构造一条三次NURBS曲线顺序通过这些数据点,且使曲线在这些点处具有给定的权因子。这里的问题就是要从给定的数据点、参数值和权因子反求出该NURBS曲线的节点矢量、控制顶点及权因子

    由于有理曲线是高一维空间的非有理曲线在超平面上的投影,因此有理插值可以看成是插值带权数据点的问题,解出插值带权数据点的的非有理B样条曲线的控制顶点,然后取其在超平面上的投影,即可求得要求的控制顶点和权因子

    下面,我们具体讨论有理插值问题的求解。设所求的三次NURBS曲线如下:

    1. 确定节点矢量以定义三次B样条基函数。这可直接通过插值点的参数值延拓得到:

      其中,

      值得注意的是,我们这里给定了插值处的参数值。如果不知道插值点处的参数值,这也是工程中经常出现的情况,那么我们则需通过数值方法将插值数据参数化。此时有两种方法:一是不考虑权因子,像非有理插值那样确定数据点的参数化(均匀参数化、累加弦长参数化、向心参数化等),这种做法难以生成光顺的有理插值曲线;二是对带权数据点进行参数化,同样参照非有理插值数据点的参数化方法进行,不过是在高一维空间进行罢了,这样确定的参数化对于由带权数据点生成的齐次曲线是光顺的,因而其投影即所求有理插值曲线之光顺性也将是好的。但曲线上点沿曲线弧长的分布情况未必合适,尤其是当相邻两数据点的权因子相差悬殊时更显突出。这样,曲线参数化的两个方面就出现了矛盾的情况。在非有理插值中,我们没感到存在这一问题。那么,应当怎样对待有理插值中出现的这一问题呢?从实际应用看,矛盾的主要方面是要生成光顺的曲线形状,而曲线上点分布状况是其次要方面,应服从于前者。

    2. 求解带权数据点插值问题。

      对于的齐次曲线

      根据插值条件,有:

      即:

    3. 边界条件

      如果,那么求得的有理曲线就是开曲线。由于只有个插值条件,但却有个未知量,所以要想求解就必须给定两个边界条件。边界条件有两种选择,但切矢边界条件最为常用。

      假设给定曲线首末端点的切矢,由于插值是在四维空间进行,因而就要求找出在四维空间首末端点的切矢信息:

      因为,所以

      由此,我们需要确定首末端点处权因子的一阶导数

      在确定节点矢量的基础上,我们可以构造权因子关于参数的一维三次插值样条函数,由此求出,于是

      由于节点矢量中两端节点重数为3,所以三次样条曲线的首末端点就是首末数据点,即:

      在首末端点处分别有切矢,而

      所以,附加方程为:

      这样有个未知量,个方程,便构成一个完整的方程组,写成矩阵形式如下:

    4. 在超平面上的投影,则有

      经过以上四步,便求得了要求的有理插值曲线。

      在有理插值的这种求解中,存在一个极为严重的问题,那就是所求有理插值曲线很可能有奇点。因为带权数据点的最后一个分量是数据点处的权因子,它的正性不能保证所求带权控制顶点的最后一个分量亦是正的。换言之,对如上的线性方程组,当非齐次项均为正值,其解的非负性得不到保证。有关这一问题至今还没有完美的解决方案。

      7.8.2 局部有理插值

      整体有理插值的不足是所求插值曲线往往不能满足形状处理的要求,而且其修改是整体的。因此,为了增加有理插值曲线的柔性,可采用分段连续的局部方案,这就是所谓的局部有理插值。

      问题的提法是:给定三维空间的插值数据点构造一分段连续的有理三次样条曲线,使其顺序通过这些给定的数据点。

      构造的基本步骤如下:

      ① 确定各数据点处的切矢。对顺序的五个数据点处的切矢确定如下:

      其中,

      数据点处切矢的确定可分别按以下情况处理:在周期闭曲线情况下,,可令,仍采用上述方法确定。

      在非周期情况下,采用Bessel条件确定,即:

      ② 在数据点之间确定一有理三次Bézier曲线,其控制顶点确定如下:

      这里是可调形状参数。权因子可按以下方式确定:

      通过给定曲线段一点或指定两端点处的曲率值来确定。

      ③ 将分段有理三次Bézier曲线合并成NURBS表示。

      7.8.3 曲率插值

      有理三次曲线段可以用来求解曲率插值问题:给定控制顶点及两端点处的曲率值,求权因子使其相应的有理三次Bézier曲线在处分别具有给定的曲率。不失一般性,我们设,由曲率公式可知:

      那么:

      注意,对于平面曲线,是代数值(有正负),那么应是相对曲率。

    image

    欢迎访问我的专业知识博客!
    博主:白途思(begtostudy)
    微信/QQ:370566617
    Email:begtostudy#gmail.com
    欢迎访问我的其他博客:我的编程知识博客 我的学术知识博客

  • 相关阅读:
    《Unity3d-控制枪口的朝向代码》
    《Unity3D-鱼的方向 鱼的游动 控制代码》
    《unity3d-随机设置一个物体的scale的方法》
    《Unity3d-在地图中随机生成一个物体的代码》
    《Unity3D-控制检测碰撞以后触发的事件之敌人的攻击行为》
    《Unity3D-播放被打中的时候粒子的特效的代码》
    《Unity3D-敌人血条或者玩家血条控制的代码》
    《Unity3D-自动寻路功能的实现》
    Unity 行首不出现中文标点
    Unity 多级下拉菜单
  • 原文地址:https://www.cnblogs.com/begtostudy/p/2229062.html
Copyright © 2020-2023  润新知