图形学实验五.docx
《图形学实验五.docx》由会员分享,可在线阅读,更多相关《图形学实验五.docx(14页珍藏版)》请在冰豆网上搜索。
![图形学实验五.docx](https://file1.bdocx.com/fileroot1/2023-1/22/336507f0-020a-45a7-a9fd-e8b0228790ff/336507f0-020a-45a7-a9fd-e8b0228790ff1.gif)
图形学实验五
贵州大学实验报告
学院:
计信学院专业:
计科班级:
计科101
姓名
罗琳
学号
1008060016
实验组
无
实验时间
2013-4-22
指导教师
吴云
成绩
实验项目名称
常用曲面和曲线的生成算法
实验目的
掌握常用曲线和曲面的生成算法,为几何造型打下基础。
实验要求
编写绘制Hermit、Bezier、B样条曲线的程序.
实验原理
三次Hermite曲线的生成:
算法原理:
给定直线的两个端点:
P0,P1,及两端点处的切线:
R0,R1,则三次Hermit曲线方程为:
例:
P0=[100,100];P1=[200,150];
Q0=[-200,100];Q1=[-100,120];
count=100;deltat=1/count;
t=0.0;
PX
(1)=P0
(1);PY
(1)=P0
(2);
fori=1:
count
t=t+deltat;
F3=2*t*t*t-3*t*t+1;
F2=-2*t*t*t+3*t*t;
F1=t*t*t-2*t*t+t;
F0=t*t*t-t*t;
PX(i+1)=F3*P0
(1)+F2*P1
(1)+F1*Q0
(1)+F0*Q1
(1);
PY(i+1)=F3*P0
(2)+F2*P1
(2)+F1*Q0
(2)+F0*Q1
(2);
end
figure;plot(PX,PY,PX,PY,'o');
title('P0=[100,100];P1=[200,150];
Q0=[-200,100];Q1=[-100,120];');
P0=[100,400];P1=[200,450];Q0=[-200,100];Q1=[-100,120];
count=1000;deltat=1/count;
t=0.0;
PX
(1)=P0
(1);PY
(1)=P0
(2);
fori=1:
count
t=t+deltat;
F3=2*t*t*t-3*t*t+1;F2=-2*t*t*t+3*t*t;
F1=t*t*t-2*t*t+t;F0=t*t*t-t*t;
PX(i+1)=F3*P0
(1)+F2*P1
(1)+F1*Q0
(1)+F0*Q1
(1);
PY(i+1)=F3*P0
(2)+F2*P1
(2)+F1*Q0
(2)+F0*Q1
(2);
end
figure;plot(PX,PY,PX,PY,'o');
title('P0=[100,400];P1=[200,450];Q0=[-200,100];Q1=[-100,120];');
Bezier曲线(以逼近为基础的参数曲线):
满足以下条件的一组折线集(Bezier特征多边形)称为Bezier曲线:
曲线的起点和终点与多边形的起点和终点重合,多边形的第一条边和最后一条边表示曲线在起点和终点的切矢量方向。
曲线的形状趋向于Bezier特征多边形的形状。
当给定Bezier特征多边形的n+1个顶点Pi时,
Bezier曲线的插值公式为:
(权Bi,n(t)i=0,1,2,3,…n+1称为基函数)
Bernstein(伯恩斯坦)基函数:
三次Bezier曲线矩阵表示:
调合函数:
例:
P0=[100,100];P1=[200,450];
P2=[400,600];P3=[500,150];
count=100;deltat=1/count;t=0.0;
PX
(1)=P0
(1);PY
(1)=P0
(2);
fori=1:
count
t=t+deltat;
B0=1-3*t+3*t*t-*t*t*t;
B1=3*t-6*t*t+3*t*t*t;
B2=3*t*t-3*t*t*t;
B3=t*t*t;
PX(i+1)=B0*P0
(1)+B1*P1
(1)+B2*P2
(1)+B3*P3
(1);
PY(i+1)=B0*P0
(2)+B1*P1
(2)+B2*P2
(2)+B3*P3
(2);
end
figure;plot(PX,PY,PX,PY,'o');
title('P0=[100,100];P1=[200,150];
P2=[-200,100];P3=[-100,120];');
B样条曲线:
当给定特征多边形的n+1个顶点Pi(i=0,1,2,..,n)时,K次B样条曲线的插值公式为:
(权Ni,k(u)i=0,1,2,3,…n+1称为基函数,即调合函数)
三次B样条曲线矩阵表示:
例:
%三次均匀B样条曲线.
clear;
clc;
P1=[0,0];P2=[1,1];P3=[2,2];P4=[4,0];
P5=[6,-4];P6=[8,-5];P7=[10,2];
t=0.0;
count=1000;
deltat=1/count;
%绘制第一段曲线
fori=1:
count+1
B0=(-t*t*t+3*t*t-3*t+1)/6;
B1=(3*t*t*t-6*t*t+4)/6;
B2=(-3*t*t*t+3*t*t+3*t+1)/6;
B3=t*t*t/6;
PX(i)=B0*P1
(1)+B1*P2
(1)
+B2*P3
(1)+B3*P4
(1);
PY(i)=B0*P1
(2)+B1*P2
(2)
+B2*P3
(2)+B3*P4
(2);
t=t+deltat;
end
figure;plot(PX,PY,‘blue’);函数holdon;
PXX=[P1
(1),P2
(1),P3
(1),P4
(1)];
PYY=[P1
(2),P2
(2),P3
(2),P4
(2)];
plot(PXX,PYY,':
red',PXX,PYY,'o');
%绘制第2段曲线
t=0.0;
fori=1:
count+1
B0=(-t*t*t+3*t*t-3*t+1)/6;
B1=(3*t*t*t-6*t*t+4)/6;
B2=(-3*t*t*t+3*t*t+3*t+1)/6;
B3=t*t*t/6;
PX(i)=B0*P2
(1)+B1*P3
(1)+B2*P4
(1)+B3*P5
(1);
PY(i)=B0*P2
(2)+B1*P3
(2)+B2*P4
(2)+B3*P5
(2);
t=t+deltat;
end
plot(PX,PY,'red');
PXX=[P2
(1),P3
(1),P4
(1),P5
(1)];
PYY=[P2
(2),P3
(2),P4
(2),P5
(2)];
holdon;
plot(PXX,PYY,':
red',PXX,PYY,'o');
%绘制第3段曲线
t=0.0;
fori=1:
count+1
B0=(-t*t*t+3*t*t-3*t+1)/6;
B1=(3*t*t*t-6*t*t+4)/6;
B2=(-3*t*t*t+3*t*t+3*t+1)/6;
B3=t*t*t/6;
PX(i)=B0*P3
(1)+B1*P4
(1)+B2*P5
(1)+B3*P6
(1);
PY(i)=B0*P3
(2)+B1*P4
(2)+B2*P5
(2)+B3*P6
(2);
t=t+deltat;
end
plot(PX,PY,'blue');
PXX=[P3
(1),P4
(1),P5
(1),P6
(1)];
PYY=[P3
(2),P4
(2),P5
(2),P6
(2)];
holdon;
plot(PXX,PYY,':
red',PXX,PYY,'o');
%绘制第4段曲线
t=0.0;
fori=1:
count+1
B0=(-t*t*t+3*t*t-3*t+1)/6;
B1=(3*t*t*t-6*t*t+4)/6;
B2=(-3*t*t*t+3*t*t+3*t+1)/6;
B3=t*t*t/6;
PX(i)=B0*P4
(1)+B1*P5
(1)+B2*P6
(1)+B3*P7
(1);
PY(i)=B0*P4
(2)+B1*P5
(2)+B2*P6
(2)+B3*P7
(2);
t=t+deltat;
end
plot(PX,PY,'red');
PXX=[P4
(1),P5
(1),P6
(1),P7
(1)];
PYY=[P4
(2),P5
(2),P6
(2),P7
(2)];
holdon;
plot(PXX,PYY,':
red',PXX,PYY,'o');
实验环境
硬件平台:
PC
软件(推荐):
Windows平台,VisualC++,matlab
实验步骤
1.掌握算法原理;
2.依据算法,编写源程序并进行调试;
3.对运行结果进行保存与分析;
4.把源程序以文件的形式提交;
5.按格式书写实验报告。
实验内容
1、通过实验,进一步理解和掌握生成Hermit、Bezier和B样条曲线及Bezier曲面的生成算法
2、掌握Hermit、Bezier、B样条曲线及Bezier曲面的基本生成过程
3、通过编程,会在一种语言环境下编程实现三次Hermit、Bezier曲线的绘制
实验结果
1、在VC中建立工程,设计界面并给控件添加代码,主界面运行显示如下:
(1)Hermit曲线
(2)三次B样条曲线
(3)Bezier曲线
一次Bezier曲线
二次Bezier曲线
三次Bezier曲线
四次Bezier曲线
(4)Bezier曲面
运行程序的主界面(坐标系):
绘制曲面:
2、程序主要的代码:
(1)Hermit曲线
inta[4][4]={{2,-2,1,1},{-3,3,-2,-1},{0,0,1,0},{1,0,0,0}};//Mh矩阵系数
intb[4][2];//边界点
for(inti=0;i<8;i++)
{
b[0][0]=p1[i][0];b[0][1]=p1[i][1];//起点的坐标
b[1][0]=p1[i+1][0];b[1][1]=p1[i+1][1];//终点的坐标
b[2][0]=p2[i][0];b[2][1]=p2[i][1];//起点的导数
b[3][0]=p2[i+1][0];b[3][1]=p2[i+1][1];//终点的导数
MultiMatrix(a,b);
CPenMyPen,*pOldPen;
MyPen.CreatePen(PS_SOLID,1,RGB(255,0,0));
pOldPen=pDC->SelectObject(&MyPen);
pDC->MoveTo(p1[i][0],p1[i][1]);
for(doublet=0.0;t<=1;t+=1.0/400)
{
intx=ROUND(pow(t,3)*result[0][0]+pow(t,2)*result[1][0]
+t*result[2][0]+result[3][0]);
inty=ROUND(pow(t,3)*result[0][1]+pow(t,2)*result[1][1]
+t*result[2][1]+result[3][1]);
pDC->LineTo(x,y);
}
pDC->SelectObject(pOldPen);
MyPen.DeleteObject();
}
(2)三次B样条曲线
inti,rate=10;//rate是平滑程度
longlx,ly;
doubleF03,F13,F23,F33;
lx=ROUND((xq[0][0]+4.0*xq[1][0]+xq[2][0])/6.0);//t=0的起点x坐标
ly=ROUND((xq[0][1]+4.0*xq[1][1]+xq[2][1])/6.0);//t=0的起点y坐标
pDC->MoveTo(lx,ly);
CPenMyPen2(PS_SOLID,3,RGB(255,0,0));//红笔画B样条
CPen*POldPen2=pDC->SelectObject(&MyPen2);
for(i=1;i<7;i++)//6段样条曲线
{
for(doublet=0;t<=1;t+=1.0/rate)
{
F03=(-t*t*t+3*t*t-3*t+1)/6;//计算F0,3(t)
F13=(3*t*t*t-6*t*t+4)/6;//计算F1,3(t)
F23=(-3*t*t*t+3*t*t+3*t+1)/6;//计算F2,3(t)
F33=t*t*t/6;//计算B3,3(t)
lx=ROUND(xq[i-1][0]*F03+xq[i][0]*F13+xq[i+1][0]*F23+xq[i+2][0]*F33);
ly=ROUND(xq[i-1][1]*F03+xq[i][1]*F13+xq[i+1][1]*F23+xq[i+2][1]*F33);
pDC->LineTo(lx,ly);
}
}
pDC->SelectObject(POldPen2);
MyPen2.DeleteObject();
实验总结
通过这次实验体会到了生活中的曲线是与学习中的曲线息息相关的,明确了学习与实践是应当有效结合的,此次实验加深了对Bezier,三次均匀B样条曲线的了解。
因为曲面由曲线所生成,线由点所生成,它们是环环相扣的,通过控制顶点生成曲线,通过曲线生成曲面。
所以画曲线,的关键在于将它们之间的关系理清楚。
指导教师意见
签名:
年月日