您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 江苏大学-计算机图形学第二次实验报告-曲线拟合
计算机科学与通信工程学院实验报告课程计算机图形学实验题目实验二:曲线拟合学生姓名学号专业班级指导教师日期成绩评定表评价内容具体内容权重得分论证分析方案论证与综合分析的正确、合理性20%算法设计算法描述的正确性与可读性20%编码实现源代码正确性与可读性30%程序书写规范标识符定义规范,程序书写风格规范20%报告质量报告清晰,提交准时10%总分指导教师签名1.实验内容1.绘制三次Bezier曲线(1)给定四个已知点P1—P4,以此作为控制顶点绘制一段三次Bezier曲线。(2)给定四个已知点P1—P4,以此作为曲线上的点绘制一段三次Bezier曲线。2.绘制三次B样条曲线给定六个已知点P1—P6,以此作为控制顶点绘制一条三次B样条曲线。2.实验环境WindowsxpVs20083.问题分析Bezier曲线通过一组多边折线的各顶点唯一的定义出来。在多边折线的各顶点中,只有第一点和最后一点在曲线上,其余的顶点则用来定义曲线的导数,阶次和形状。三次Bezieer曲线经过首、末两个控制点,且与特征多边形的首、末两条边相切。因此在给定四个控制点的情况下,可以根据线性贝塞尔曲线描述的中介点Q0、Q1、Q2,和由二次曲线描述的点R0、R1所建构。也可以在给定四个线上点的情况下根据公式计算出曲线。总之,只要获得了四个控制点的坐标,便可以通过编程来绘制出曲线。对于给出了四个曲线上点的曲线,由于控制点的坐标位于曲线上,而且在相交处两曲线的切平面重合,曲率相等。可以据此来绘制图形。B样条曲线是Bezier曲线的拓广,它是用B样条基函数代替了Bezier曲线表达式中的Bernstain基函数。在空间给定n+1个点的位置向量Pi(i=0,1,2,……n,n=k),则称参数曲线,0()()niikiQttNP(0≤t≤1)为k阶(或k-1次)的B样条曲线。其中Ni,k(t)为B样条基函数。其中Ni,k(t)为B样条基函数。给定的n+1个点为B样条曲线的控制顶点,由其构成的多边折线称B特征多边形。三次B样条曲线的端点特性:图1b给定4个点绘制的b样条曲线三次B样条曲线的连续性:在已有的三次B样条曲线的基础上,增加一个控制点,就可相应地增加一段B样条曲线,并自然地达到C2连续。图2给定五个点所绘制的b样条曲线4.算法设计下图3为给定四个已知点,以此作为控制顶点绘制一段三次Bezier曲线的流程图。图4为给定四个曲线上点,绘制三次Bezier曲线的流程图。图5为给定六个控制点所绘制三次b样条曲线的流程图。图3图4图55.源代码//以已知的四个点为控制点绘制Bezier曲线voidCDiamondView::DrawBezier1(POINTp[4]){CDC*pDC=GetDC();InvalidateRect(NULL);UpdateWindow();CPennewPen,*oldPen;newPen.CreatePen(PS_SOLID,2,RGB(0,0,0));oldPen=pDC-SelectObject(&newPen);pDC-Polyline(p,4);pDC-SelectObject(oldPen);newPen.DeleteObject();newPen.CreatePen(PS_SOLID,1,RGB(255,0,0));oldPen=pDC-SelectObject(&newPen);doubleax,bx,cx,dx,ay,by,cy,dy,x,y,t;ax=(-p[0].x)+(3*p[1].x)-(3*p[2].x)+(p[3].x);bx=(3*p[0].x)-(6*p[1].x)+(3*p[2].x);cx=(-3*p[0].x)+(3*p[1].x);dx=p[0].x;ay=(-p[0].y)+(3*p[1].y)-(3*p[2].y)+(p[3].y);by=(3*p[0].y)-(6*p[1].y)+(3*p[2].y);cy=(-3*p[0].y)+(3*p[1].y);dy=p[0].y;pDC-MoveTo(p[0].x,p[0].y);for(t=0;t=1;t+=0.01){x=ax*t*t*t+bx*t*t+cx*t+dx;y=ay*t*t*t+by*t*t+cy*t+dy;pDC-LineTo(x,y);Sleep(1);}pDC-SelectObject(oldPen);}//以已知的四个点为Bezier曲线上的点来绘制Bezier曲线voidCDiamondView::DrawBezier2(POINTp[4]){POINTa[3],b[3];POINTa1[1],b1[1];for(inti=0;i=2;i++){if(i==0){a1[0]=p[i];b1[0]=p[i+2];}elseif(i==2){a1[0]=p[i-1];b1[0]=p[i+1];}else{a1[0]=p[i-1];b1[0]=p[i+2];}b[i].y=p[i+1].y+((p[i].y)-(b1[0].y))/4;b[i].x=p[i+1].x+((p[i].x)-(b1[0].x))/4;a[i].y=p[i].y+((p[i+1].y)-(a1[0].y))/4;a[i].x=p[i].x+((p[i+1].x)-(a1[0].x))/4;}CDC*pDC=GetDC();CPennewPen,*oldPen;newPen.CreatePen(PS_SOLID,2,RGB(0,255,0));oldPen=pDC-SelectObject(&newPen);for(inti=0;i=2;i++){POINTp1[4]={{p[i].x,p[i].y},{a[i].x,a[i].y},{b[i].x,b[i].y},{p[i+1].x,p[i+1].y}};pDC-PolyBezier(p1,4);}pDC-SelectObject(oldPen);}//以已知的六个点为控制点来绘制B样条曲线//p:已知的六个控制点voidCDiamondView::DrawBCurve(POINTp[6]){InvalidateRgn(NULL);UpdateWindow();CDC*pDC=GetDC();CPennewPen,*oldPen;newPen.CreatePen(PS_SOLID,2,RGB(255,0,0));oldPen=pDC-SelectObject(&newPen);intrate=1000;intax,ay,bx,by,cx,cy,dx,dy;doublex,y;pDC-Polyline(p,6);pDC-SelectObject(oldPen);newPen.DeleteObject();newPen.CreatePen(PS_SOLID,3,RGB(0,0,255));oldPen=pDC-SelectObject(&newPen);for(inti=0;i3;i++){ax=-(p[i].x-3*p[i+1].x+3*p[i+2].x-p[i+3].x)/6;bx=(p[i].x-2*p[i+1].x+p[i+2].x)/2;cx=-(p[i].x-p[i+2].x)/2;dx=(p[i].x+4*p[i+1].x+p[i+2].x)/6;ay=-(p[i].y-3*p[i+1].y+3*p[i+2].y-p[i+3].y)/6;by=(p[i].y-2*p[i+1].y+p[i+2].y)/2;cy=-(p[i].y-p[i+2].y)/2;dy=(p[i].y+4*p[i+1].y+p[i+2].y)/6;for(doublet=0;t=1;t+=1.0/rate){x=ax*pow(t,3)+bx*pow(t,2)+cx*t+dx;y=ay*pow(t,3)+by*pow(t,2)+cy*t+dy;pDC-MoveTo(Round(x),Round(y));pDC-LineTo(Round(x),Round(y));Sleep(2);}}pDC-SelectObject(oldPen);}6.程序运行结果下图6为给定四个已知点,以此作为控制顶点绘制的一段三次Bezier曲线。图8为给定四个曲线上点所绘制的三次Bezier曲线。图9和10为给定六个控制点所绘制的三次b样条曲线。图6图7图8图97.总结通过这次实验复习了Bezier曲线和B样条曲线的参数表示法。一定程度上也考验了自己的计算能力。总的来说这还是一次比较难的实验。在这次实验中使用编程实现用三次Bezier曲线绘制和三次b样条曲线图形的绘制。对于计算机图形学的理解更加深了一层。
本文标题:江苏大学-计算机图形学第二次实验报告-曲线拟合
链接地址:https://www.777doc.com/doc-8522432 .html