Bezier曲线与曲面(1)

导读:
   3.2.1 Bezier曲线的定义和性质
  
  1.定义
  
  给定空间n+1个点的位置矢量Pi(i=0,1,2,…,n),则Bezier参数曲
  线上各点坐标的插值公式是:
  
  
  
  
  其中,Pi构成该Bezier曲线的特征多边形,Bi,n(t)是n次Bernstein基
  函数:
  
  
  
  
  0° =1, 0!=1
  Bezier曲线实例如图3.1.8所示。
  
  
  
  
   2.Betnstein基函数的性质
  
  (1)正性
  
  
  
  
  (2)端点性质
  
  
  
  
  (3)权性
  
  
  
  由二项式定理可知:
  
  (4)对称性
  
  
  
  
  因为
  
  (5)递推性。
  
  
  
  
  即高一次的Bernstein基函数可由两个低一次的Bernstein调和函数线性
  组合而成。
  因为,
  
  (6)导函数
  
  
  
  
  (7)最大值。 在处达到最大值。
  
  (8)升阶公式
  
  
  
  
  (9)积分
  
  
  
  
   3.Bezier曲线的性质
  
  (1)端点性质
  
  a. 曲线端点位置矢量
  
  由Bernstein基函数的端点性质可以推得,当t=0时,P(0)=P0 ;当t=1
  时,P(1)=Pn。由此可见,Bezier曲线的起点、终点与相应的特征多边形的
  起点、终点重合。
  
  b. 切矢量
  
  因为,所以当t=0时,P’(0)=n(P1-
  P0),当t=1时,P’(1)=n(Pn-Pn-1),这说明Bezier曲线的起点和终点处的
  切线方向和特征多边形的第一条边及最后一条边的走向一致。
  
  c. 二阶导矢
  
  
  
  
  当t=0时,
  当t=1时,
  
  上式表明:2阶导矢只与相邻的3个顶点有关,事实上,r阶导矢只与
  (r+1)个相邻点有关,与更远点无关。
  
  将、及、代入曲率公式,可以
  得到Bezier曲线在端点的曲率分别为:
  
  
  
  
  
  
  
  
  d. k阶导函数的差分表示
  
  n次Bezier曲线的k阶导数可用差分公式为:
  
  
  
  
  其中高阶向前差分矢量由低阶向前差分矢量递推地定义:
  
  
  
  例如:
  
  
  
  
  
  
  
  (2)对称性。由控制顶点构造出的新Bezier
  曲线,与原Bezier曲线形状相同,走向相反。因为:
  
  
  
  这个性质说明Bezier曲线在起点处有什么几何性质,在终点处也有相同的
  性质。
  
  
  
  (3)凸包性
  
  由于,且,这一结果说明
  当t在[0,1]区间变化时,对某一个t值,P(t)是特征多边形各顶点的加权
  平均,权因子依次是。在几何图形上,意味着Bezier曲线P(t)在
  中各点是控制点Pi的凸线性组合,即曲线落在Pi构成的凸包之中,
  如图3.1.9所示。
  
  
  
  
  (4)几何不变性。这是指某些几何特性不随坐标变换而变化的特性。
  Bezier曲线的位置与形状与其特征多边形顶点的位置有关,
  它不依赖坐标系的选择,即有:
  (参变量u是t的置换)
  
  (5)变差缩减性。若Bezier曲线的特征多边形是一个平面图
  形,则平面内任意直线与C(t)的交点个数不多于该直线与其特征多边形的
  交点个数,这一性质叫变差缩减性质。此性质反映了Bezier曲线比其特征
  多边形的波动还小,也就是说Bezier曲线比特征多边形的折线更光顺。
  
  (6)仿射不变性。对于任意的仿射变换A:
  即在仿射变换下,的形式不
  变。
  
   3.2.2 Bezier曲线的递推(de Casteljau)算法
  
  计算Bezier曲线上的点,可用Bezier曲线方程,但使用de Casteljau提
  出的递推算法则要简单的多。
  
  如图3.1.10所示,设、、是一条抛物线上顺序三个不同的点。
  过和点的两切线交于点,在点的切线交和于和,
  则如下比例成立:
  
  
  
  
  这是所谓抛物线的三切线定理。
  
  
  
  
  当P0,P2固定,引入参数t,令上述比值为t:(1-t),即有:
  
  
  
  
  t从0变到1,第一、二式就分别表示控制二边形的第一、二条边,它们
  是两条一次Bezier曲线。将一、二式代入第三式得:
  
  
  
  
  当t从0变到1时,它表示了由三顶点P0、P1、P2三点定义的一条二次
  Bezier曲线。并且表明:这二次Bezier曲线P20可以定义为分别由前两个顶
  点(P0,P1)和后两个顶点(P1,P2)决定的一次Bezier曲线的线性组合。
  依次类推,由四个控制点定义的三次Bezier曲线P30可被定义为分别由(P0,
  P1,P2)和(P1,P2,P3)确定的二条二次Bezier曲线的线性组合,由(n+1)个
  控制点Pi(i=0, 1, ..., n)定义的n次Bezier曲线Pn0可被定义为分别由前、
  后n个控制点定义的两条(n-1)次Bezier曲线P0n-1与P1n-1的线性组合:
  
  
  
  
  由此得到Bezier曲线的递推计算公式:
  
  
  
  
  这便是著名的de Casteljau算法。用这一递推公式,在给定参数下,
  求Bezier曲线上一点P(t)非常有效。上式中:是定义Bezier曲线的
  控制点,即为曲线上具有参数t的点。de Casteljau算法稳定可靠,
  直观简便,可以编出十分简捷的程序,是计算Bezier曲线的基本算法和标准
  算法。
  
  当n=3时,de casteljau算法递推出的Pki呈直角三角形,对应结果如
  图3.1.11所示。从左向右递推,最右边点P30即为曲线上的点。
  
  
  
  
  这一算法可用简单的几何作图来实现。给定参数,就把定义域
  分成长度为的两段。依次对原始控制多边形每一边执行同样的定比
  分割,所得分点就是第一级递推生成的中间顶点,对这些
  中间顶点构成的控制多边形再执行同样的定比分割,得第二级中间顶点
  。重复进行下去,直到n级递推得到一个中间顶点即为
  所求曲线上的点,如图3.1.12所示。
  
  
  
  
   3.2.3 Bezier曲线的拼接
  
  几何设计中,一条Bezier曲线往往难以描述复杂的曲线形状。这是由
  于增加由于特征多边形的顶点数,会引起Bezier曲线次数的提高,而高次
  多项式又会带来计算上的困难,实际使用中,一般不超过10次。所以有时
  采用分段设计,然后将各段曲线相互连接起来,并在接合处保持一定的连
  续条件。下面讨论两段Bezier曲线达到不同阶几何连续的条件。
  
  给定两条Bezier曲线P(t)和Q(t),相应控制点为Pi(i=0, 1, ..., n)
  和Qj(j=0,1,..., m),且令,如图3.1.13所示,
  我们现在把两条曲线连接起来。
  
  
  
  
  (1)要使它们达到G0连续的充要条件是:Pn= Q0;
  
  (2)要使它们达到G1连续的充要条件是:Pn-1,Pn=Q,Q1三点共线,
  即
  
  (3)要使它们达到G2连续的充要条件是:在G1连续的条件下,并满足
  方程。
  
  我们将、和,、代入,
  并整理,可以得到:
  
  
  
  选择和的值,可以利用该式确定曲线段的特征多边形顶点,而
  顶点、已被连续条件所确定。要达到连续的话,只剩下顶点可
  以自由选取。
  
  如果从上式的两边都减去,则等式右边可以表示为和
  的线性组合:
  
  
  
  
  这表明、、、和五点共面,事实上,在接合点两
  条曲线段的曲率相等,主法线方向一致,我们还可以断定:和位于
  直线的同一侧。
  
   3.2.4 Bezier曲线的升阶与降阶
  
   1.Bezier曲线的升阶
  
  所谓升阶是指保持Bezier曲线的形状与定向不变,增加定义它的控制
  顶点数,也即是提高该Bezier曲线的次数。增加了控制顶点数,不仅能增
  加了对曲线进行形状控制的灵活性,还在构造曲面方面有着重要的应用。
  对于一些由曲线生成曲面的算法,要求那些曲线必须是同次的。应用升阶
  的方法,我们可以把低于最高次数的的曲线提升到最高次数,而获得同一
  的次数。
  
  曲线升阶后,原控制顶点会发生变化。下面,我们来计算曲线提升一
  阶后的新的控制顶点。
  
  设给定原始控制顶点,定义了一条n次Bezier曲线:
  
  
  
  
  增加一个顶点后,仍定义同一条曲线的新控制顶点为,
  则有:
  
  
  
  
  对上式左边乘以,得到:
  
  
  
  
  比较等式两边项的系数,得到:
  
  
  
  
  化简即得:
  
  
  
  
  其中。
  
  此式说明:
  
  新的控制顶点是以参数值按分段线性插值从原始特征多边形得出的。
  
  升阶后的新的特征多边形在原始特征多边形的凸包内。
  
  特征多边形更靠近曲线。
  
  三次Bezier曲线的升阶实例如图3.1.14所示。
  
  
  
  
   2.Bezier曲线的降阶
  
  降阶是升阶的逆过程。给定一条由原始控制顶点定义
  的n次Bezier曲线,要求找到一条由新控制顶点定义的n-
  1次Bezier曲线来逼近原始曲线。
  
  假定是由升阶得到,则由升阶公式有:
  
  
  
  从这个方程可以导出两个递推公式:
  
  
  
  和
  
  其中第一个递推公式在靠近处趋向生成较好的逼近,而第二个递推
  公式在靠近处趋向生成较好的逼近。
  
   3.2.5 Bezier曲面
  
  基于Bezier曲线的讨论,我们可以方便地可以给出Bezier曲面的定义
  和性质,Bezier曲线的一些算法也可以很容易扩展到Bezier曲面的情况。
  
   1.定义
  
  设为个空间点列,则次张
  量积形式的Bezier曲面定义为:
  
  
  
  
  其中,是Bernstein基函
  数。依次用线段连接点列中相邻两点所形成的空间
  网格,称之为特征网格。Bezier曲面的矩阵表示式是:
  
  
  
  在一般实际应用中,不大于4。
  
  2.性质
  
  除变差减小性质外,Bezier曲线的其它性质可推广到Bezier曲面:
  
  (1)Bezier曲面特征网格的四个角点正好是Bezier曲面的四个角点,
  即,,,。
  
  (2)Bezier曲面特征网格最外一圈顶点定义Bezier曲面的四条边界;
  Bezier曲面边界的跨界切矢只与定义该边界的顶点及相邻一排顶点有关,
  且、、和(图3.1.15打上斜线的
  三角形);其跨界二阶导矢只与定义该边界的及相邻两排顶点有关。
  
  (3)几何不变性。
  
  (4)对称性。
  
  (5)凸包性。
  
  
  
  
  
  3.Bezier曲面片的拼接
  
  如图3.1.16所示,设两张m×n次Bezier曲面片
  
  
  
  
  分别由控制顶点和定义。
  
  
  
  
  如果要求两曲面片达到连续,则它们有公共的边界,即:
  于是有.
  
  如果又要求沿该公共边界达到连续,则两曲面片在该边界上有公共
  的切平面,因此曲面的法向应当是跨界连续的,即:
  
  
  
  
  下面来研究满足这个方程的两种方法。
  
  (1)鉴于(3.1.10)式,(3.1.11)式最简单的取解是:
  
  
  (3.1.12)
  
  这相当于要求合成曲面上v为常数的所有曲线,在跨界时有切向的连续
  性。为了保证等式两边关于v的多项式次数相同,必须取(一个正
  常数)。于是有:
  
  
  
  即
  
  (2)(3.1.12)式使得两张曲面片在边界达到连续时,只涉及曲
  面和的两列控制顶点,比较容易控制。用这种方法匹配合成
  的曲面的边界,u向和v向是光滑连续的。实际上,该式的限制是苛刻的。
  
  为了构造合成曲面时有更大的灵活性,Bezier在1972年放弃把
  (3.1.12)式作为连续的条件,而以
  (3.1.13),来满足(3.1.11)式,这仅仅要求位于和
  所在的同一个平面内,也就是曲面片边界上相应点处的切平面,这样
  就有了大得多的余地,但跨界切矢在跨越曲面片的边界时就不再连续了。
  
  同样,为了保证等式两边关于v的多项式次数相同,须为任意正常数,
  是v的任意线性函数。
  
   4.递推(de Casteljau)算法
  
  Bezier曲线的递推(de Casteljau)算法,可以推广到Bezier曲面的情形。
  若给定Bezier曲面特征网格的控制顶点和一对参
  数值,则:
  
  
  (3.1.14)
  
  
  (3.1.15)
  或
  
  
  (3.1.16)
  
  (3.1.15)与(3.1.16)中的下标的变化范围已在(3.1.14)式中给出。
  上面给出了确定曲面上一点的两种方案。当按(3.1.15)式方案执行时,先以
  u参数值对控制网格u向的n+1个多边形执行曲线的de Casteljau算法,m级递
  推后,得到沿v向由n+1个顶点构成的中间多边形。再以v参
  数值对它执行曲线的de Casteljau算法,n级递推以后,得到一个,即所
  求曲面上的点。也可以按(3.1.16) 式方案执行,先以v参数值对控制
  网格沿v向的m+1个多边形执行n级递推,得沿u向由m+1个顶点
  构成的中间多边形。再以u参数值对它执行n级递推,得所求点。
  
   3.2.6 三边Bezier曲面片
  
  与上一节定义在矩形域上的Bezier曲面片不同,本节介绍的三边Bezier
  曲面片是定义在三边形域上的,如图3.1.17所示,为了便于区分,我们把上
  一节介绍的Bezier曲面片称为四边Bezier曲面片。三边曲面片能够较好地适
  应不规则与散乱数据的几何造型及适合有限元分析中的三边元素的需要。
  
  
  
  
   1.三角域内点的表示
  
  三角域内一点可以用面积坐标(或重心坐标)来表示,如图3.1.18所示。
  
  
  
  
  G是三角形ABC内的任意一点,其面积坐标为。令三角形ABC面积
  为s,三角形GBC面积为,三角形GCA面积为,三角形GAB面积为,则:
  ,这里所指的三角形面积是有向面积,按顶点字母顺
  序,顺时针旋转为正,逆时针旋转为负。若A=,B=,C=,
  则:
  三个坐标分量u、v和w只有两个是独立的,因为u+v+w=1 。
  三角形ABC称为域三角形,或称为三角域。

本文转自
http://www.blog.edu.cn/user2/waruqi/archives/2006/1452750.shtml
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
从2阶到7阶的贝赛尔曲线 private static final int MAX_COUNT = 7; // 贝塞尔曲线最大阶数 private static final int REGION_WIDTH = 30; // 合法区域宽度 private static final int FINGER_RECT_SIZE = 60; // 矩形尺寸 private static final int BEZIER_WIDTH = 10; // 贝塞尔曲线线宽 private static final int TANGENT_WIDTH = 6; // 切线线宽 private static final int CONTROL_WIDTH = 12; // 控制点连线线宽 private static final int CONTROL_RADIUS = 12; // 控制点半径 private static final int TEXT_SIZE = 40; // 文字画笔尺寸 private static final int TEXT_HEIGHT = 60; // 文本高度 private static final int RATE = 10; // 移动速率 private static final int HANDLER_WHAT = 100; private static final int FRAME = 1000; // 1000帧 private static final String[] TANGENT_COLORS = {"#7fff00", "#7a67ee", "#ee82ee", "#ffd700", "#1c86ee", "#8b8b00"}; // 切线颜色 private static final int STATE_READY = 0x0001; private static final int STATE_RUNNING = 0x0002; private static final int STATE_STOP = 0x0004; private static final int STATE_TOUCH = 0x0010; private Path mBezierPath = null; // 贝塞尔曲线路径 private Paint mBezierPaint = null; // 贝塞尔曲线画笔 private Paint mMovingPaint = null; // 移动点画笔 private Paint mControlPaint = null; // 控制点画笔 private Paint mTangentPaint = null; // 切线画笔 private Paint mLinePaint = null; // 固定线画笔 private Paint mTextPointPaint = null; // 点画笔 private Paint mTextPaint = null; // 文字画笔 private ArrayList mBezierPoints = null; // 贝塞尔曲线点集 private PointF mBezierPoint = null; // 贝塞尔曲线移动点 private ArrayList mControlPoints = null; // 控制点集 private ArrayList<ArrayList<ArrayList>> mTangentPoints; // 切线点集 private ArrayList<ArrayList> mInstantTangentPoints; private int mR = 0; // 移动速率 private int mRate = RATE; // 速率 private int mState; // 状态 private boolean mLoop = false; // 设置是否循环 private boolean mTangent = true; // 设置是否显示切线 private int mWidth = 0, mHe
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值