文章目录

1、实验内容(理论分析)

  Bezier曲线又称贝兹曲线,20世纪70年代,法国数学家Pierre Bézier第一个研究了这种矢量制曲线的方法,并给出了详细的计算公式,因此按照这样的公式绘制出来的曲线就用他的姓氏来命名——贝塞尔曲线。

  给定n+1个控制顶点Pi(i=0~n) ,则Bezier曲线定义为:

Pi构成该曲线的特征多边,Bi,n(t)是Bernstein基函数,也是曲线上各点位置矢量的调和函数。

设给定两条Bezier曲线的控制点列Pi(i=0,1,…,n)且ai=Pi-Pi-1和Qj(j=0,1,…,m)且bj=Qj-Qj-1,把它们按照一定的连续条件连接起来。

(1)Bezier曲线P(t)的终点Pn和Q(t)的始点Q0重合,即达到C0连续。

(2)达到C1连续的充要条件是:Pn-1,Pn=Q0,Q1三点共线,即:b1=αan(α>0)。当α=1时达C1连续。

(3)达C2连续的充要条件是:在C1连续的前提下再增加两个条件,即:①密切平面重合,副法矢量同
向;②曲率相等。

2、核心程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/* ==============  Program Description  ============= */
/*   program name : BesizerCurve.cpp                  */
/*                                                    */
/* ================================================== */
#include  <graphics.h>
#include  <conio.h>
#include  <stdio.h>
#include  <dos.h>
char msg[1];
float px[10]={30,60,90,120,150,190,220,250,280,310};
float py[10]={150,200,200,170,100,100,170,200,200,180};
void main()
{
float a0,a1,a2,a3,b0,b1,b2,b3;
int k,m,w,y;
float i,t,dt,n=10;
int graphdriver = DETECT;
int graphmode=0;
initgraph(&graphdriver,&graphmode,”c:\\tc\\bgi”);
cleardevice();
setbkcolor(BLUE);
setcolor(YELLOW);`
dt=1/n;
for(k=0;k<10-1;k++)
{
moveto(px[k],py[k]);
lineto(px[k+1],py[k+1]);
}
setlinestyle(0,0,3);
for(k=0;k<10-3;k+=3)
{
a0=px[k];
a1=-3*px[k]+3*px[k+1];
a2=3*px[k]-6*px[k+1]+3*px[k+2];
a3=-px[k]+3*px[k+1]-3*px[k+2]+px[k+3];
b0=py[k];
b1=-3*py[k]+3*py[k+1];
b2=3*py[k]-6*py[k+1]+3*py[k+2];
b3=-py[k]+3*py[k+1]-3*py[k+2]+py[k+3];
for(i=0;i<=n;i++)     //=0.5)
{
t=i*dt;
m=a0+a1*t+a2*t*t+a3*t*t*t;
y=b0+b1*t+b2*t*t+b3*t*t*t;
if(i==0)   moveto(m,y);
lineto(m,y);
getch();
Sleep(200);
}
}
getch();
closegraph();
}

3、实验结果与分析

绘制出两条贝塞尔曲线的10个控制点形成2条首位衔接的折线段

Bezier曲线拼接绘制中

Bezier曲线拼接绘制完成,其达到了级连续。


如果觉得文章很有趣或对你带来了帮助,欢迎请我喝杯咖啡哦~

文章目录