图形学实验报告

上传人:good****022 文档编号:116500901 上传时间:2022-07-05 格式:DOC 页数:26 大小:337KB
返回 下载 相关 举报
图形学实验报告_第1页
第1页 / 共26页
图形学实验报告_第2页
第2页 / 共26页
图形学实验报告_第3页
第3页 / 共26页
点击查看更多>>
资源描述
-山东建筑大学测绘地理信息学院实验报告(20162017学年第一学期)课 程:计算机图形学专 业:地理信息科学班 级:地信141学生姓名:王俊凝学 号:20140113010指欢迎下载实验一 直线生成算法设计一、实验目的掌握基本图形元素直线的生成算法,利用编程语言C分别实现直线和圆的绘制算法。二、实验任务 在TurboC环境下开发出绘制直线和圆的程序。三、实验仪器设备 计算机。四、实验方法与步骤1 运行TurboC编程环境。2 编写Bresenham直线绘制算法的函数并进行测试。3 编写中点圆绘制算法的函数并进行测试。4 增加函数参数,实现直线颜色的设置。提示:1. 编程时可分别针对直线和圆的绘制算法,设计相应的函数,例如void drawline()和void drawcircle(),直线的两个端点可作为drawline的参数,圆的圆心和半径可作为drawcircle的参数。2. 使用C语言编写一个结构体类型用来表示一个点,结构体由两个成员构成,x和y。这样,在向函数传入参数时,可使用两个点类型来传参。定义方法为:typedef structint x;int y;pt2;此处,pt2就是定义的一个新的结构体数据类型,之后就可用pt2来定义其他变量,具体用法见程序模板。3. 在main函数中,分别调用以上函数,并传入不同的参数,实现对直线的绘制。4. 线的颜色也可作为参数传入,参数可采用TurboC语言中的预设颜色值,具体参见TurboC图形函数。五、注意事项1 代码要求正确运行,直线和圆的位置应当为参数,实现可配置。2 程序提交.c源文件,函数前和关键代码中增加注释。程序模板#include #include typedef structint x;int y;pt2;/*declare your drawing functions.*/void drawline(pt2 startpt,pt2 endpt,int color);void drawcircle(pt2 centerpt,int radius,int color);void circlePlotPoints(pt2 centerpt,int x,int y,int color);int main()int color,radius;pt2 startpt,endpt,centerpt;/*initialize graphics driver.*/int gdriver=VGA;int gmode=VGAHI;initgraph(&gdriver, &gmode, C:TC20BGI);/*start drawing.*/printf(Press enter to start drawing.);getchar();/*invoke your drawing functions one by one.*/startpt.x=10;startpt.y=10;endpt.x=300;endpt.y=250;color=4;drawline(startpt,endpt,color);centerpt.x=200;centerpt.y=180;radius=145;color=8;drawcircle(centerpt,radius,color);/*end drawing.*/printf(Drawing is done, press enter to exit.);getchar();/*close graphics driver.*/closegraph();/* draw line* startpt: the start point of the line* endpt: the end point of the line* color: the color of the line*/void drawline(pt2 startpt,pt2 endpt,int color)int dx=abs(startpt.x-endpt.x), dy=abs(startpt.y-endpt.y);int p=2*dy-dx;int twoDy=2*dy,twoDyDx=2*(dy-dx);int x,y,xEnd;if(startpt.xendpt.x)x=endpt.x;y=endpt.y;xEnd=startpt.x;elsex=startpt.x;y=startpt.y;xEnd=endpt.x;putpixel(x,y,color);while(xxEnd)x+;if(p0) p+=twoDy;else y+; p+=twoDyDx;putpixel(x,y,color);/* draw circle* centerpt: the center of the circle* radius: the radius of the circle* color: the color of the circle*/void drawcircle(pt2 centerpt,int radius,int color)int x=0;int y=radius;int p=1-radius;circlePlotPoints(centerpt,x,y,color);while(xy)x+;if(p0)p+=2*x+1;elsey-;p+=2*(x-y)+1;circlePlotPoints(centerpt,x,y,color);void circlePlotPoints(pt2 centerpt,int x,int y,int color)putpixel(centerpt.x+x,centerpt.y+y,color);putpixel(centerpt.x-x,centerpt.y+y,color);putpixel(centerpt.x+x,centerpt.y-y,color);putpixel(centerpt.x-x,centerpt.y-y,color);putpixel(centerpt.x+y,centerpt.y+x,color);putpixel(centerpt.x-y,centerpt.y+x,color);putpixel(centerpt.x+y,centerpt.y-x,color);putpixel(centerpt.x-y,centerpt.y-x,color);运行结果欢迎下载实验二 多边形区域填充算法设计一、实验目的掌握多边形图形元素的填充算法,利用编程语言C实现多边形的区域填充算法。二、实验任务 在TurboC环境下开发出多边形区域填充的程序。三、实验仪器设备 计算机。四、实验方法与步骤1 运行TurboC编程环境。2 编写基于四连通区域的种子填充算法。3 编写基于八连通区域的种子填充算法。4 对填充函数进行测试。提示:1. 编程中需要使用数据结构中的栈,可利用C语言线编写一个对应的数据结构,然后在填充函数中进行使用。以下过程是对四连通区域填充过程的分解,可作为算法实现的参考。2. 可将两种填充算法分别设计一个函数,例如RegionFill4()、RegionFill8(),函数中间是作为参数输入的区域。3. 区域的表示可以采用一维数组形式,数组类型是点类型(实验一中定义的结构体),依次将构成多边形的每个顶点的坐标创建点变量,并保存到一个一维数组中进行参数传递。4. 在main函数中来生成一定的区域,并生成表示区域的一维数组,然后通过调用填充算法函数,完成区域填充。#include #include void boundaryFill4(int x,int y,int fill,int boundary)int current;current=getpixel(x,y);if(current!=boundary)&(current!=fill)putpixel(x,y,fill);boundaryFill4(x+1,y,fill,boundary);boundaryFill4(x-1,y,fill,boundary);boundaryFill4(x,y+1,fill,boundary);boundaryFill4(x,y-1,fill,boundary);int main()/*initialize graphics driver.*/int gdriver=VGA;int gmode=VGAHI;initgraph(&gdriver, &gmode, C:TC20BGI);moveto(0,0);lineto(120,100);lineto(50,80);lineto(0,0);boundaryFill4(50,78,2,15);/*end drawing.*/printf(Drawing is done, press enter to exit.);getchar();/*close graphics driver.*/closegraph();运行结果五、注意事项1 代码要求正确运行,填充颜色设置为函数的参数,实现可配置。2 程序提交.c源文件,函数前和关键代码中增加注释。实验三 图形变换算法设计一、实验目的掌握图形变换的类型和算法,利用编程语言C,实现二维图形的平移、缩放、旋转和仿射变换算法。二、实验任务 在TurboC环境下开发出二维图形的平移、缩放、旋转和仿射变换算法。三、实验仪器设备 计算机。四、实验方法与步骤1 运行TurboC编程环境。2 编写二维图形的平移算法。3 编写二维图形的固定缩放算法。4 编写二维图形的固定点旋转算法。5 编写二维图形的固定点缩放算法。6 编写二维图形的复合变换算法,实现图形的平移、旋转和缩放算法。7 编写二维图形的仿射变换算法。提示:1. 针对每种变换算法,编写一个函数,并设计相应的参数。参数可以使用实验一编写的点类型来构造。2. 为更好地体现变换效果,在试验一编写的直线绘制算法基础上,再编写一个绘制多边形的算法函数,该函数只是将传入的多边形顶点依次进行直线绘制即可完成。2. 在main函数中,通过组合调用以上函数,实现对二维多边形图形的几何变换。查看方法可以设定为:首先调用多边形绘制算法函数,生成初始图形,然后通过调用变换函数,得到变换后的起点和终点坐标,最后再调用多边形绘制算法,查看变换后的图形样式。3. 为使图形比较更为明显,可在多边形绘制参数中增加颜色值,并分别以不同颜色绘制变换前、后的多边形。4. 对图形进行多次变换,依次查看每种几何变换的特点。#include #include #include #define WINDOW_HEIGHT 300typedef struct tEdgeint yUpper;float xIntersect,dxPerScan;struct tEdge *next;Edge;typedef structint x;int y;dcPt;/*declare your drawing functions.*/void insertEdge(Edge *list,Edge *edge)Edge *p,*q=list;p=q-next;while(p!=NULL)if(edge-xIntersectxIntersect)p=NULL;elseq=p;p=p-next;edge-next=q-next;q-next=edge;int yNext(int k,int cnt,dcPt *pts)int j;if (k+1)(cnt-1)j=0;elsej=k+1;while(ptsk.y=ptsj.y)if(j+1)(cnt-1)j=0;elsej+;return(ptsj.y);void makeEdgeRec(dcPt lower,dcPt upper,int yComp,Edge *edge,Edge *edges)edge-dxPerScan=(float)(upper.x-lower.x)/(upper.y-lower.y);edge-xIntersect=lower.x; if(upper.yyUpper=upper.y-1; else edge-yUpper=upper.y; insertEdge(edgeslower.y,edge); void buildEdgeList(int cnt,dcPt *pts,Edge *edges )Edge *edge;dcPt v1,v2;int i,yPrev=ptscnt-2.y;v1.x=ptscnt-1.x;v1.y=ptscnt-1.y;for(i=0;icnt;i+)v2=ptsi;if(v1.y!=v2.y)edge=(Edge*)malloc(sizeof(Edge);if (v1.ynext;while(p)q=p-next;insertEdge(active,p);p=q;void fillScan(int scan,Edge *active)Edge *p1,*p2;int i;p1=active-next;while(p1)p2=p1-next;for(i=p1-xIntersect;ixIntersect;i+)putpixel(int )i,scan,5);p1=p2-next;void deleteAfter(Edge *q)Edge *p=q-next;q-next=p-next;free(p);void updateActiveList(int scan,Edge *active)Edge *q=active,*p=active-next;while(p)if (scan=p-yUpper)p=p-next;deleteAfter(q);elsep-xIntersect=p-xIntersect+p-dxPerScan;q=p;p=p-next;void resortActiveList(Edge * active)Edge *q,*p=active-next;active-next=NULL;while(p)q=p-next;insertEdge(active,p);p=q;void scanFill(int cnt,dcPt *pts)Edge *edgesWINDOW_HEIGHT,*active;int i,scan;for(i=0;inext=NULL; buildEdgeList(cnt,pts,edges);active=(Edge *)malloc(sizeof(Edge);active-next=NULL;for(scan=0;scannext)fillScan(scan,active);updateActiveList(scan,active);resortActiveList(active);int main()int cnt=5;dcPt *pts = (dcPt *)malloc(4*sizeof(dcPt);/*initialize graphics driver.*/int gdriver=VGA;int gmode=VGAHI;initgraph(&gdriver, &gmode, C:TC20BGI);/*start drawing.*/printf(Press enter to start drawing.);getchar();/*invoke your drawing functions one by one.*/pts0.x = 60;pts0.y = 60;pts1.x = 180;pts1.y =165;pts2.x = 220;pts2.y = 200;pts3.x = 90;pts3.y = 90;pts4.x = 120;pts4.y = 100;scanFill(cnt,pts);/*end drawing.*/printf(Drawing is done, press enter to exit.);getchar();/*close graphics driver.*/closegraph();运行结果 五、注意事项1 代码要求正确运行,样条控制点参数实现可配置。2 程序提交.c源文件,函数前和关键代码中增加注释。实验四 样条曲线生成算法设计一、实验目的掌握样条曲线的类型和生成算法,利用编程语言C,实现Bzier样条曲线的生成算法。二、实验任务 在TurboC环境下开发出Bzier样条曲线生成算法程序。三、实验仪器设备 计算机。四、实验方法与步骤1 运行TurboC编程环境。2 编写Bzier样条曲线的生成函数。3 封装函数,可实现样条曲线控制点参数的可配置。4 测试Bzier样条曲线函数。提示:1. 编写一个函数来生成Bzier样条曲线,例如Bezier(),参数传入Bzier样条曲线的控制点,此处可以使用四个控制点。2. 可利用试验一编写的点类型,将四个控制点分别传递,或作为一个一维数组传入样条函数中。3. 在main函数中,生成四个控制点,通过调用Bzier样条函数,查看生成的图形。通过变换其中一个控制点,查看Bzier样条依据加权原理生成曲线的特点。#include #include #include#includetypedef structint x;int y;int z;wcPt3;void computeCoefficients(int n,int * c)int k,i;for(k=0;k=k+1;i-)ck*=i;for(i=n-k;i=2;i-)ck/=i;void computePoint(float u,wcPt3 * pt,int nControls,wcPt3 * controls,int * c)int k,n=nControls-1;float blend;pt-x=0.0;pt-y=0.0;pt-z=0.0;for(k=0;kx+=controlsk.x*blend; pt-y+=controlsk.y*blend; pt-z+=controlsk.z*blend; void bezier(wcPt3 * controls,int nControls,int m,wcPt3 * curve)int * c=(int *)malloc(nControls *sizeof(int);int i;computeCoefficients(nControls-1,c);for(i=0;i=m;i+) computePoint(i/(float)m,&curvei,nControls,controls,c);for(i=0;i=m;i+) curvei;free(c);int main()wcPt3 *controls = (wcPt3 *)malloc(4*sizeof(wcPt3);int nControls =4;int i,m=200;wcPt3 *curve = (wcPt3 *)malloc(m+1)*sizeof(wcPt3);int gdriver=VGA;int gmode=VGAHI;initgraph(&gdriver,&gmode,C:TC20BGI);printf(Press enter to start drawing:);getchar();controls0.x = 140;controls0.y = 150;controls1.x = 250;controls1.y = 200;controls2.x = 500;controls2.y = 250;controls3.x = 700;controls3.y = 300;bezier(controls,nControls,m,curve);setcolor(7);moveto(curve0.x,curve0.y);for(i=0;im;i+) lineto(curvei.x,curvei.y);printf(Drawing is done,press enter to exit.);getchar();closegraph();运行结果五、注意事项1 代码要求正确运行,样条控制点参数实现可配置。2 程序提交.c源文件,函数前和关键代码中增加注释。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业管理 > 营销创新


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!