抛物样条曲线

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

把新的Si和Si+1代入Pi+1(t),得到:
Pi+1(t)=(-4t2+4t2-t)Pi+(12t2-10t2+1)Pi+1 +(-12t2+8t2+t)Pi+2+(4t2-2t2)Pi+3
式中:0t 0.5 总共有n个点,只能确定 (n-3)段分段曲线 i=1,2,3, ……n-3 该式的实质是:每四个相邻的数据点 P P P 可以确定中间一段抛物样条曲线。 P
2 3 1 n n+1 n-1 0 n-2
如何添加这P0和Pn+1两个点,就是 要讨论的 端点条件。
(1) 已知曲线两端的切矢(P1’和Pn’) 这种条件称为夹紧端。适用于新生成 的曲线要和已经存在的曲线或者直线 相连接,这样已有曲线或直线在连接 端的切矢就决定了新曲线在该点的切 矢。
根据抛物线的性质:P2’=P3-P1 即可得 P1=P3-P2’ P2 P2’ P1 P3 以此可推出,如果P1’和Pn’已知,则 P1’=P2-P0 P0=P2-P1’ Pn’=Pn+1-Pn-1 Pn+1=Pn-1+Pn’
例如有实验曲线、等值线等,它们都 是通过做实验得到一些实验数据、或 经测量得到一系列离散数据点。依据 这些实际数据,我们希望能构造出一 条曲线,使其完全通过或者比较贴近 这些数据点。 拟合曲线的问题:讨论由离散的 数据点如何构成曲线的方法。
在计算机图形学这个领域里讨论的曲 线,一般都是指的拟合曲线。要讨论 的问题:已知一组数据点(型值点), 选用哪种数学方法来加以拟合,相应 的数学表达方式以及如何绘制成曲线。 为了说清这些问题,还须先从标准曲 线开始。
我们设统一后的参变量为 t,并且使 其定义域为:0t0.5,则有: T=2t ti=0.5+t ti+1=t
于是合成曲线的以上表达式: Pi+1(t)=f1(T)*Si(ti)+f2(T)*Si+1(ti+1) 可以改写成以下形式: Pi+1(t)=(1-2t)*Si(t+0.5)+2t*Si+1(t) 其中: Si(t+0.5)=(2t2-t)Pi+(1-4t2)Pi+1+ (2t2+t)Pi+2 Si+1(t)=(2t2-3t+1)Pi+1+(4t-4t2)Pi+2 +(2t2-t)Pi+3 (0t0.5)
n 2 i 1
Pi+1
Pi+2
Pi+1(t)
Pi+3
3.抛物样条曲线的端点条件
根据以上得到的结果,每相邻四个点 可以确定一段样条曲线。以此类推, 我们可以得到后续的各段曲线。但全 部 n 个数据点,总共只能产生 n-3 个 曲线段。还有首、尾两端 P1P2和 Pn-1Pn 之间的曲线无法确定。
首、尾两端曲线无法确定的原因在于 缺乏连续的相邻四点。所以解决问题 P P P P P 的方法也就是要想办法补足四点。即 P P P 在P1前补一点P0,在Pn后补一点Pn+1, 以使首、尾两端具备有相邻四点的条 件:P0、P1、P2、P3和Pn-2、Pn-1、Pn、 Pn+1。从而可产生P1P2曲线段和 Pn-1Pn 曲线段。(见图)
当参数 t=ti 时: xi=a•cos(ti) (xi+1,yi+1) yi=b•sin(ti) (xi,yi) t 当参数 t=ti+t 时: ti x i+1=a•cos(ti +t ) y i+1=b•sin(ti +t ) 当 t 相当小时,我们认为在椭圆上两 点之间的弧长就可以用该两点之间的 弦长来代替。 (见图)
(2) 自由端 对曲线的两端没有约束条件,我们称 为自由端。这时让新补之点和原端点 重合,即 P0=P1 Pn+1=Pn
4.抛物样条曲线的性质 不管用什么方法由离散点生成曲线, 总希望所得到的曲线是连续光滑的。 用来评价曲线连续光滑程度的指标是 曲线在节点处的导数能满足于什么样 的条件。假如在节点处两曲线的一阶 导数相等,则我们称曲线为一阶连续 (C¹ 连续);而如果两曲线的二阶导 数相等,则我们称曲线为二阶连续( C² 连续)。以此类推。
3.1.1 抛物样条曲线
一、绘制曲线的基本方法 在设计和绘图中,几乎不可能没有曲 线。这些曲线一般分为两类:一类是 标准曲线,可以有标准的数学方程来 描述,如圆、椭圆、抛物线等;另一 类是拟合曲线,它们不能用标准的数 学方程来描述,只有先给出一些数据 点,然后用相应的数学方法来拟合这 些数据点成曲线。
5.程序及图例 绘制抛物样条曲线的程序见教材p111 marking( ) 标记型值点。 parspl( ) 绘制曲线。 main( ) 完成初始设置,读入数据文 件。
这个程序说明了绘制曲线的一般方法, 用离散的直线段代替了曲线。致於直 线段长度的取值则决定于对曲线的精 度要求。显然,参变量的增量越小, 则离散直线段的长度越短,于是得到 的曲线精度越高。
(另外,还可以应用两角和的三角公式来简化 程序中的运算步骤)
二、抛物样条曲线 用抛物线作为基本曲线,通过一定的 数学方法,把一组离散的数据点用一 条复合的曲线光滑地连接起来。
下面我们来看抛物样条曲线的情况: 设它们的相邻两段为Pi+1(t)和Pi+2(t), Pi+1(t)=(-4t +4t -t)Pi+(12t2-10t2+1)Pi+1 +(-12t2+8t2+t)Pi+2+(4t2-2t2)Pi+3
P
i+1
Pi+1(t) 2 节点处 2t=0.5
P
i+2
Pi+2(t) 节点处t=0
(t=0) (t=1) (t=0.5)
解以上的联列方程组,可得: A1=P1 A2=4*P2-P3-3*P1 A3=2*P1+2*P3-4*P2 故抛物线的参数表达式就可以唯一确 定为: P(t)=A1+A2*t+A3*t2 =P1+(4*P2-P3-3*P1)t+ (2*P1+2*P3-4*P2) t2 (0t1)
从以上的分析可得出绘制曲线的基本 方法有两条:
• 离散化 这是由于硬件的条件 决定的,理想化的曲线是绘不出来 的。 • 参数法 这是由于曲线的质量 要求决定的。
下面我们以一个椭圆为例,来说明其 绘图过程和程序。
椭圆的参数方程为:(中心在原点) x=a • cos(t) y=b • sin(t) (0t2)
2 i 1

t i 1 ) Pi 3
(0ti,ti+11)
一般来说,两段曲线 Si 和 Si+1 在其 重叠区间是不可能完全自然重合的。 见图 Pi+1 (t)
Pi+1(t) S i (ti ) Pi Pi+1 Pi+2 Pi+3 S i+1(t i+1)
但是,整个点列必须是只能用一条曲 线连接起来的。为了做到这一点,在 两条曲线的共同区间内,必须想法让 它们按照一定的规则结合组成一条曲 线。有效的办法就是 加权合成。 所谓的加权合成,就是用权函数来分 配原曲线在形成的合成曲线中各自所 占的比例。
要求三个未知数,必须设三个独立的 条件。因抛物线过该三点,所以设: (1) 抛物线以 P1 为始点,即 t=0时,P(0)=P1; (2) 抛物线以 P3 为终点,即 t=1时,P(1)=P3; (3) 当 t=0.5 时,曲线过P2点,即 P(0.5)=P2。
P2 (t=0.5)
P1 (t=0) P3 (t=1) 于是可列出三个独立的方程为: A1=P1 A1+A2+A3=P3 A1+0.5•A2+0.25•A3=P2
设两个权函数分别为: f1(T)=1-T f2(T)=T (0T1) 则加权合成后的曲线为: Pi+1(t)=f1(T)*Si(ti)+f2(T)*Si+1(ti+1) 在同一个参数方程中,出现了三个参 变量:T、ti和ti+1。所以,为了使下面 的工作得以进行,首先要统一参变量。
对于
f(T):(0T1) Si(ti):(0.5ti1) Si+1(ti+1):(0ti+10.5)
将上式先展开再整理后可得: P(t)=(2t2-3t+1)P1+(4t-4t2)P2+ (2t² -t)P3 (0t1) 式中的P是一个向量,在二维平面内 它包含两个分量(x, y)。 以上推导求出的算式,即为过不在一 直线上的三点:P1(x1,y1)、P2(x2,y2) 和P3(x3,y3)的抛物线的方程。这时根 据 t的取值,可以一一计算出曲线上的 点,从而绘出图形。
在手工操作绘制曲线时,除了圆弧类 曲线可以直接借助于工具圆规来画出 外,其他的曲线一般都是先确定几个 点,然后借用曲线板分段绘出。其实 这也是用计算机来绘制曲线的基本原 理。 由于计算机图形输出设备的工作特 点,曲线一般是离散成直线画出的。 (见图)
另一个问题是参数法表示。(特别是 对于多值曲线,尤为重要) 取等量的变量 例如看一个圆,它的标准方程是: 得到均匀曲线 x2 + y2 = r2 可写成:y = 圆的参数方程表示为: x= r•cos(t) 取等量的变量但 得不到均匀曲线 y = r•sin(t) 这两种表示方法,在绘图的时候是存 有明显的差别的。看图。
1.过三点定义一条抛物线
设有不在一直线上的任意三点:P1,P2, P3。如何定义一条抛物线使其通过该 三点。 P2
P1
P3
抛物线参数表达式的一般形式为: P(t)=A1+A2*t+A3*t2 (0t1)
目前,表达式中的三个系数A1、A2和 A3是未知的,所以只要确定该三个系 数的值,则抛物线就能唯一确定。
所以椭圆的绘图程序可写成:
void ellipse(x0, y0, a, b, dt) int x0, y0, a, b, dt; { int x, y, n, i; float t1, t=0.0; t1=dt*0.01745; n=360/dt; moveto(x0+a, y0); for(i=1; i<n; i++) { t=t+t1; x=x0+a*cos(t); y=y0+b*sin(t); lineto(x, y); } lineto(x0+a, y0); }
S i (t i ) (2t 3t i 1) Pi (4t i 4t ) Pi 1
2 i 2 i
(2t i2 t i ) Pi 2
第i+1条抛物线的方程应为:
S i 1 (t i 1 ) (2t (2t
2 i 1 2 i 1
3t i 1 1) Pi 1 (4t i 1 4t ) Pi 2
P
i+3
Pi+2(t)=(-4t2+4t2-t)Pi+1+(12t2-10t2+1)Pi+2 +(-12t2+8t2+t)Pi+3+(4t2-2t)Pi+4 见图
分别对Pi+1(t)和Pi+2(t)求导:
P’i+1(t)=(-12t2+8t-1)Pi+(36t2-20t)Pi+1 +(-36t2+16t+1)Pi+2+(12t2-4t)Pi+3 =Pi+3-Pi+1 (当t=0.5时) 同样可求得: P’i+2(t)=Pi+3-Pi+1 (当t=0时) 可见抛物样条曲线达成一阶连续。
P3 P2
P4
两种连接法
Pn
2.样条曲线表达式的推导
P1
设有一离散点列Pi,(i=1,2,….,n)。我们 可以用上述方法每经过相邻的三点作 一条抛物线,则由n个点最多总共可以 作出(n-2)条抛物线。见图。
P3 P2 P4 Pn P1
在第二种连接方式的(n-2)条抛物线 中,第i条抛物线的方程应为:
相关文档
最新文档