实验五 基本图形处理技术
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验七 曲线与曲面
一、实验目的
根据曲线和曲面的基础知识和常用曲线的数学基础,对其算法进行程序设计,验证
算法的正确性,并通过程序结果加深对常用曲线数学模型的理解。
二、实验任务
1.抛物线程序设计;
2.Hermite 曲线程序设计; 3.Bezier 曲线的算法实现; 4.B 样条曲线的程序设计
三、实验内容和实验步骤
。
任务一:Hermite 曲线程序设计
Hermite 曲线方程为:
P(t)=FB=TMB=[ t 3 t 2 t
程序设计时只考虑二维图形的显示,其代数形式为:
x(t)=TMB x , B x =[ P 0x P 1x R 0x R 1x ]T
y(t)= TMB y , B y =[ P 0y P 1y R 0y R 1y ]T
所以,只要给出Hermite 曲线的起点坐标(P 0x ,P 0y ),终点坐标(P 1x ,P 1y ),以及起点处的切矢量(R 0x ,R 0y )和终点处的切矢量(R 1x ,R 1y ),参数变量t 在[0,1]的范围内分别取0.01,0.02,…,1,步长为0.01,取100个点,分别求出P(t)=[ x(t),y(t)],在计算机屏幕上显示出每个坐标点,即可绘出Hermite 曲线。
P 0 P 1 R 0 R 1
任务二:Bezier 曲线的算法实现
(1)算法描述
根据 Q(t)=∑P i •B
• C i n t i (1-t)n-i
并且 C i
n
Bezier 曲线的C 语言算法描述如下: #include
void computeCoefficients(int n, int *c)
{
int k, i;
for (k=0;k<=n;k++) /*求C k
n =n!/(k!(n-k)!= )*/
{
int c[k]=1;
for (i=n; i>=k+1; i--) /*求c[k]=n*(n-1)…(k+1) */ c[k]*=i;
for (i=n-k; i>=2; i--) /*求c[k]/(n-k)!*/ c[k]/=i; }
}
void computepoint(float t,wcPt3 *pt,int ncontrols,wcPt3 *controls,int *c) {
int i, n=ncontrols-1; float blend;
pt->x=0.0; pt->y=0.0; pt->z=0.0; for (i=0; i { blend = c[k]*powf(t,i)*powf(1-t,n-i); /*求 C k n t i (1-t)n-i */ pt->x+=controls[i].x*blend; /*求x(t)*/ pt->y+=controls[i].y*blend; /*求y(t)*/ pt->z+=controls[i].z*blend; /*求z(t)*/ } } void Bezier(wcPt3 *controls, int ncontrols, int m, wcPt3 *curve) { int *c=(int *) malloc(ncontrols *sizeof(int)); int i; computecoefficients(ncontrols-1,c); n i=0 n (n-k)! for (i=0; i<=m; i++) computepoint(i/(float)m,&curve[i],ncontrols,controls,c); free(c); } 在主程序中提供特征多边形的各个顶点坐标放入controls[]数组中,ncontrols为顶点的个数,m为曲线上取的样点数,比如m=100表示取100个样点。计算出曲线上的各个样点坐标放入curve[]数组中,这样可以通过相邻点连线绘出生成的Bezier曲线。 程序实现步骤:(工程名:BezierCurve) (ⅰ)C m n 的函数实现,定义成成员函数,命名为Multiply_n。 C m n { int i,j,a; if (m!=0) { a=1; for (i=m+1;i<=n;i++) //求(m+1)(m+2)…(n-1).n a=a*i; for (j=1;j<=n-m;j++) //求(n-m)!和C m n a=a/j; return a; } else return 1; } (ⅱ)伯恩斯坦多项式B m,n(t)的函数实现 B m,n (t)= C m n t m(1-t)n-m Double Bernstein(int m,int n,double t) { int i,j; double sum; sum=Multiply_n(m,n); //求C m n for (i=1;i<=m;i++) sum=sum*t; // C m n t m for (j=1;j<=n-m;j++) sum=sum*(1-t); // C m n t m(1-t)n-m return sum; } (ⅲ) 在OnDraw(CDC* pDC)函数中添加如下代码: int i,j,k,n=3; //n=3 表示三次Bezier曲线 double curx,cury,t,b; double dt=0.01; int array[4][2]={{30,100},{100,30},{50,150},{200,40}}; n! (m+1)(m+2)…(n-1).n