图形学实验报告
山东建筑大学测绘地理信息学院实验报告(2016—2017学年第一学期)课程:计算机图形学专业:地理信息科学班级:地信141学生姓名:王俊凝学号:010指实验一直线生成算法设计一、实验目的掌握基本图形元素直线的生成算法,利用编程语言C分别实现直线和圆的绘制算法。
二、实验任务在TurboC环境下开发出绘制直线和圆的程序。
三、实验仪器设备计算机。
四、实验方法与步骤1 运行TurboC编程环境。
2 编写Bresenham直线绘制算法的函数并进行测试。
3 编写中点圆绘制算法的函数并进行测试。
4 增加函数参数,实现直线颜色的设置。
提示:1. 编程时可分别针对直线和圆的绘制算法,设计相应的函数,例如void drawline(…)和void drawcircle(…),直线的两个端点可作为drawline的参数,圆的圆心和半径可作为drawcircle的参数。
2. 使用C语言编写一个结构体类型用来表示一个点,结构体由两个成员构成,x和y。
这样,在向函数传入参数时,可使用两个点类型来传参。
定义方法为:typedef struct{int x;int y;}pt2;此处,pt2就是定义的一个新的结构体数据类型,之后就可用pt2来定义其他变量,具体用法见程序模板。
3. 在main函数中,分别调用以上函数,并传入不同的参数,实现对直线的绘制。
4. 线的颜色也可作为参数传入,参数可采用TurboC语言中的预设颜色值,具体参见TurboC图形函数。
五、注意事项1 代码要求正确运行,直线和圆的位置应当为参数,实现可配置。
2 程序提交.c源文件,函数前和关键代码中增加注释。
程序模板#include <>#include <>typedef struct{int 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:\\TC20\\BGI");/*start drawing.*/printf("Press enter to start drawing."); getchar();/*invoke your drawing functions one by one.*/ =10;=10;=300;=250;color=4;drawline(startpt,endpt,color);=200;=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 dy=abs int p=2*dy-dx;int twoDy=2*dy,twoDyDx=2*(dy-dx);int x,y,xEnd;if>{x=;y=;xEnd=;}else{x=;y=;xEnd=;}putpixel(x,y,color);while(x<xEnd){x++;if(p<0)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(x<y){x++;if(p<0)p+=2*x+1;else{y--;p+=2*(x-y)+1;}circlePlotPoints(centerpt,x,y,color);}}void circlePlotPoints(pt2 centerpt,int x,int y,int color) {putpixel+x,+y,color);putpixel,+y,color);putpixel+x,,color);putpixel,,color);putpixel+y,+x,color);putpixel,+x,color);putpixel+y,,color);putpixel,,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:\\TC20\\BGI");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 tEdge{int yUpper;float xIntersect,dxPerScan;struct tEdge *next;}Edge;typedef struct{int 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->xIntersect<p->xIntersect)p=NULL;else{q=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(pts[k].y==pts[j].y)if((j+1)>(cnt-1))j=0;elsej++;return(pts[j].y);}void makeEdgeRec(dcPt lower,dcPt upper,int yComp,Edge *edge,Edge *edges[]){edge->dxPerScan=(float) e dge->xIntersect=;if<yComp)edge->yUpper=;elseedge->yUpper=;insertEdge(edges[],edge);}void buildEdgeList(int cnt,dcPt *pts,Edge *edges[] ){Edge *edge;dcPt v1,v2;int i,yPrev=pts[cnt-2].y;=pts[cnt-1].x;=pts[cnt-1].y;for(i=0;i<cnt;i++){v2=pts[i];if!={edge=(Edge*)malloc(sizeof(Edge));if <makeEdgeRec(v1,v2,yNext(i,cnt,pts),edge,edges);elsemakeEdgeRec(v2,v1,yPrev,edge,edges);}yPrev=;v1=v2;}}void buildActiveList(int scan,Edge *active,Edge *edges[]) {Edge *p,*q;p=edges[scan]->next;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;i<p2->xIntersect;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);}else{p->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 *edges[WINDOW_HEIGHT],*active;int i,scan;for(i=0;i<WINDOW_HEIGHT;i++){edges[i]=(Edge *)malloc(sizeof(Edge));edges[i]->next=NULL;}buildEdgeList(cnt,pts,edges);active=(Edge *)malloc(sizeof(Edge));active->next=NULL;for(scan=0;scan<WINDOW_HEIGHT;scan++) {buildActiveList(scan,active,edges);if (active->next){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:\\TC20\\BGI");/*start drawing.*/printf("Press enter to start drawing."); getchar();/*invoke your drawing functions one by one.*/pts[0].x = 60;pts[0].y = 60;pts[1].x = 180;pts[1].y =165;pts[2].x = 220;pts[2].y = 200;pts[3].x = 90;pts[3].y = 90;pts[4].x = 120;pts[4].y = 100;scanFill(cnt,pts);/*end drawing.*/printf("Drawing is done, press enter to exit."); getchar();/*close graphics driver.*/closegraph();}运行结果五、注意事项1 代码要求正确运行,样条控制点参数实现可配置。
图形学实验报告
学院:计算机学院实验课程:计算机图形学实验项目:制作一个绘图界面开课时间:2015 ~2016年度第1学期指导老师:杨晋吉专业:计算机科学与技术(师范)华南师范大学教务处一、实验目的利用计算机编程语言绘制图形,主要实现了以下内容:(1)画线(2)画圆(3)画多边形(矩形和圆角矩形)(4)填充(5)变换(平移、旋转、比例变换)二、实验环境Windows 8.0 操作系统,NetBean6.5,Java语言三、实验过程(1)窗口界面功能JFrame类JToolBar类工具栏MouseAdapter类鼠标位置显示JPanel类画图区域JLabel类标签栏(2)菜单栏可实现功能(3)画画区域内可实现功能菜单栏 Help 帮助 Stroke 粗细File (文件) Color 颜色 New (更新) Save (保存)Load (下载)Exit (退出)四、各功能实现算法及截图1)Pencil类-随笔画算法:class Pencil extends drawings//随笔画类{void draw(Graphics2D g2d) {g2d.setPaint(new Color(R, G, B));g2d.setStroke(new BasicStroke(stroke,BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));g2d.drawLine(x1, y1, x2, y2);}}截图:2)Line类-画直线算法:class Line extends drawings //直线类{void draw(Graphics2D g2d) {g2d.setPaint(new Color(R, G, B));g2d.setStroke(new BasicStroke(stroke,BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));g2d.drawLine(x1, y1, x2, y2);System.out.println(" Line ");}}截图:3)Rect类-画矩形算法:class Rect extends drawings//矩形类{void draw(Graphics2D g2d) {g2d.setPaint(new Color(R, G, B));g2d.setStroke(new BasicStroke(stroke));g2d.drawRect(Math.min(x1, x2), Math.min(y1, y2),Math.abs(x1 - x2), Math.abs(y1 - y2));}}截图:4)RoundRect类-画圆角矩形算法:class RoundRect extends drawings//圆角矩形类{void draw(Graphics2D g2d) {g2d.setPaint(new Color(R, G, B));g2d.setStroke(new BasicStroke(stroke));g2d.drawRoundRect(Math.min(x1, x2), Math.min(y1, y2),Math.abs(x1 - x2), Math.abs(y1 - y2),50, 35);System.out.println(" RoundRect ");}}截图:5)Oval类-画椭圆算法:class Oval extends drawings//椭圆类{void draw(Graphics2D g2d) {g2d.setPaint(new Color(R, G, B));g2d.setStroke(new BasicStroke(stroke));g2d.drawOval(Math.min(x1, x2), Math.min(y1, y2),Math.abs(x1 - x2), Math.abs(y1 - y2));}}截图:6)Circle类-画圆算法:class Circle extends drawings//圆类{void draw(Graphics2D g2d) {g2d.setPaint(new Color(R, G, B));g2d.setStroke(new BasicStroke(stroke));g2d.drawOval(Math.min(x1, x2), Math.min(y1, y2),Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2)),Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2)));}}截图:7)橡皮擦算法:class Rubber extends drawings//橡皮擦类{void draw(Graphics2D g2d) {g2d.setPaint(new Color(255, 255, 255));g2d.setStroke(new BasicStroke(stroke + 4,BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));g2d.drawLine(x1, y1, x2, y2);}}截图:8)填充算法:int tu[][] ;public void setColor(int x, int y,Graphics2D g2d){Color newColor = new Color(R,G,B);g2d.setPaint(newColor);g2d.setStroke(new BasicStroke(stroke,BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));g2d.drawLine(x, y, x, y);tu[x][y] = get(newColor);System.out.println("tu"+tu[x][y]);// g2d.drawLine(x, y, x+1, y);//g2d.drawLine(x, y, x, y+1);// g2d.drawLine(x, y, x+1, y+1);}public void floodFill8(int x, int y,int newColor,int oldColor,Graphics2D g2d,Point s){int haColor = getpixel(x,y,s);if( tu[x][y] == newColor)haColor =newColor;if(x >= 0 && x < 1024 && y >= 0 && y < 980 && (haColor == oldColor) && haColor != newColor){System.out.println("进来了");System.out.println("S x "+x+" y "+y+" "+newColor);setColor(x, y, g2d);floodFill8(x + 1, y,newColor, oldColor, g2d,s);floodFill8(x - 1, y,newColor, oldColor, g2d,s);floodFill8(x, y + 1, newColor, oldColor, g2d,s);floodFill8(x, y - 1, newColor, oldColor, g2d,s);// floodFill8(x + 1, y + 1, newColor, oldColor, g2d,s);// floodFill8(x - 1, y - 1, newColor, oldColor, g2d,s);// floodFill8(x - 1, y + 1, newColor, oldColor, g2d,s);// floodFill8(x + 1, y - 1, newColor, oldColor, g2d,s);}}int getpixel(int x,int y,Point a){//获得当前坐标颜色信息Robot rb = null; //java.awt.image包中的类,可以用来抓取屏幕,即截屏。
计算机图形学实验报告4
计算机图形学实验报告4一、实验目的本次计算机图形学实验旨在深入了解和掌握计算机图形学中的一些关键概念和技术,通过实际操作和编程实现,提高对图形生成、变换、渲染等方面的理解和应用能力。
二、实验环境本次实验使用的软件环境为_____,编程语言为_____,硬件环境为_____。
三、实验内容1、二维图形的绘制使用基本的绘图函数,如直线、矩形、圆形等,绘制简单的二维图形。
通过设置线条颜色、填充颜色等属性,增强图形的表现力。
2、图形的几何变换实现图形的平移、旋转和缩放操作。
观察不同变换参数对图形的影响。
3、三维图形的生成构建简单的三维模型,如立方体、球体等。
应用光照和材质效果,使三维图形更加逼真。
四、实验步骤1、二维图形的绘制首先,在编程环境中导入所需的图形库和相关模块。
然后,定义绘图窗口的大小和坐标范围。
接下来,使用绘图函数按照指定的坐标和参数绘制直线、矩形和圆形。
最后,设置图形的颜色和填充属性,使图形更加美观。
2、图形的几何变换对于平移操作,通过修改图形顶点的坐标值来实现水平和垂直方向的移动。
对于旋转操作,根据旋转角度计算新的顶点坐标,实现图形的绕中心点旋转。
对于缩放操作,将图形的顶点坐标乘以缩放因子,达到放大或缩小图形的效果。
3、三维图形的生成首先,定义三维模型的顶点坐标和三角形面的连接关系。
然后,设置光照的位置、颜色和强度等参数。
接着,为模型添加材质属性,如颜色、反射率等。
最后,使用渲染函数将三维模型显示在屏幕上。
五、实验结果与分析1、二维图形的绘制成功绘制出了各种简单的二维图形,并且通过颜色和填充的设置,使图形具有了更好的视觉效果。
例如,绘制的矩形和圆形边缘清晰,颜色鲜艳,填充均匀。
2、图形的几何变换平移、旋转和缩放操作都能够准确地实现,并且变换效果符合预期。
在旋转操作中,发现旋转角度的正负会影响旋转的方向,而缩放因子的大小直接决定了图形的缩放程度。
3、三维图形的生成生成的三维模型具有一定的立体感和真实感。
图形学试验内容及报告模板
实验内容一:1.实现图形的生成算法,实现直线、圆、椭圆的生成算法,对各种算法进行效率及效果的分析和比较,学有余力的同学可在对现有算法理解的基础上,能自行设计二维图形的生成算法并编程实现。
2.实现填充算法,能搞实现矩形、多边形、圆、椭圆的填充。
3.实现裁剪算法,理解并实现直线和多边性裁剪,对各种直线裁剪算法进行效率及效果的分析和比较。
4.实现图形的坐标变换,实现二维图形的基本变换,包括平移、旋转、比例、对称变换。
5.实现简单的三次Bezier曲线。
实验指导:第一步:进一步了解《计算机图形学》课程的知识结构体系,绘制整个课程的知识结构逻辑示意图,类似于:(图一)第二步:根据所绘制的知识结构图,设计DOS菜单,要利用多级菜单实现各种功能。
比如,主界面是大项,诸如二维线画图元、二维填充图元、二维裁剪等,子菜单使这些大项中的一些功能或者小项。
#includegraphics.h……Void DDACircle()Void m_zhongzitianchong()…….main(){int r=100;int a=0;int b=1;int d=1;int s=1;int x1,y1,x2,y2,x3,y3,x,y,h;int color=1,color2=1;int gdriver,gmode;gdriver=DETECT;gmode=0;initgraph( &gdriver,&gmode," ");setcolor(1);while(b){ printf("what do you want to paint\n0...... for cirle\n1...... for a line\n2...... for rectangle\n3...... for trigon\nyou choose:");scanf("%d",&a);printf("%d",a);switch(a){case 0 :{ cleardevice();printf("\nplease input (r,x1,y1,color):");scanf("%d %d %d %d",&r,&x1,&y1,&color);DDACircle(r,x1,y1,color);while(d){printf("\n Do you want to change?\n1 for pingyi\n2 for fangda\n3 for tianchong\n1 ,2or3 you choose:");scanf("%d",&s);switch(s){case 1:printf("\n0 forshuzhi \n1 for shuiping\nyou choose:");scanf("%d",&h);m_cirlepinyi(&x1,&y1,h);DDACircle(r,x1,y1,color);break;case 2:m_cirlefangda(&r);DDACircle(r,x1,y1,color);break;case 3:printf(" please input your like color:");scanf("%d",&color2);m_zhongzitianchong(x1,y1,1,color2,color);}printf("\nDo you want to continue....\nif you want to please choose 1 else 0\n1 or 0 you choose:");scanf("%d",&d);}printf("\nDo you want to continue....\nif you want to please choose 1 else 0\n1 or 0 you choose:");scanf("%d",&b);break;}case 1 :{cleardevice();printf("\nplease input (x1,y1,x2,y2,color):");scanf("%d %d %d %d %d",&x1,&y1,&x2,&y2,&color);dda_line(x1, y1, x2, y2,color);while(d){printf("\n Do you want to change?\n1 for pingyi\n2 for fangda\n3 for tianchong\n1 or 2 you choose:");scanf("%d",&s);switch(s){case 1:printf("\n0 for shuzhi \n1 for shuiping\nyou choose:");scanf("%d",&h);m_pingyi(&x1,&y1,&x2,&y2,h);dda_line(x1, y1, x2, y2,color);break;case 2:m_fangda(&x1,&y1,&x2,&y2);dda_line(x1, y1, x2, y2,color);}printf("\nDo you want to continue....\nif you want to please choose 1 else 0\n1 or 0 you choose:");scanf("%d",&d);}printf("\nDo you want to continue....\nif you want to please choose 1 else 0\n1 or 0 you choose:");scanf("%d",&b);break;}case 2:cleardevice();printf("\nplease input (x1,y1,x2,y2,color):");scanf("%d %d %d %d %d",&x1,&y1,&x2,&y2,&color);m_rectangle(x1,y1,x2,y2,color);while(d){printf("\n Do you want to change?\n1 for pingyi\n2 for fangda\n3 for tianchong\n1,2or3 you choose:");scanf("%d",&s);switch(s){case 1:printf("\n0 for shuzhi \n1 for shuiping\nyou choose:");scanf("%d",&h);m_pingyi(&x1,&y1,&x2,&y2,h);m_rectangle(x1, y1, x2, y2,color);break;case 2:m_fangda(&x1,&y1,&x2,&y2);m_rectangle(x1, y1, x2, y2,color);break;case 3:printf(" please input your like color:");scanf("%d",&color2);x=(x1+x2)/2;y=(y1+y2)/2;m_zhongzitianchong(x,y,1,color2,color);}printf("\nDo you want to continue....\nif you want to please choose 1 else 0\n1 or 0 you choose:");scanf("%d",&d);}printf("\nDo you want to continue....\nif you want to please choose 1 else 0\n1 or 0 you choose:");scanf("%d",&b);break;case 3:cleardevice();printf("\nplease input (x1,y1,x2,y2,x3,y3,color):");scanf("%d %d %d %d %d %d %d",&x1,&y1,&x2,&y2,&x3,&y3,&color);m_trigon(x1,y1,x2,y2,x3,y3,color);printf("\n Do you want to pinyi?if you want to please choose 1 else 0\n1 or 0 you choose:");while(d){printf("\n Do you want to change?\n1 for pingyi\n2 for fangda\n3 for tianchong\n1,3 or 2 you choose:");scanf("%d",&s);switch(s){case 1:printf("\n0 for shuzhi \n1 for shuiping\nyou choose:");scanf("%d",&h);m_trigonpinyi(&x1,&y1,&x2,&y2,&x3,&y3,s);m_trigon(x1,y1,x2,y2,x3,y3,color);break;case 2:m_trigonfangda(&x1,&y1,&x2,&y2,&x3,&y3);m_trigon(x1,y1,x2,y2,x3,y3,color);case 3:printf(" please input your like color:");scanf("%d",&color2);x=(x1+x2+x3)/3;y=(y1+y2+y3)/3;m_zhongzitianchong(x,y,1,color2,color);}printf("\nDo you want to continue....\nif you want to please choose 1 else 0\n1 or 0 you choose:");scanf("%d",&d);}printf("\nDo you want to continue....\nif you want to please choose 1 else 0\n1 or 0you choose:");scanf("%d",&b);}}}实验内容二:自由选题做一个小程序或小游戏,开发工具不限,要求必须用到几何变换(平移、旋转、比例)所学内容。
计算机图形学第五次实验报告
《计算机图形学》实验报告实验十一真实感图形一、实验教学目标与基本要求初步实现真实感图形, 并实践图形的造型与变换等。
二、理论基础运用几何造型, 几何、投影及透视变换、真实感图形效果(消隐、纹理、光照等)有关知识实现。
1.用给定地形高程数据绘制出地形图;2.绘制一(套)房间,参数自定。
三. 算法设计与分析真实感图形绘制过程中, 由于投影变换失去了深度信息, 往往导致图形的二义性。
要消除这类二义性, 就必须在绘制时消除被遮挡的不可见的线或面, 习惯上称之为消除隐藏线和隐藏面, 或简称为消隐, 经过消隐得到的投影图称为物体的真实图形。
消隐处理是计算机绘图中一个引人注目的问题, 目前已提出多种算法, 基本上可以分为两大类:即物体空间方法和图象空间方法。
物体空间方法是通过比较物体和物体的相对关系来决定可见与不可见的;而图象空间方法则是根据在图象象素点上各投影点之间的关系来确定可见与否的。
用这两类方法就可以消除凸型模型、凹形模型和多个模型同时存在时的隐藏面。
1).消隐算法的实现1.物体空间的消隐算法物体空间法是在三维坐标系中, 通过分析物体模型间的几何关系, 如物体的几何位置、与观察点的相对位置等, 来进行隐藏面判断的消隐算法。
世界坐标系是描述物体的原始坐标系, 物体的世界坐标描述了物体的基本形状。
为了更好地观察和描述物体, 经常需要对其世界坐标进行平移和旋转, 而得到物体的观察坐标。
物体的观察坐标能得到描述物体的更好视角, 所以物体空间法通常都是在观察坐标系中进行的。
观察坐标系的原点一般即是观察点。
物体空间法消隐包括两个基本步骤, 即三维坐标变换和选取适当的隐藏面判断算法。
选择合适的观察坐标系不但可以更好地描述物体, 而且可以大大简化和降低消隐算法的运算。
因此, 利用物体空间法进行消隐的第一步往往是将物体所处的坐标系转换为适当的观察坐标系。
这需要对物体进行三维旋转和平移变换。
常用的物体空间消隐算法包括平面公式法、径向预排序法、径向排序法、隔离平面法、深度排序法、光线投射法和区域子分法。
计算机图形学实验报告
计算机图形学实验报告
实验目的:通过本次实验,深入了解并掌握计算机图形学的基本原理和相关技术,培养对图形处理的理解和能力。
实验内容:
1. 图像的基本属性
- 图像的本质及表示方法
- 像素和分辨率的概念
- 灰度图像和彩色图像的区别
2. 图像的处理技术
- 图像的采集和处理
- 图像的变换和增强
- 图像的压缩和存储
3. 计算机图形学的应用
- 图像处理在生活中的应用
- 计算机辅助设计中的图形学应用
- 三维建模和渲染技术
实验步骤和结果:
1. 在计算机图形学实验平台上加载一张测试图像,分析其像素构成
和基本属性。
2. 运用图像处理技术,对测试图像进行模糊、锐化、色彩调整等操作,观察处理后的效果并记录。
3. 学习并掌握计算机图形学中常用的处理算法,如卷积、滤波等,
尝试应用到测试图像上并进行实验验证。
4. 探讨计算机图形学在数字媒体制作、虚拟现实、计算机辅助设计
等领域的应用案例,并总结其在实践中的重要性和价值。
结论:
通过本次实验,我对计算机图形学有了更深入的了解,掌握了图像
处理技术的基本原理和应用方法。
计算机图形学作为一门重要的学科,对多个领域有着广泛的应用前景,有助于提高数字媒体技术、虚拟现
实技术等领域的发展水平。
希望在未来的学习和工作中能进一步深化
对计算机图形学理论和实践的研究,不断提升自己在这一领域的专业
能力和创新意识。
图形学实验报告
图形学实验报告图形学实验报告概述:在本次图形学实验中,我们将探索和学习计算机图形学的基本概念和技术。
通过实验,我们深入了解了图形学的原理和应用,以及如何使用计算机生成和处理图像。
实验一:像素和颜色在这个实验中,我们学习了图像是由像素组成的,每个像素都有自己的颜色值。
我们使用了Python编程语言和PIL库来创建一个简单的图像,并设置了不同的像素颜色。
通过改变像素的颜色值,我们可以创建出各种各样的图像效果。
实验二:坐标系统和变换在这个实验中,我们学习了坐标系统和图形变换。
我们使用OpenGL库来创建一个简单的二维图形,并通过平移、旋转和缩放等变换操作来改变图形的位置和形状。
这些变换操作使我们能够在屏幕上创建出各种不同的图案和效果。
实验三:线段和多边形在这个实验中,我们学习了如何使用线段和多边形来绘制图形。
我们使用了Bresenham算法来绘制直线,并学习了如何使用多边形填充算法来填充图形。
通过这些技术,我们可以创建出更加复杂和精细的图像。
实验四:光照和阴影在这个实验中,我们学习了光照和阴影的原理和应用。
我们使用了光照模型来模拟光线的传播和反射,以及计算物体的明暗效果。
通过调整光照参数和材质属性,我们可以创建出逼真的光照和阴影效果。
实验五:纹理映射和渲染在这个实验中,我们学习了纹理映射和渲染的概念和技术。
我们使用了纹理映射来将图像贴到三维物体表面,以增加物体的细节和真实感。
通过渲染技术,我们可以模拟光线的折射和反射,以及创建出逼真的材质效果。
实验六:三维建模和动画在这个实验中,我们学习了三维建模和动画的基本原理和方法。
我们使用了三维建模工具来创建三维模型,并学习了如何使用关键帧动画来实现物体的运动和变形。
通过这些技术,我们可以创建出逼真的三维场景和动画效果。
总结:通过这次图形学实验,我们深入了解了计算机图形学的原理和应用。
我们学习了像素和颜色、坐标系统和变换、线段和多边形、光照和阴影、纹理映射和渲染,以及三维建模和动画等技术。
图形学实验报告2
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CTransformView drawing
三、实验要求:
实验前须规划程序界面和按钮的相关事件的编写代码。实验时进行代码的调试。
四、实验代码
1,图形的变换
// TransformView.cpp : implementation of the CTransformView class
//
#include "stdafx.h"
#include "Transform.h"
#include "TransformDoc.h"
#include "TransformView.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
for(i=1; i<3; i++)
{
Pt[i].x *= 0.5;
Pt[i].y *= 0.5;
}
Pt[0] = TmpPt;
Pt[1] = Pt[1] + Pt[0];
Pt[2] = Pt[2] + Pt[0];
break;
case 0X58://X的ASCII码
《计算机图形学》实验报告
《计算机图形学》实验报告一、实验目的计算机图形学是一门研究如何利用计算机生成、处理和显示图形的学科。
通过本次实验,旨在深入理解计算机图形学的基本原理和算法,掌握图形的生成、变换、渲染等技术,并能够运用所学知识解决实际问题,提高对图形学的应用能力和编程实践能力。
二、实验环境本次实验使用的编程语言为 Python,使用的图形库为 Pygame。
开发环境为 PyCharm。
三、实验内容1、直线的生成算法DDA 算法(Digital Differential Analyzer)Bresenham 算法DDA 算法是通过计算直线的斜率来确定每个像素点的位置。
它的基本思想是根据直线的斜率和起始点的坐标,逐步计算出直线上的每个像素点的坐标。
Bresenham 算法则是一种基于误差的直线生成算法。
它通过比较误差值来决定下一个像素点的位置,从而减少了计算量,提高了效率。
在实验中,我们分别实现了这两种算法,并比较了它们的性能和效果。
2、圆的生成算法中点画圆算法中点画圆算法的核心思想是通过判断中点的位置来确定圆上的像素点。
通过不断迭代计算中点的位置,逐步生成整个圆。
在实现过程中,需要注意边界条件的处理和误差的计算。
3、图形的变换平移变换旋转变换缩放变换平移变换是将图形在平面上沿着指定的方向移动一定的距离。
旋转变换是围绕一个中心点将图形旋转一定的角度。
缩放变换则是改变图形的大小。
通过矩阵运算来实现这些变换,可以方便地对图形进行各种操作。
4、图形的填充种子填充算法扫描线填充算法种子填充算法是从指定的种子点开始,将相邻的具有相同颜色或属性的像素点填充为指定的颜色。
扫描线填充算法则是通过扫描图形的每一行,确定需要填充的区间,然后进行填充。
在实验中,我们对不同形状的图形进行了填充,并比较了两种算法的适用情况。
四、实验步骤1、直线生成算法的实现定义直线的起点和终点坐标。
根据所选的算法(DDA 或Bresenham)计算直线上的像素点坐标。
图形学 实验报告
图形学实验报告一、实验介绍图形学是计算机科学中的一个重要领域,主要研究计算机图形的生成、显示和处理。
本次实验旨在通过学习图形学的基本概念和算法,深入理解计算机图形的原理与应用。
二、实验内容本次实验主要包含以下内容:1. 图形学的基本概念和历史发展2. 图形学中常用的几何变换和投影算法3. 光栅化算法及其在图形渲染中的应用4. 着色和光照模型的原理及实现方法5. 三维场景建模与渲染技术三、实验步骤和结果1. 图形学的基本概念和历史发展首先我们了解了图形学的基本概念和历史发展。
图形学起源于20世纪60年代,当时主要用于计算机辅助设计(CAD)和计算机辅助制造(CAM)领域。
随着计算机技术的不断发展,图形学逐渐应用于计算机图形的显示和处理领域。
2. 几何变换和投影算法接下来我们学习了图形学中常用的几何变换和投影算法。
几何变换包括平移、旋转和缩放等操作,通过改变图形的位置、角度和尺寸,实现对图形的变换和组合。
投影算法主要用于将三维空间中的图形投影到二维屏幕上,实现透视效果。
3. 光栅化算法及其应用在图形渲染中,光栅化算法是非常常用的技术。
光栅化算法将连续的几何图形转化为离散的像素,实现图形在屏幕上的显示。
常见的光栅化算法包括扫描线算法和边界填充算法。
4. 着色和光照模型的原理与实现为了实现真实感的图形渲染,着色和光照模型是不可或缺的。
着色模型描述了在光照条件下物体表面的颜色,常见的着色模型包括平面着色模型和高洛德着色模型。
光照模型则描述了光线在物体表面的反射和折射过程,常见的光照模型包括冯氏光照模型和布林-菲菲尔德模型。
5. 三维场景建模与渲染技术最后我们学习了三维场景建模与渲染技术。
三维场景建模主要包括建立三维模型和场景的几何结构信息。
三维渲染技术则是将建模得到的三维场景转换为可显示的二维图像。
四、实验总结通过本次实验的学习,我们深入了解了图形学的基本概念和算法。
图形学在计算机图形的生成、显示和处理中具有重要应用,对于计算机科学专业学生来说,学习图形学是必不可少的。
图形学实验报告
院系:数学与统计学学院专业:信息与计算机科学年级: 2011 级课程名称:计算机图形学组号:(1)组组员:陈怡璠 (11151016)陆海燕(11151013)王内(11151007)指导教师:孙阳光2014年06月25日年级2011级学号11151016 11151013 11151007 专业信息与计算科学姓名陈怡璠陆海燕王内实验时间2014年5月28日实验地点9#206实验名称直线的扫描转换实验类型设计型综合型创新型√实验目的或要求1.实验目的1)理解在显示器上画图与在纸上画图的本质区别;2)掌握直线的光栅扫描转换过程;3)掌握不同算法绘制直线的思路和优缺点。
2. 实验要求1)能编写、调试通过相应直线扫描转换算法,用算法绘制直线。
2)将像素网格表现出来,建立网格坐标系;3)用橡皮筋的形式输入参数;4)鼠标移动时,显示鼠标当前位置;5)显示判别式的计算过程和下一点的选择策略;6)记录生成点的坐标,建议用表的形式;7)图形生成过程可以重复进行。
实验原理1.直线的中点算法算法的主要思想:讨论斜率k∈[1,+∞)上的直线段的中点算法。
对直线01p p,左下方的端点为p(x,y),右上方的端点为1p(1x,1y)。
直线段的方程为:y mx B=+⇔yy x B xy yx xBx∆=+⇔∆=∆+∆∆(,)0F x y xy yx xB⇔=∆-∆-∆=(1.2)现在假定已求得像素(,,i r ix y),则得:,,11(,]22i i r i rx x x∈-+由于直线的斜率k∈[1,+∞),故m=1/k∈(0,1],则:1,,13(,]22i i r i rx x x+∈-+在直线1iy y=+上,区间,,13(,]22i r i rx x-+内存在两个像素NE和E。
根据取整原则,当(1.4)(1.3)(1.1)实验原理11(,)i ix y++在中点M11(,)2i ix y++右方时,取像素NE,否则取像素E,即,11,,1()()01()()0i r ii ri r ix E F Mxxx NE F Mx+++⎧⇔≤=⎨+⇔>⎩ii点当(,y+1)在左方时点当(,y+1)在右方时若取2()id F M=,则上式变为,1,,()01(0i r ii ri r ix E dxx NE d+⎧≤=⎨+>⎩点当点)当计算id的递推公式如下:,11,12[(2)()]0122(,2)122[(2)(1)]2i i rii i iii i rx y y x xB dd F x ydx y y x xB++⎧∆+-∆+-∆⎪≤⎪=++=⎨>⎪∆+-∆++-∆⎪⎩=202()0i ii id x dd x y d+∆≤⎧⎨+∆-∆>⎩算法的初始条件为:⎪⎩⎪⎨⎧=∆-∆=++=),(),(2)1,21(2,0,0yxyxyxyxFdyr相应的程序示例:public function drawLine(pixelDrawer:Function,x:int,y:int,1x:int,1y:int):void{var dx:Number =1x -x;var dy:Number =1y -y;var x:Number;var y:Number;if ((dx == 0) && (dy == 0) ){pixelDrawer(x,y);return;}else if ( dx==0 )(1.6)(1.8)(1.7)(1.5)实验原理{var step:Number = dy / Math.abs(dy);for (y=0y; y!=1y; y+=step )pixelDrawer(x, y );}else if ( dy==0 ){step = dx / Math.abs(dx);for (x=x; x!=1x; x+=step )pixelDrawer( x,y );}Var stepX :Number = dx / Math.abs(dx);var stepY:Number = dy / Math.abs(dy);x =x, y =y;pixelDrawer( x, y );var k:Number = dy / dx;if ( Math.abs(k)<1.0 ){var a:Number = -Math.abs(dy);var b:Number = Math.abs(dx);var d:Number = 2 * a + b;var d1:Number = 2 * a;var d2:Number = 2 * (a + b);while ( x!=1x ){if ( d<0 ) { x += stepX; y += stepY; d += d2; }else { x += stepX; d += d1; }pixelDrawer( x, y );}}else{a = -Math.abs(dx);b = Math.abs(dy);d = 2 * a + b, d1 = 2 * a, d2 = 2 * (a + b);while ( y!=1y )实验原理{if ( d<0 ) { x += stepX; y += stepY; d += d2; }else { y += stepY; d += d1; }pixelDrawer( x, y );}}pixelDrawer(1x,1y );}2.直线的数值微分法算法的主要思想已知待扫描转换的直线为p(x,y),1p(1x,1y),又△1xxx-=,△1yyy-=,则设k=1/m=/x y∆∆(即k∈(0,1])。
