资源描述:
《计算机图形学实验4-----hermite bezier b样条三种曲线的绘制》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验四HermiteBezierB样条三种曲线的绘制一、实验目的Ø了解和学习Hermite、Bezier、B样条三种曲线算法Ø掌握基于Win32、VisualC++环境MFC绘制图形配置过程制过程Ø编程实现Hermite、Bezier、B样条三种曲线的绘制二、实验原理²三次参数曲线1.曲线段可以用端点、切向量和曲线段之间的连续性等约束条件来定义2.两个端点和两端点处的切向量定义Hermite曲线;3.两个端点和另外两个控制端点切向量的点定义的Bezier曲线;4.由四个控制顶点定义的样条曲线。一、实验关键代码vo
2、idCDrawYTQXView::Hermite()//绘制Hermite三次插值样条{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<4;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[
3、i][1];//起点的导数b[3][0]=p2[i+1][0];b[3][1]=p2[i+1][1];//终点的导数Caculate(a,b);CClientDCdc(this);CPenMyPen,*pOldPen;MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255));pOldPen=dc.SelectObject(&MyPen);dc.MoveTo(p1[i][0],p1[i][1]);for(doublet=0.0;t<=1;t+=1.0/400){intx=ROUND(pow(
4、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]);dc.LineTo(x,y);}dc.SelectObject(pOldPen);MyPen.DeleteObject();}}voidCDrawYTQXView::Caculate(inta[4][4],int
5、b[4][2])//矩阵相乘{inti,j,k;for(i=0;i<4;i++)for(j=0;j<2;j++)result[i][j]=0;//矩阵清零for(i=0;i<2;i++)for(j=0;j<4;j++)for(k=0;k<4;k++)result[j][i]+=a[j][k]*b[k][i];}voidCDrawYTQXView::DrawBezier()//绘制Bezier曲线{CClientDCdc(this);doublex,y;intrate=400,n;n=CtrlPoint-1;for
6、(doublet=0;t<=1;t+=1.0/rate){x=0;y=0;for(inti=0;i<=n;i++){x+=pt[i].x*Cnk(n,i)*pow(t,i)*pow(1-t,n-i);y+=pt[i].y*Cnk(n,i)*pow(t,i)*pow(1-t,n-i);}dc.SetPixel(ROUND(x),ROUND(y),RGB(0,0,255));//曲线颜色}}doubleCDrawYTQXView::Cnk(constint&n,constint&i)//Bernstein第一项{re
7、turndouble(Factorial(n)/(Factorial(i)*Factorial(n-i)));}intCDrawYTQXView::Factorial(intm)//阶乘函数{intf=1;for(inti=1;i<=m;i++)f*=i;returnf;}voidCDrawYTQXView::DrawB3_curves()//绘制B样条曲线{CClientDCdc(this);inti,rate=10,m;longlx,ly;m=CtrlPoint-(3+1);doubleF03,F13,F23
8、,F33;lx=ROUND((pt[0].x+4.0*pt[1].x+pt[2].x)/6.0);//t=0的起点x坐标ly=ROUND((pt[0].y+4.0*pt[1].y+pt[2].y)/6.0);//t=0的起点y坐标dc.MoveTo(lx,ly);CPenMyPen2,*pOldPen2;MyPen2.CreatePen(PS_SOLID,2,RGB(0,