实验五 基本图形处理技术

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 #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

相关文档
最新文档