资源描述
计算机图形学课程设计
设计题目:画三次Bezier曲线和三次B样条曲线
班级:
姓名:
学号:
一、总体目标和要求
1 课程设计目的
本课程主要内容包括计算机图形学的研究内容、发展与应用,图形输入输出设备,图形显示原理,图形软件标准,基本图形生成算法,图形几何变换与裁剪,自由曲线和曲面,三维实体造型,分形几何造型,分形艺术,隐藏面消除,光照模型,颜色模型,光线跟踪,纹理细节模拟,常用的计算机动画技术和软件等。
通过本课程设计,使自己了解计算机图形学的有关原理、算法及系统,掌握基本图形显示程序设计方法,及二维和三维图形变换程序设计方法,为进一步学习计算机辅助设计方面的技术知识打下基础。
2 目标
以图形学算法为目标,深入研究。续而策划设计实现一个能够表现计算机图形学算法原理的或完整过程的演示系统,并能从某些方面做出评价和改进意见。通过完成一个完整程序,经历策划、设计、开发、总结。达到:
(1)巩固和实践计算机图形学课程中的理论和算法;
(2)学习表现计算机图形学算法的技巧;
(3)培养认真学习积极探索的精神。
3总体要求
策划、设计并实现一个能够充分表现图形学算法的系统,界面要求美观大方,能清楚地演示算法执行的每一个步骤。
二、内容与要求
1设计题目
画三次Bezier曲线和三次B样条曲线。
2设计要求
利用计算机图形学原理画出三次Bezier曲线和三次B样条曲线。
三、算法描述
(1)画三次Bezier曲线
i=0
i=0
根据 Q(t)=∑Pi•Bi,n(t) = ∑Pi• C in ti(1-t)n-i (∑中的n=3)
n-k+1
n
并且 C in =C(n,k)= C(n,k-1)
BEZ 0,3 (u)=(1-u)(1-u)(1-u)
BEZ 1,3(u)=3u(1-u)(1-u)
BEZ2,3(u)=3uu(1-u)
BEZ3,3(u)=3uuu
三次Bezier函数可以写成
P(u)=[ u3 u2 u 1]×M×[a b c d]
其中M=[ -1 3 -3 1 ]
3 -6 -3 0
-3 3 0 0
1 0 0 0
(2)画三次B样条曲线
l =0
Qi,3(t)=∑Pi+l Fl,3(t)= Pi F0,3(t)+ Pi+1 F1,3(t)+ Pi+2 F2,3(t)+ Pi+ 3 F3,3(t)
(其中∑中的n=3)因为四个调和函数F0,3(t)、F1,3(t)、F2,3(t)和F3,3(t) 已知(参看公式7-5-3)因此只要给出四个控制点的位置矢量的坐标,当t在[0,1]范围内取离散地取100个点时(dt=0.01),分别求出每一个曲线上点,相邻点用直线段连接起来,就可以得到相应的B样条曲线。
设控制点的个数为PointNum,要求PointNum≥4,则可以生成(PointNum-3)段三次B样条曲线。其中第i段三次B样条曲线的代数形式为:
Qi,3(t)x= Pi x F0,3(t)+ P (i+1) x F1,3(t)+ P (i+2) x F2,3(t)+ P (i+3) x F3,3(t)
Qi,3(t)y= Pi y F0,3(t)+ P (i+1) y F1,3(t)+ P (i+2) y F2,3(t)+ P (i+3) y F3,3(t)
其中,i=1,2,…, PointNum-3
四、程序源代码
(1)画三次Bezier曲线的程序源代码如下:
void __fastcall TForm1::N1Click(TObject *Sender)
{
float a[4][2]={100,100,200,250,300,130,400,250};
double t,t1,t2,t3,t4,t5,dt;
int x,y,i,m=20;
String str;
Image1->Canvas->TextOutA(180,50,"三次Bezier曲线");
dt = 1.0/(m+1);
for(i=0; i<=m; i++)
{
t = i*dt;
t1 = t*t;
t2 = t1*t;
t3 = (1-t);
t4 = t3*t3;
t5 = t4*t3;
x = t5*a[0][0]+3*t*t4*a[1][0]+3*t1*t3*a[2][0]+t2*a[3][0];
y = t5*a[0][1]+3*t*t4*a[1][1]+3*t1*t3*a[2][1]+t2*a[3][1];
if(i==0)
Image1->Canvas->MoveTo(x,y);
else
Image1->Canvas->LineTo(x,y);
}
// 绘制坐标点连成的折线
Image1->Canvas->Pen->Color=clBlue;
for(i=0;i<4;i++)
{
str = IntToStr(i);
Image1->Canvas->Brush->Color=RGB(255,250,0);
Image1->Canvas->Brush->Style=0;
if(i==0)
Image1->Canvas->MoveTo(a[i][0],a[i][1]);
else
Image1->Canvas->LineTo(a[i][0],a[i][1]);
Image1->Canvas->Rectangle(a[i][0]-2,a[i][1]-2,a[i][0]+2,a[i][1]+2);
Image1->Canvas->TextOutA(a[i][0],a[i][1],str);
Image1->Canvas->MoveTo(a[i][0],a[i][1]);
}
}
(2)画三次B样条曲线的程序源代码如下:
void __fastcall TForm1::B1Click(TObject *Sender)
{
float a[10][2]={100,85,150,135,200,235,250,285,300,215,350,185,400,135};
int i,j,x,y,m,n=7;
float x1,y1,x2,y2,x3,y3,x4,y4,k,t,f1,f2,f3,f4;
float dt=0.05,t1,t2;
String str;
Image1->Canvas->TextOutA(180,50,"三次B样条曲线");
m=(int)(1.0/dt)+1;
Image1->Canvas->Pen->Width=2;
Image1->Canvas->Pen->Color=clBlue;
// 绘制B样条曲线
for(i=0;i<n-3;i++)
{
x1=a[i][0]; x2=a[i+1][0]; x3=a[i+2][0]; x4=a[i+3][0];
y1=a[i][1]; y2=a[i+1][1]; y3=a[i+2][1]; y4=a[i+3][1];
for(j=0;j<=m;j++)
{
t=j*dt;
t1=t*t;
t2=t1*t;
f1=1.0/6*(-t2+3*t1-3*t+1);
f2=1.0/6*(3*t2-6*t1+4);
f3=1.0/6*(-3*t2+3*t1+3*t+1);
f4=1.0/6*t2;
x=f1*x1+f2*x2+f3*x3+f4*x4;
y=f1*y1+f2*y2+f3*y3+f4*y4;
if(j==0)
Image1->Canvas->MoveTo(x,y);
else
Image1->Canvas->LineTo(x,y);
}
}
// 绘制坐标点连成的折线
Image1->Canvas->Pen->Color=clRed;
for(i=0;i<n;i++)
{
str = IntToStr(i);
Image1->Canvas->Brush->Color=RGB(255,250,0);
Image1->Canvas->Brush->Style=0;
if(i==0)
Image1->Canvas->MoveTo(a[i][0],a[i][1]);
else
Image1->Canvas->LineTo(a[i][0],a[i][1]);
Image1->Canvas->Rectangle(a[i][0]-2,a[i][1]-2,a[i][0]+2,a[i][1]+2);
Image1->Canvas->TextOutA(a[i][0],a[i][1],str);
Image1->Canvas->MoveTo(a[i][0],a[i][1]);
}
}
五、运行结果
(1)画出三次Bezier曲线的图形如下:
(2)画出三次B样条曲线的图形如下:
六、设计心得
(1)通过这次课程设计是我更加了解了计算机图形学这门课程,知道了很多以前一知半解的知识。同时设计程序的过程也是困难重重,在设计的过程中自己不断的查找相关书籍,了解知识,并运用这些知识解决设计中的问题,加深了对知识的了解,使自己更加熟练的运用各种知识。对计算机图形学的了解也有加深,明白了计算机图形学在生活中的作用,它与我们息息相关。只有自己亲手去做你才会真正的了解它,了解计算机图形学。程序设计的过程不是枯燥无味的,当你去挖掘它的用法,设计的理念,你越好发现它的魅力。一个生动有趣的图形可以用文章加以说明,用算法用程序绘制出来。当你把图形画出来的时候你是自豪的,因为你成功啦。
展开阅读全文