ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:172.75KB ,
资源ID:3427353      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3427353.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(《计算机图形学》课内实验报告实验二.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

《计算机图形学》课内实验报告实验二.docx

1、计算机图形学课内实验报告实验二计算机图形学课内实验报告学生姓名:及 学 号:学 院:理学院班 级:课程名称:计算机图形学实验题目:基本图形的生成算法指导教师姓名及职称:讲 师讲 师 2014年4月1日目 录一、实验题目 1二、实验目的 1三、实验内容 1四、实验结果 2五、实验体会或遇到问题 23一、实验题目基本图形的生成算法二、实验目的1. 通过实验,进一步理解直线段扫描转换的DDA算法、中点bresenham算法及bresenham算法的基本原理;2. 掌握以上算法生成直线段的基本过程;3. 通过编程,会在C/C+环境下完成用DDA算法、中点bresenham算法及bresenham算法对

2、任意直线段的扫描转换。三、实验内容1. 点的显示与属性 对VC中画点的函数PutPixel与获取点函数GetPixel分别用于在指定位置画指定大小颜色的点或获取指定位置的点的颜色,而在OpenGL中可以用属性选择来控制画点还是画线或多边形等。在VC中PutPixel的前两个参数为点的坐标位置,后面的参数为颜色属性来实现画点,在OpenGL中位于glbegin和glend之间的是数据点,通过选取glbegin的属性为GL_POINTS则数据点显示为点。 2常用画线算法与实现1)DDA算法,按四舍五入法取点的简单算法,编程容易,但计算量大。2)中点算法,是通过递推确定取点的方法,由于计算加与减,没

3、有乘法运算所以计算量少,是常用的算法,此算法是判断实际点位于相邻两个像素点的中点的上方,如果是则取上边的像点,否则取下边的像素点(当斜率绝对值大于1时按左右取)。3)实现,可VC中实现以上算法,OpenGL中已有相应函数画线。3面的生成与填充1)用VC实现区域填充中的扫描转换,用图像填充区域以及字符输出等,可用扫描线算法等实现,用OpenGL则可用填充函数及材质设置函数实现优质显示。2)由面生成空间图形可以用VC的图形变换实现不同角度效果,并用裁剪算法及隐藏面消除算法实现真实感效果,但OpenGL实现则要简单些。四、实验结果1. DDA算法画线图1 DDA算法画线源程序:#include #i

4、nclude #include #define ROUND(a) (int)(a+0.5)#define OX 320#define OY 240void lineDDA (int xa, int ya, int xb, int yb, int color);void setpixel (int x, int y, int color);main() int gdrive=DETECT, gmode=0; initgraph(&gdrive, &gmode, d:tc); setbkcolor(BLACK); line (0, OY, 2*OX, OY); line (OX, 0, OX, 2

5、*OY); lineDDA (300, 300, 0, 0, WHITE); getch (); closegraph(); return 0;void lineDDA (int xa, int ya, int xb, int yb, int color) int dx = xb - xa; int dy = yb - ya; int steps, i; float xIncrement, yIncrement; float x=xa; float y=ya; if(abs(dx) abs(dy) steps = abs(dx); else steps = abs(dy); xIncremen

6、t = dx/(float)steps; yIncrement = dy/(float)steps; putpixel (ROUND(x), ROUND(y), color); for (i=0; isteps; i+) x += xIncrement; y += yIncrement; setpixel (ROUND(x), ROUND(y), color); return;void setpixel (int x, int y, int color) putpixel (OX+x, OY-y, color); return;2. 中点bresenham算法画线图2 中点算法输入图3 中点算

7、法画线源程序:#include#include#include /*生成直线段的中点算法*/void MidPointLine(int x1,int y1,int x2,int y2,int color) float x,y,dx,dy; float k,d; float IncrE,IncrNE; dx=x2-x1; dy=y2-y1; k=dy/dx; if(k=-1 & k=1) d=dx-2*dy; IncrE=-2*dy; IncrNE=2*(dx-dy); x=x1;y=y1; putpixel(x,y,color); while(x0) d+=IncrE; else d+=Inc

8、rNE; y+; x+; putpixel(int)x,(int)y,color); else d=dy-2*dx; IncrE=-2*dx; IncrNE=2*(dy-dx); x=x1;y=y1; putpixel(x,y,color); while(y0) d+=IncrE; else d+=IncrNE; x+; y+; putpixel(int)x,(int)y,color); /*主函数*/void main( ) int graphdriver=DETECT,graphmode; int x1,y1,x2,y2,color; printf(Please Input Two Pix

9、els (x1,y1),(x2,y2) : ); scanf(%d%d%d%d, &x1,&y1,&x2,&y2); printf(Input Color like RED or WHITE : ); scanf(%d,&color); initgraph(&graphdriver,&graphmode,tc); MidPointLine(x1,y1,x2,y2,color); outtextxy(x1,y1,Start Point); outtextxy(x2,y2,End Point); getch(); closegraph();3. bresenham算法画线图4 bresenham算

10、法画线源程序:#include #include #include void draw_pixel(int ix,int iy) glBegin(GL_POINTS); glVertex2i(ix,iy); glEnd();void Bresenham(int x1,int y1,int xEnd,int yEnd) int dx=abs(xEnd-x1),dy=abs(yEnd-y1); int p=2*dy-dx; int twoDy=2*dy,twoDyMinusDx=2*dy-2*dx; int x,y; if (x1xEnd) x=xEnd;y=yEnd; xEnd=x1; else

11、 x=x1; y=y1; draw_pixel(x,y); while(xxEnd) x+; if(p0) p+=twoDy; else y+; p+=twoDyMinusDx; draw_pixel(x,y); void display() glClear(GL_COLOR_BUFFER_BIT); Bresenham(0,0,400,400); glFlush();void myinit() glClearColor(0.8,1.0,1.0,1.0); glColor3f(0.0,0.0,1.0); glPointSize(1.0); glMatrixMode(GL_PROJECTION)

12、; glLoadIdentity(); gluOrtho2D(0.0,500.0,0.0,500.0); void main(int argc,char *argv ) glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(500,500); glutInitWindowPosition(200.0,200.0); glutCreateWindow(CG_test_Bresenham_Line example); glutDisplayFunc(display); myinit()

13、; glutMainLoop();4. 扫描线算法填充图5 扫描线算法填充源程序:#include #include #include #define NULL 0 /C+中没有NULL这个符号常量,这里用宏定义#define WINDOW_HEIGHT 400 /定义窗口高为400#define WINDOW_WIDTH 400 /定义窗口宽为400struct dcPt /dcPt实际上是一个点的结构体 int x; int y;void setPixel(GLint x,GLint y) /用OpenGL函数改写setPixel glBegin(GL_POINTS); glVertex2

14、i(x,y); glEnd();typedef struct tEdge int yUpper; float xIntersect, dxPerScan; struct tEdge * next; Edge;/* Inserts edge into list in order of increasing xIntersect field. */void insertEdge (Edge * list, Edge * edge) Edge * p, * q = list; p = q-next; while (p != NULL) if (edge-xIntersect xIntersect)

15、p = NULL; else q = p; p = p-next; edge-next = q-next; q-next = edge;/* For an index, return y-coordinate of next nonhorizontal line */int yNext (int k, int cnt, dcPt * pts) int j; if (k+1) (cnt-1) j = 0; else j = k + 1; while (ptsk.y = ptsj.y) if (j+1) (cnt-1) j = 0; else j+; return (ptsj.y);/* Stor

16、e lower-y coordinate and inverse slope for each edge. Adjust and store upper-y coordinate for edges that are the lower member of a monotically increasing or decreasing pair of edges */void makeEdgeRec(dcPt lower, dcPt upper, int yComp, Edge * edge, Edge * edges) edge-dxPerScan = (float) (upper.x - l

17、ower.x) / (upper.y - lower.y); edge-xIntersect = lower.x; if (upper.y yUpper = 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;

18、for (i=0; icnt; i+) v2 = ptsi; if (v1.y != v2.y) /* nonhorizontal line */ edge = (Edge *) malloc (sizeof (Edge); if (v1.y 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-xI

19、ntersect; ixIntersect; i+) setPixel (int) i, scan); p1 = p2-next; void deleteAfter (Edge * q) Edge * p = q-next; q-next = p-next; free (p);/* Delete completed edges. Update xIntersect field for others */void updateActiveList (int scan, Edge * active) Edge * q = active, * p = active-next; while (p) i

20、f (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 *ed

21、gesWINDOW_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); Sleep(20); /为了放慢填充速度,便于观看填充过程,每填充

22、一行停顿10毫秒,Sleep函数包含在头文件windows.h里面 /* Free edge records that have been malloced . */void init (void) glClearColor (1.0, 1.0, 1.0, 0.0); glMatrixMode (GL_PROJECTION); gluOrtho2D (0.0, WINDOW_WIDTH, 0.0, WINDOW_HEIGHT);void myDraw (void) dcPt pts = /pts是表示填充图元的顶点数组,这里定义了一个六边形 50, 50, 300, 20, 300, 300,

23、 200,100, 150,350, 20,120 ; glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 0.0, 0.0); scanFill (6, pts); / 第一个参数为填充图元的顶点数,第二个参数为顶点坐标数组 glFlush ( ); void main (int argc, char* argv) glutInit (&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition (50, 100); glutInitWindowS

24、ize (WINDOW_WIDTH, WINDOW_HEIGHT); glutCreateWindow (通用扫描线填充); init ( ); glutDisplayFunc (myDraw); glutMainLoop ( ); 5. 隐藏面消除算法图6 隐藏面消除算法输入图7 隐藏面消除算法绘图源程序:#include #include #include #include #include #define SCAN_NUM 500typedef struct Edge /边Y桶中的边结构 int yUpper; /边的最大y值 float xInt,dx; /边的最低点的x值,之所以是最

25、低点,是因为本程序是从下往上扫描的 int E_mark; float z,dzx,dzy; struct Edge *next; /指向下一条边节点的指针Edge;typedef struct point /定义一个点的结构体 int x; int y; float z;point;extern point *points=NULL; /存放多个多边形的顶点信息extern float *as=NULL; /存放多边形所在平面的方程的四个系数extern int *counts=NULL; /存放各个多边形的顶点个数extern int num=0; /记录多边形个数void DrawPoint(int x, int y)/画点函数 :glBegin(GL_POINTS); :glVertex2d(x, y); :glEnd();int nexty(int k,int count,point *pts)/当前测试点的下一个点的纵坐标,其方向为顺时针 int j; if(k+1)(count-1) j=0; else j=k+1; while(ptsk.y=ptsj.y) if(j+1)(count-1) j=0; else j+; return ptsj.y;void insertE

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1