图形学实验报告格式.docx
- 文档编号:6380747
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:40
- 大小:72.74KB
图形学实验报告格式.docx
《图形学实验报告格式.docx》由会员分享,可在线阅读,更多相关《图形学实验报告格式.docx(40页珍藏版)》请在冰豆网上搜索。
图形学实验报告格式
图形学实验报告格式
实验一直线、圆弧及曲线的生成算法
一、实验目的
1、几种直线生成算法的比较,特别掌握用Bresenham直线生成算法。
2、几种圆弧生成算法的比较,掌握Bresenham圆弧生成算法。
3、掌握用像素点法直接生成其它曲线的方法。
二、基本要求
1、用不同的生成算法在屏幕上绘制出直线的图形,对不同的算法可设置不同的线形或颜色表示区别。
2、用Bresenham生成算法在屏幕上绘制出圆弧的图形,用动画的方式表演图形的生成。
三、算法提示
1、有关直线生成算法有:
DDA(数值微分)直线算法、逐点比较法、直线Bresenham生成算法。
直线Bresenham生成算法思想如下(第一象限,且斜率k<1的情况图2-1a中的1a):
1)画点(x1,y1),dx=x2-x1,dy=y2-y1,计算误差初值P1=2dy-dx,i=1;
2)求直线下一点位置xi+1=xi+1如果Pi>0,则yi+1=yi+1,否则yi+1=yi;
3)画点(xi+1,yi+1);
4)求下一个误差Pi+1点,如果Pi>0,则Pi+1=Pi+2dy-2dx,否则Pi+1=Pi+2dy;
5)i=i+1,如果i Bresenham生成算法的优点如下; 1)不必计算直线的斜率,因此不做除法。 2)不用浮点数,只用整数。 3)只做整数加减运算和乘2运算,而乘2运算可以用移位操作实现。 Bresenham算法的速度很快,并适于用硬件实现。 对于图2-1a中的2a,只需将xi+1=xi+1改为xi+1=xi-1。 对于图2-1a中的1b,斜率k>1的情况,可交换变量x和y,y每次长1个单位。 对Pi进行判断,xi+1=xi或xi+1=xi+1。 2、有关圆弧生成算法有: 逐点比较法、DDA(数值微分)直线算法、圆的Bresenham生成算法。 圆的生成算法一般将圆划分为8等份,只需计算(900,450)的八分之一圆弧,其它用对称法求得(参见图2-1b)。 Bresenham生成算法思想如下(第一象限,且斜率k<1的情况): 1)计算误差初值P1=3-2r,i=1,画点(0,r); 2)求下一个光栅点位置xi+1=xi+1如果Pi<0,则yi+1=yi,否则yi+1=yi-1; 3)画点(xi+1,yi+1); 4)求下一个误差Pi+1点,如果Pi<0,则Pi+1=Pi+2xi+6,否则Pi+1=Pi+4(xi-yi)+10; 5)i=i+1,如果x=y则结束操作,否则转步骤2。 圆Bresenham算法的算式简单,只需做加减法和乘4运算 3.对屏幕布局的考虑 适当选取坐标,将屏幕分成几个区域性,在每个区域内实现一种算法,生成一个图形。 也可用delay实现延时实现动画。 四、上机作业题及思考题 1、用正负法编程绘制圆弧 2、用直线Bresenham生成算法绘制直线。 3、用Bresenham生成算法绘制圆。 五、参考源程序 1、数值微分法生成斜率小于90的直线 /*DDAline数值微分法生成斜率小于90的直线*/ #include #include"display.h" main() { intxo,yo,xa,ya,i,j; intdx,dy,c; floatddx,ddy,x,y; Initialize(); printf("inputstartx,y(x=0-640,y=0-480)\n"); scanf("%d,%d",&xo,&yo);/*输入直线的两个点*/ printf("xa: %d--639",xo); scanf("%d",&xa); printf("ya: 0..%d",yo); scanf("%d",&ya); printf("redlineissystem,yellowiscreate\n"); if(xa>=xo&&xa<=639&&ya>=0&&ya<=yo) /*数值微分法生成直线算法*/ { outtextxy(xo,yo+5,"o"); outtextxy(xa,ya-10,"a"); dx=xa-xo; dy=yo-ya; if(dx>dy)c=dx; elsec=dy; ddx=dx*1.0/c; ddy=dy*1.0/c; x=xo*1.0; y=yo*1.0; setcolor(12); line(xo,yo,xa,ya); getch(); while(c>=0) {i=round(x); j=round(y); putpixel(i,j,14); x=x+ddx; y=y-ddy; c=c-1; } } elseprintf("dataerror"); getch(); closegraph(); } intround(ff) floatff; {intk; if((ff-(int)ff)>0.5)k=(int)ff+1; elsek=(int)ff; k=(int)ff; return(k); } 2、逐点插补法生成圆弧源程序 /*STEPCIRCLE逐点插补法生成圆弧*/ #include #include"display.h" main() { intxo,yo,xa,ya,r,l,f; Initialize(); printf("inputx,y,r");/*输入圆心和半径*/ scanf("%d,%d,%d",&xo,&yo,&r); xa=xo+r; ya=yo; setcolor(12); circle(xo,yo,r); line(xo-r,yo,xo+r,yo); line(xo,yo-r,xo,yo+r); line(xo,yo,xo+140,yo-140); l=r*1.414/2; f=0; while(l! =0) { putpixel(xa,ya,14); putpixel(xa,2*yo-ya,14); putpixel(2*xo-xa,ya,14); putpixel(2*xo-xa,2*yo-ya,14); putpixel(xo+ya-yo,yo+xa-xo,14); putpixel(xo+ya-yo,yo-xa+xo,14); putpixel(xo-ya+yo,yo+xa-xo,14); putpixel(xo-ya+yo,yo-xa+xo,14); getch(); if(f>=0) { xa=xa-1; f=f-2*(xa-xo)+1; } else { ya=ya-1; f=f+2*(yo-ya)+1; l=l-1; } } getch(); closegraph(); } 3、椭圆的生成算法 /*elipse生成椭圆*/ #include #include"display.h" main() { Initialize(); draw_ett(180,100,14); getch(); closegraph(); } draw_ett(a,b,color) inta,b,color; {intx,y,xo,yo; intl; floatf,ff; xo=300; yo=200; x=0; y=b; f=1.0*b*b+a*a*(-b+0.25); putpixel(xo,yo,12); while(1.0*b*b*(x+1)<=a*a*(y-0.5)) { putpixel(x+xo,yo-y,color); if(f<0) { f=f+1.0*b*b*(2*x+3); x=x+1;} else{ f=f+1.0*b*b*(2*x+3)+1.0*a*a*(-2*y+2); x=x+1; y=y-1; } } f=1.0*b*b*(x+0.5)*(x+0.5)+1.0*a*a*(y-1)*(y-1)-1.0*a*b*a*b; while(y>0) { putpixel(x+xo,yo-y,color); if(f<0) { f=f+1.0*b*b*(2*x+2)+1.0*a*a*(-2*y+3); x=x+1; y=y-1;} else{ f=f+1.0*a*a*(-2*y+3); y=y-1; } } } 计算机图形学实验报告一 实验名称直线、圆弧及曲线的生成算法评分 实验日期年月日指导教师 姓名专业班级学号 一、实验目的 二、实验要求 三、关键算法及实现原理 四、程序调试中的问题 五、程序运行结果或数据 六、实验收获及体会 七、参考源程序(可附页) 实验二二维图形的几何变换 一、实验目的 1、复习不同的二维坐标变换公式。 2、掌握二维坐标变换公式的使用方法。 3、对二维坐标组合变换的灵活运用。 二、基本要求 1、在屏幕上绘制出较简单的几何图形。 2、对1的图形进行平移变换,绘制出变换后的几何图形,并在下边标注出实施x,y各多少的平称坐标变换。 3、对1的图形进行旋转变换,绘制出变换后的几何图形,并在下边标注出实施多少度的旋转坐标变换。 4、对1的图形进行对称变换,绘制出变换后的几何图形,并在下边标注出实施对什么坐标进行的对称变换。 5、对1的图形进行错切变换,绘制出变换后的几何图形,并在下边标注出实施对何种坐标进行的错切变换。 6、对1的图形进行比例变换,绘制出变换后的几何图形,并在下边标注出实施的多少比例坐标变换。 7、为了进行比较,适当选择坐标,可将原图(变换前)及经过不同变换后的图形绘制在同一个屏幕上,设置不同的线形或颜色加以区分各种变换。 三、算法提示 1、二维图形的变换实际上是一个变换矩阵,平面图形是由若干个二维点(xi,yi)组成,经过变换后的二维点(x’i,y’i),其变换公式为: 对应于不同的变换,都是用矩阵乘法来计算坐标,只需改变变换矩阵即可。 因此对每一种坐标变换编成一个子程序。 2、编程时的技巧 用数组将二维图形的特征坐标点(顶点)保存,将由特征坐标点(顶点)绘制出二维图形的命令编一个绘图子程序,调用绘图子程序绘制出变换以前的图形,根据不同的两维几何变换,选用相应二维坐标变换公式(调用相应的子程序)将二维坐标进行坐标变换;再调用绘图子程序将变换后的坐标值在屏幕上绘制变换后的几何将图形,可选用不同的颜来区分各种不同几何变换的图形。 四、上机作业题 1、编写一个能对任何直线能实现对称变换的子程序。 2、作出右边的图形,并作下列变换,用不同颜色作出变换后的图形。 1)作平移(50,-150)。 2)旋转–90度。 3)对X=Y直线作对称变换。 4)沿Y方向作错切变换。 五、参考实例源程序 下面是对四边形能完成单项二维变换(平移、比例、错切)的源程序 #include #include #include #include doublexmax=639.0,ymax=399.0; doublef[3][3],xx,yy; intscx(doublexj) { intx; x=(int)(xj+xmax/2); return(x); } intscy(doubleyj) { inty; y=ymax-(int)(yj+ymax/2); return(y); } voidparallel(doubledx,doubledy) { f[0][0]=1.0;f[0][1]=0.0;f[0][2]=0.0; f[1][0]=0.0;f[1][1]=1.0;f[1][2]=0.0; f[2][0]=dx;f[2][1]=dy;f[2][2]=1.0; } voidscale(doubles) { f[0][0]=s;f[0][1]=0.0;f[0][2]=0.0; f[1][0]=0.0;f[1][1]=s;f[1][2]=0.0; f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0; } voidtaisho_y() { f[0][0]=-1.0;f[0][1]=0.0;f[0][2]=0.0; f[1][0]=0.0;f[1][1]=1.0;f[1][2]=0.0; f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0; } voidaxis() { line(scx(0.0),scy(-ymax/2),scx(0),scy(ymax/2)); line(scx(-xmax/2),scy(0.0),scx(xmax/2),scy(0.0)); } voidtuoq(doublea,doubleb) { f[0][0]=1.0;f[0][1]=b;f[0][2]=1.0; f[1][0]=a;f[1][1]=1.0;f[1][2]=0.0; f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0; } doubleaffinex(doublex,doubley,doubled) { xx=x*f[0][0]+y*f[1][0]+d*f[2][0]; return(xx); } doubleaffiney(doublex,doubley,doubled) { yy=x*f[0][1]+y*f[1][1]+d*f[2][1]; return(yy); } voiddrawtu(x2,y2) doublex2[5],y2[5]; { inti; for(i=0;i<=3;i++) { line(scx(x2[i]),scy(y2[i]),scx(x2[i+1]),scy(y2[i+1])); } } voidmain() {intdrive=DETECT,mode; staticdoublex1[]={50.0,60.0,150.0,160.0,50.0}; staticdoubley1[]={0.0,50.0,50.0,-10.0,0.0}; staticdoublex2[5],y2[5]; inti; doublex,y,xx,yy,yt; initgraph(&drive,&mode,"c: \\tc3\\bgi"); setcolor(RED); axis(); for(i=0;i<=3;i++) { line(scx(x1[i]),scy(y1[i]),scx(x1[i+1]),scy(y1[i+1])); } /*parallel(100,-100)*/ getch(); x=100;y=-100; parallel(x,y); setcolor(BLUE); for(i=0;i<=4;i++) { x2[i]=affinex(x1[i],y1[i],1.0); y2[i]=affiney(x1[i],y1[i],1.0); } drawtu(x2,y2); yt=scy(y2[0])+10; outtextxy(scx(x2[0]),yt,"parallel(100,-100)"); /*taisho_y()*/ getch(); taisho_y(); setcolor(YELLOW); for(i=0;i<=4;i++) { x2[i]=affinex(x1[i],y1[i],1.0); y2[i]=affiney(x1[i],y1[i],1.0); } drawtu(x2,y2); yt=scy(y2[0])+10; outtextxy(scx(x2[0]),yt,"taisho_y"); /*touq(2,0)*/ getch(); tuoq(2,0); setcolor(LIGHTBLUE); for(i=0;i<=4;i++) { x2[i]=affinex(x1[i],y1[i],1.0); y2[i]=affiney(x1[i],y1[i],1.0); } drawtu(x2,y2); yt=scy(y2[0])+10; outtextxy(scx(x2[0]),yt,"tuoq(2,0)"); /*scale (2)*/ getch(); scale (2); setcolor(LIGHTRED); for(i=0;i<=4;i++) { x2[i]=affinex(x1[i],y1[i],1.0); y2[i]=affiney(x1[i],y1[i],1.0); } drawtu(x2,y2); yt=scy(y2[0])+10; outtextxy(scx(x2[0]),yt,"scale2"); getch(); closegraph(); } 计算机图形学实验报告二 实验名称二维图形的几何变换评分 实验日期年月日指导教师 姓名专业班级学号 一、实验目的 二、实验要求 三、关键算法及实现原理 四、程序调试中的问题 五、程序运行结果或数据 六、实验收获及体会 七、参考源程序(可附页) 实验三进行多边形的裁剪及填充 一、实验目的 1、复习编码裁剪法和矢量裁剪法。 2、复习多边形区域填充和种子填充的原理和算法。 3、掌握编码裁剪法的编程方法和步骤。 4、多边形逐边裁剪法的编程方法实现编程。 5、掌握种子填充算法的基本原理和编程方法。 二、基本要求 1、在屏幕上绘制出一个矩形作为裁剪边界,再用不同的颜色绘出几个由线段组成的简单几何图形,它们和裁剪边界可相交或不相交。 按一个键,实现一条线段的裁剪,裁剪后的线段可用另一种颜色绘制,继续按键,直至全部线段裁剪完。 2、在屏幕上绘制用线、矩形、圆、多边形等绘制一些简单的几何图形,选择合适的种子坐标,用种子填充方法将它填充。 对于被划分为多个区域的几何图形,注意观察改变种子坐标点的位置,所填充的区域不同。 三、算法提示 1、Sutherland-Cohen(编码)裁剪算法 用数组保存裁剪边界的坐标值和被裁剪边界的坐标值;根据逐边裁剪方法对被裁剪边界进裁剪,计算出裁剪后的坐标;再将裁剪后的直线用不同颜色绘制到屏幕上。 2、Sutherland-Hodgman多边形裁剪算法 多边形裁剪算法的关键在于,通过裁剪,不仅要保留窗口内多边形的边界部分,而且要将窗框有关部分按一定的次序插入多边形保留边界之间,从而使多边形的边仍然保持封闭状态。 Sutherland-Hodgman多边形裁剪算法: 令多边形的顶点按边线逆时针走向排序P1、P2、…、Pn,多边形各边先与上窗框求交。 求交后删去多边形一窗框之上的部分,并插入窗边及延长线与多边形的交点之间的部分,从而形成一个新多边形。 然后,新的多边形按相同的方法与右窗框相剪裁。 如此重重,直至多边形与各窗框都裁剪完毕。 3、种子填充算法 种子填充算法采用的边界定义是区域边界上所有像素均具有某个特定值,区域内部所有像素均不取这一特定颜色。 用函数getpixel(seedx,seedy)取出种子坐标点(seedx,seedy)的像素点的颜色,如果它的颜色值不等于边界指定的颜色值,则对它用指定的颜色进行填充。 用四向连通方法是指从区域上一点(种子坐标点)出发,可通过上、下、左、右四个方向(沿X,Y坐标正负方向各前进一个单位)作为新的种子点进行填充。 编程时宜采用递归方式进行。 四、上机作业题 1、编写编码裁剪算法源程序,并实现对一些图形的裁剪 2、用种子填充算法编程实现对几个二维图形的填充。 五、实例源程序 1.Sutherland-Hodglman多边形裁剪算法源程序,用一个矩形作为裁剪边界裁剪一个多边形,要求数据结构的链表学得较好。 /*Sutherland-Hodgman算法*/ #defineLENsizeof(structnode) #include #include"display.h" structnode{ intdx,dy; structnode*next; }; structnode*creat() {structnode*h,*q,*r; intp[8][2]={100,120,160,50,180,100,200,80,240,160,210,220,170,160,140,190}; inti; setcolor(12); for(i=0;i<7;i++)line(p[i][0],p[i][1],p[i+1][0],p[i+1][1]); line(p[0][0],p[0][1],p[7][0],p[7][1]); rectangle(120,200,230,70); h=NULL; for(i=0;i<8;i++) {q=(structnode*)malloc(LEN); q->dx=p[i][0];q->dy=p[i][1]; if(h==NULL)h=q; elser->next=q; r=q; } r->next=NULL; return(h); } structnode*builx(h,x) structnode*h; intx; {ints[2],j[2]; structnode*hh,*p,*r,*q; intmax,min; p=h;hh=NULL; s[0]=p->dx;s[1]=p->dy; p=p->next; while(p! =NULL) {j[0]=x; j[1]=s[1]+(p->dy-s[1])*(x-s[0])/(p->dx-s[0]); max=s[0];min=p->dx; if(s[0] if((j[0]>=min)&&(j[0]<=max)) {q=(structnode*)malloc(LEN); q->dx=j[0];q->dy=j[1]; if(hh==NULL)hh=q; elser->next=q; r=q; } if(p->dx>=x) {q=(structnode*)malloc(LEN); q->dx=p->dx;q->dy=p->dy; i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图形学 实验 报告 格式