1、图形学实验五贵州大学实验报告学院: 计信学院 专业:计科 班级:计科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;
2、t=0.0;PX(1)=P0(1); PY(1)=P0(2);for i=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);endfigure;plot(PX,PY,PX,PY,o);title(P0=100,100;P1=200,150;Q0=-200,100;Q1=-100,120;
3、);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);for i=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);endfig
4、ure;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(伯恩斯坦)基函数:三
5、次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);for i=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
6、(2)+B3*P3(2); endfigure;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
7、=1/count;%绘制第一段曲线for i=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;endfigure;plot(PX,PY,blue);函数hold on;PXX=P1(1),P2(1),P3(1),P4(1);PYY=P1(2),P
8、2(2),P3(2),P4(2);plot(PXX,PYY,:red,PXX,PYY,o);%绘制第2 段曲线t=0.0;for i=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;endplot(PX,PY,red);PXX=P2(1),P3(
9、1),P4(1),P5(1);PYY=P2(2),P3(2),P4(2),P5(2);hold on;plot(PXX,PYY,:red,PXX,PYY,o);%绘制第3段曲线t=0.0;for i=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
10、;endplot(PX,PY,blue);PXX=P3(1),P4(1),P5(1),P6(1);PYY=P3(2),P4(2),P5(2),P6(2);hold on;plot(PXX,PYY,:red,PXX,PYY,o);%绘制第4段曲线t=0.0;for i=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
11、(2) +B2*P6(2)+B3*P7(2); t=t+deltat;endplot(PX,PY,red);PXX=P4(1),P5(1),P6(1),P7(1);PYY=P4(2),P5(2),P6(2),P7(2);hold on;plot(PXX,PYY,:red,PXX,PYY,o);实验环境硬件平台:PC软件(推荐):Windows平台,Visual C+,matlab实验步骤1. 掌握算法原理;2. 依据算法,编写源程序并进行调试;3. 对运行结果进行保存与分析;4. 把源程序以文件的形式提交;5. 按格式书写实验报告。实验内容1、 通过实验,进一步理解和掌握生成Hermit、Be
12、zier和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曲线int a44 =2,-2,1,1,-3,3,-2,-1,
13、0,0,1,0,1,0,0,0;/Mh矩阵系数 int b42;/边界点 for(int i=0;iSelectObject(&MyPen); pDC-MoveTo(p1i0,p1i1); for(double t=0.0;tLineTo(x,y); pDC-SelectObject(pOldPen); MyPen.DeleteObject(); (2)三次B样条曲线int i,rate=10;/rate是平滑程度 long lx,ly; double F03,F13,F23,F33; lx=ROUND(xq00+4.0*xq10+xq20)/6.0);/t0的起点x坐标 ly=ROUND(x
14、q01+4.0*xq11+xq21)/6.0);/t0的起点y坐标 pDC-MoveTo(lx,ly); CPen MyPen2(PS_SOLID,3,RGB(255,0,0);/红笔画B样条 CPen *POldPen2=pDC-SelectObject(&MyPen2); for(i=1;i7;i+)/6段样条曲线 for(double t=0;tLineTo(lx,ly); pDC-SelectObject(POldPen2); MyPen2.DeleteObject(); 实验总结通过这次实验体会到了生活中的曲线是与学习中的曲线息息相关的,明确了学习与实践是应当有效结合的,此次实验加深了对Bezier,三次均匀B样条曲线的了解。因为曲面由曲线所生成,线由点所生成,它们是环环相扣的,通过控制顶点生成曲线,通过曲线生成曲面。所以画曲线,的关键在于将它们之间的关系理清楚。指导教师意见签名: 年 月 日
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1