计算机图形学实验报告.docx
- 文档编号:5372984
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:22
- 大小:77.96KB
计算机图形学实验报告.docx
《计算机图形学实验报告.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
计算机图形学实验报告
学生实验报告
学院名称
计算机科学与技术学院
专业班级
学号
学生姓名
实验日期
2011-6-2
成绩
课程名称
计算机图形学
实验题目
二维基本图形生成的算法实现
一、实验目的
1、通过实验,进一步理解和掌握DDA和中点算法,Bresenham算法;
2、掌握DDA和中点算法,中点算法,Bresenham算法算法生成直线段的基本过程。
掌握中点画圆的算法。
3、通过编程,会在VC++环境下完成用DDA、中点算法实现直线段的绘制和中点算法实现圆的绘制。
二、实验属性
该实验为验证性实验。
三、实验学时
2学时,必做实验。
四、实验内容
1、用DDA算法或中点(Besenham)算法实现直线段的绘制。
2、用中点(Besenham)算法实现椭圆或圆的绘制。
五、实验步骤
1、算法、原理清晰,有详细的设计步骤;
2、依据算法、步骤或程序流程图,用VC++语言编写源程序;
3、编辑源程序并进行调试;
4、进行运行测试,并结合情况进行调整;
5、对运行结果进行保存与分析;
6、打印源程序或把源程序以文件的形式提交;
7、按格式书写实验报告。
六、原理分析
DDA算法分析
假设直线的起点坐标为P1(x1,y1),终点坐标为P2(x2,y2),x方向的增量为△x=x2-x1;y方向上增量为△y=y2-y1,直线的斜率为k=△y/△x
当△x>△y时,让x从x1到x2变化,每步递增1,那么,x的变化可以表示为xi+1=xi+1,y的变化可以表示为yi+1=yi+k
用上式可求得图中直线P1P2和y
向网格线的交点,但显示时要用舍入
找到最靠近交点处的象素点耒表示。
当△x<△y时,让y递增1,x作
相应变化。
综合考虑,按照从(x1,y1)到(x2,y2)方向不同,分8个象限。
对于方向在第1a象限内的直线而言,取增量值Dx=1,Dy=m。
对于方向在第1b象限内的直线而言,取增量值Dy=1,Dx=1/m。
直线Bresenham算法分析
设直线从起点(x1,y1)到终点(x2,y2)。
直线可表示为:
方程y=mx+b,其中
b=y1-m*x1,m=(y2-y1)/(x2-x1)=dy/dx;
此处的讨论先将直线方向限于1a象限,在这种情况
下,当直线光栅化时,x每次都增加1个单元,
即xi+1=xi+1而y的相应增加值应当小于1。
为了光栅化,yi+1只可能选择右图中两种位置之一。
yi+1的位置选择yi+1=yi或者yi+1=yi+1,选择的原则是看精确
值y与yi及yi+1的距离d1及d2的大小而定。
计算公式为
y=m(xi+1)+b
(1)
d1=yyi
(2)
d2=yi+1-y(3)
如果d1d2>0,则yi+1=yi+1,否则yi+1=yi。
将式
(1)、
(2)、(3)代入d1d2,再用dx乘等式两边,并以Pi=(d1d2)dx代入上述等式,得Pi=2xidy2yidx+2dy+(2b1)dx
d1d2是用以判断符号的误差。
由于在1a象限,dx总大于0,所
以Pi仍旧可以用作判断符号的误差。
Pi+1为
Pi+1=Pi+2dy2(yi+1yi)dx
求误差的初值P1,可将x1、y1和b代入式(2.4)中的xi、yi而得到
P1=2dydx
综述上面的推导,第1a象限内的直线Bresenham算法思想如下:
⒈画点(x1,y1),dx=x2x1,dy=y2y1,计算误差初值P1=2dy
dx,i=1;
⒉求直线的下一点位置xi+1=xi+1
如果Pi>0,则yi+1=yi+1,否则yi+1=yi;
⒊画点(xi+1,yi+1);
⒋求下一个误差Pi+1,如果Pi>0,则Pi+1=Pi+2dy2dx,否则
Pi+1=Pi+2dy;
⒌i=i+1;如果i 七、实验数据 1、用DDA算法实现直线段的绘制 实验源代码 voidCDDAView: : LineDDA(intx0,inty0,intx1,inty1,intcolor) { CDC*pDC=GetDC(); intx; floatdy,dx,y,m; dx=x1-x0; dy=y1-y0; m=dy/dx; y=y0; for(x=x0;x<=x1;x++) { pDC->SetPixel(x,(int)(y+0.5),color); y+=m; } ReleaseDC(pDC); } ondraw调用: voidCDDAView: : OnDraw(CDC*pDC) { CDDADoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); //TODO: adddrawcodefornativedatahere LineDDA(50,55,500,120,123); } 试验结果: 2、用中点(Besenham)算法实现椭圆或圆的绘制。 源代码: voidCBesenhamView: : BresenhmaCircle(intxc,intyc,intr,intcolor) { CDC*pDC=GetDC(); intx=0,y=r,p=3-2*r; while(x { pDC->SetPixel(xc+x,yc+y,color); pDC->SetPixel(xc-x,yc+y,color); pDC->SetPixel(xc+x,yc-y,color); pDC->SetPixel(xc-x,yc-y,color); pDC->SetPixel(xc+y,yc+x,color); pDC->SetPixel(xc-y,yc+x,color); pDC->SetPixel(xc+y,yc-x,color); pDC->SetPixel(xc-y,yc-x,color); if(p<0)p+=4*x+6; else{ p+=4*(x-y)+10; y--; } x++; } if(x==y) { pDC->SetPixel(xc+x,yc+y,color); pDC->SetPixel(xc-x,yc+y,color); pDC->SetPixel(xc+x,yc-y,color); pDC->SetPixel(xc-x,yc-y,color); pDC->SetPixel(xc+y,yc+x,color); pDC->SetPixel(xc-y,yc+x,color); pDC->SetPixel(xc+y,yc-x,color); pDC->SetPixel(xc-y,yc-x,color); } ReleaseDC(pDC); } ondraw函数调用: voidCBesenhamView: : OnDraw(CDC*pDC) { CBesenhamDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); BresenhmaCircle(200,200,100,120); //TODO: adddrawcodefornativedatahere } 试验结果: 实验地点 综合楼606 指导教师 学生实验报告 学院名称 计算机科学与技术学院 专业班级 学号 学生姓名 实验日期 2011-6-2 成绩 课程名称 计算机图形学 实验题目 图形的裁剪 一、实验目的 1、通过实验,进一步理解和掌握Cohen_Sutherland裁剪算法; 2、掌握用Cohen_Sutherland裁剪算法裁减多边形的基本过程 3、通过编程,会在VC++环境下用Sutherland_Hogman算法编程实现用矩形窗口对的裁剪。 二、实验属性 该实验为验证性实验。 三、实验学时 2学时,必做实验 四、实验内容 用Cohen_Sutherland算法编程实现用矩形窗口对直线的裁剪。 五、实验步骤 1、算法、原理清晰,有详细的设计步骤; 2、依据算法、步骤或程序流程图,用VC++语言编写源程序; 3、编辑源程序并进行调试; 4、进行运行测试,并结合情况进行调整; 5、对运行结果进行保存与分析; 6、打印源程序或把源程序以文件的形式提交; 7、按格式书写实验报告。 六、原理分析 Cohen-Sutherland直线剪裁算法 以区域编码为基础,将窗口及其周围的,8个方向以4bit的二进制数进行编码。 右图所示的编码方法将窗口及其邻域 分为5个区域: ⑴内域: 区域(0000)。 ⑵上域: 区域(1001,1000,1010)。 ⑶下域: 区域(0101,0100,0110)。 ⑷左域: 区域(1001,0001,0101)。 ⑸右域: 区域(1010,0010,0110)。 当线段的两个端点的编码的逻辑“与”非零时,线段为显然不可见的,对某线段的两个端点的区号进行位与运算,可知这两个端点是否同在视区的上、下、左、右; 该算法的思想是: 对于每条线段P1P2分为三种情况处理。 (1)若P1P2完全在窗口内,则显示该线段P1P2简称“取”之。 (2)若P1P2明显在窗口外,则丢弃该线段,简称“弃”之。 (3)若线段既不满足“取”的条件,也不满足“弃”的条件,则在交点处把线段分为两段。 其中一段完全在窗口外,可弃之。 然后对另一段重复上述处理。 裁剪一条线段时,先求出P1P2所在的区号code1,code2。 若code1=0,且code2=0,则线段P1P2在窗口内,应取之。 若按位与运算code1&code2≠0,则说明两个端点同在窗口的上方、下方、左方或右方。 可判断线段完全在窗口外,可弃之。 否则,按第三种情况处理。 求出线段与窗口某边的交点,在交点处把线段一分为二,其中必有一段在窗口外,可弃之。 在对另一段重复上述处理。 在实现本算法时,不必把线段与每条窗口边界依次求交,只要按顺序检测到端点的编码不为0,才把线段与对应的窗口边界求交。 七、实验数据 实验源代码 voidCClipView: : OnLButtonDown(UINTnFlags,CPointpoint) { //TODO: Addyourmessagehandlercodehereand/orcalldefault CDC*pDC=CWnd: : GetDC(); //CView: : OnLButtonDown(nFlags,point); Rectrect; intx,y; x=point.x; y=point.y; rect.xmin=x-100; rect.xmax=x+100; rect.ymin=y-100; rect.ymax=y+100; floatx0=0,y0=0,x1=400,y1=400; //DrawLine(x0,y0,x1,y1,pDC); Clip(x0,y0,x1,y1,&rect,pDC); ReleaseDC(pDC); } voidClip(floatx0,floaty0,floatx1,floaty1,Rect*rect,CDC*pDC){ boolaccept,done; accept=FALSE; done=FALSE; OutCodecode0,code1; OutCode*outCode; floatx,y; CompOutCode(x0,y0,rect,&code0); CompOutCode(x1,y1,rect,&code1); do{ if(code0.all==0&&code1.all==0){ accept=TRUE; done=TRUE; }elseif((code0.all&code1.all)! =0){ done=TRUE; }else{ if(code0.all! =0){ outCode=&code0; }else{ outCode=&code1; } if(outCode->left){ y=y0+(y1-y0)*(rect->xmin-x0)/(x1-x0); x=(float)rect->xmin; }elseif(outCode->top){ x=x0+(x1-x0)*(rect->ymax-y0)/(y1-y0); y=(float)rect->ymax; }elseif(outCode->right){ y=y0+(y1-y0)*(rect->xmax-x0)/(x1-x0); x=(float)rect->xmax; }elseif(outCode->bottom){ x=x0+(x1-x0)*(rect->ymin-y0)/(y1-y0); y=(float)rect->ymin; } if(outCode->all==code0.all){ x0=x; y0=y; CompOutCode(x0,y0,rect,&code0); }else{ x1=x; y1=y; CompOutCode(x1,y1,rect,&code1); } } }while(! done); if(accept){ DrawLine((int)x0,(int)y0,(int)x1,(int)y1,pDC,1); } } 实验结果: 实验地点 综合楼606 指导教师 学生实验报告 学院名称 计算机科学与技术学院 专业班级 学号 学生姓名 实验日期 2011-6-8 成绩 课程名称 计算机图形学 实验题目 几何图形变换实验 一、实验目的 1、通过实验,运用计算机图形学的知识、原理和算法; 2、掌握二维和三维图形几何变换; 3、通过使用VC++编程环境实现图形几何变换; 二、实验属性 该实验为验证性实验。 三、实验学时 2学时,必做实验 四、实验内容 1、在VC++编程环境下建立二维平面图形(长方形)实现其缩放、平移、旋转几何变换; 2、在VC++编程环境下建立三维立方体,实现缩放、平移、旋转等几何变换,。 五、实验步骤 1、算法、原理清晰,有详细的设计步骤; 2、依据算法、步骤或程序流程图,用VC++语言编写源程序; 3、编辑源程序并进行调试; 4、进行特殊模式的运行测试,并结合情况进行调整; 5、对运行结果进行保存与分析; 6、打印源程序或把源程序以文件的形式提交; 7、按格式书写实验报告。 六、基础知识及原理 二维变换矩阵 二维几何变换包括平移、旋转和变比3种基本变换,变换公式都可以表示为3×3的变换矩阵和齐次坐标相乘的形式。 分别为: 1平移的矩阵运算表示: 2旋转的矩阵运算表示为: [x′ y′ 1]=[x y 1] 3变比的矩阵运算表示为: [x′ y′ 1]=[x y 1] 、 三维变换矩阵 三维几何变换包括平移、旋转和变比。 三维几何变换可以表示为公式,或三维齐次坐标和4×4变换矩阵的乘积。 下面分别以公式,矩阵乘积和简记符号来描述三维几何变换。 并记变换前物体的坐标为x,y,z;变换后物体的坐标为x′,y′,z′。 一、平移 设Tx,Ty,Tz是物体在三个坐标方向上的移动量,则有公式: x′=x+Tx y′=y+Ty z′=z+Tz 矩阵运算表达为: [x′y′z′1]=[xyz1] 二、旋转 旋转分为三种基本旋转: 绕z轴旋转,绕x轴旋转,绕y轴旋转。 在下述旋转变换公式中,设旋转的参考点在所绕的轴上,绕轴转θ角,方向是从轴所指处往原点看的逆时针方向(见下图形)。 绕z轴旋转 绕x轴旋转 1绕z轴旋转的公式为: x′=xcosθ-ysinθ y′=xsinθ+ycosθ z′=z 矩阵运算的表达为: [x′y′z1]=[xyz1] 2绕x轴旋转的公式为: x′=x y′=ycosθ-zsinθ z′=ysinθ+zcosθ 矩阵运算的表达为: [x′y′z′1]=[xyz1] 3绕y轴旋转的公式为: x′=zsinθ+xcosθ y′=y z′=zcosθ-xsinθ 矩阵的运算表达式为: [x′y′z′1]=[xyz1] 七、实验数据 1、实验源代码 voidCJHBHView: : OnDraw(CDC*pDC) { CJHBHDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); PY(pDC,x1,y1,x2,y2,Tx,Ty); BBI(pDC,x1,y1,x2,y2,Sx,Sy); XZ(pDC,x1,y1,x2,y2,a); //TODO: adddrawcodefornativedatahere } voidCJHBHView: : PY(CDC*pDC,intx1,inty1,intx2,inty2,intTx,intTy) { intx3,y3,x4,y4; x3=x1+Tx; y3=y1+Ty; x4=x2+Tx; y4=y2+Ty; pDC->MoveTo(x1,y1); pDC->LineTo(x2,y2); pDC->MoveTo(x3,y3); pDC->LineTo(x4,y4); } voidCJHBHView: : BBI(CDC*pDC,intx1,inty1,intx2,inty2,floatSx,floatSy) { intx3,y3,x4,y4; x3=x1*Sx; y3=y1*Sy; x4=x2*Sx; y4=y2*Sy; pDC->MoveTo(x3,y3); pDC->LineTo(x4,y4); } voidCJHBHView: : XZ(CDC*pDC,intx1,inty1,intx2,inty2,doublea) { intx3,y3; doublerad=0.0174533; doublealpha,alpha1,c,s; alpha1=alpha*rad; c=cos(alpha1); s=sin(alpha1); x3=x2*c-y2*s; y3=y2*c+x2*s; pDC->MoveTo(x1,y1); pDC->LineTo(x3,y3); } 2、实验结果 实验地点 综合楼606 指导教师 学生实验报告 学院名称 计算机科学与技术学院 专业班级 学号 学生姓名 实验日期 2011-6-8 成绩 课程名称 计算机图形学 实验题目 BEZIER曲线和B样条曲线的绘制 一、实验目的 1、通过实验,进一步理解和掌握生成BEZIER曲线的算法; 2、掌握BEZIER曲线的基本生成过程; 3、通过编程,会在VC++环境下编程实现三次BEZIER曲线的绘制; 4、通过实验,进一步理解和掌握生成B样条曲线的算法; 5、掌握B样条曲线的基本生成过程; 6、通过编程,会在VC++环境下编程实现三次B样条曲线的绘制。 二、实验属性 该实验为验证性实验。 三、实验学时 2学时,必做实验 四、实验内容 1、编程实现三次BEZIER曲线的绘制; 2、编程实现三次B样条曲线的绘制。 五、实验步骤 1、算法、原理清晰,有详细的设计步骤; 2、依据算法、步骤或程序流程图,用VC++语言编写源程序; 3、编辑源程序并进行调试; 4、进行特殊模式的运行测试,并结合情况进行调整; 5、对运行结果进行保存与分析; 6、打印源程序或把源程序以文件的形式提交; 7、按格式书写实验报告。 六、实验数据 实验源代码 1.绘制BEZIER曲线: voidCBezierView: : DrawBezier() { CClientDCdc(this); doublex,y; intrate=800,n; n=CtrlPoint-1; for(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)); } } 2.绘制B样条曲线: voidCCgView: : OnBSpline() { CClientDCdc(this); doublex,y,Step,t,t2,t3,F03,F13,F23,F33; Step=0.1; for(inti=0;i { t=0.0; do{ t2=t*t; t3=t2*t; F03=(3*t2-t3-3*t+1.0)/6.0; F13=(3*t3-6*t2+4.0)/6.0; F23=(3*t2-3*t3+3*t+1.0)/6.0; F33=t3/6.0; x=(F03*px[i]+F13*px[i+1]+F23*px[i+2]+F33*px[i+3]); y=(F03*py[i]+F13*py[i+1]+F23*py[i+2]+F33*py[i+3]); if(t elsedc.LineTo(x,y); t+=Step; }while(t<1.0001); } } 实验结果 Bezier曲线 B样条曲线 实验地点 综合楼606 指导教师
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 实验 报告