计算机图形学基础教程实验报告

上传人:su****e 文档编号:202412250 上传时间:2023-04-22 格式:DOC 页数:17 大小:207KB
收藏 版权申诉 举报 下载
计算机图形学基础教程实验报告_第1页
第1页 / 共17页
计算机图形学基础教程实验报告_第2页
第2页 / 共17页
计算机图形学基础教程实验报告_第3页
第3页 / 共17页
资源描述:

《计算机图形学基础教程实验报告》由会员分享,可在线阅读,更多相关《计算机图形学基础教程实验报告(17页珍藏版)》请在装配图网上搜索。

1、湖北民族学院信息工程学院实验报告(数字媒体技术专业用)班级:0312413 姓名:谌敦斌 学号:031241318 实验成绩: 实验时间:2013年10 月14 日9、10 节 实验地点:数媒实验室 课程名称:计算机图形学基础教程 实验类型:设计型 实验题目:直线与圆的绘制 一、实验目的通过本次实验,熟练掌握DDA、中点、Bresenham直线绘制方法和中点、Bresenham圆的画法,能够在vc环境下独立完成实验内容,逐渐熟悉opengl的语法特点,提高程序基本绘图的能力。二、实验环境(软件、硬件及条件)Microsoft vc+6.0 多媒体计算机三、实验内容1.从DDA、中点、Brese

2、nham画线法中任选一种,完成直线的绘制。2.从中点、Bresenham画圆法中任选一种,完成圆的绘制。四、实验方法与步骤打开vc+6.0,新建一个工程,再在工程里面建一个.cpp文件,编辑程序,编译连接后执行即可。程序如下bresenham画线法:#include#includeint bresenham(int x0,int y0,int x1,int y1,int color)int x,y,dx,dy,e,i;dx=x1-x0;dy=y1-y0;e=-dx;y=y0;for(x=x0;x=0) y+;e-=2*dx;return 0;int main()initgraph(640,48

3、0);bresenham(0,0,500,200,255);while(!kbhit()closegraph();return 0;Bresenham画圆法:#include#includeint circlepoints(int x,int y,int color)putpixel(255+x,255+y,color);putpixel(255+y,255+x,color);putpixel(255-x,255+y,color);putpixel(255+y,255-x,color); putpixel(255-x,255-y,color);putpixel(255-y,255-x,colo

4、r);putpixel(255+x,255-y,color);putpixel(255-y,255+x,color);return 0;int bresenhamcircle(int r,int color) int x,y,d; x=0; y=r; d=3-2*r; while(x=y) circlepoints(x,y,color); if(d0) d+=4*x+6; else d=d+4*(x-y)+10; y-; x+; return 0;int main()initgraph(640,480);bresenhamcircle(100,255);while(!kbhit()closeg

5、raph();return 0;五、实验结果记录与分析实验结果如下:六、 疑难问题报告湖北民族学院信息工程学院实验报告(数字媒体技术专业用)班级:0312413 姓名:谌敦斌 学号:031241318 实验成绩: 实验时间:2013年10 月29 日9、10 节 实验地点:数媒实验室 课程名称:计算机图形学基础教程 实验类型:设计型 实验题目:多边形的填充算法和曲线的绘制 一、 实验目的通过本次实验,熟练掌握种子填充算法和多边形扫描线填充算法以及bezier曲线或者B样条曲线的基本绘制算法,能够独立在vc环境下实现任意多边形的填充和一般曲线的绘制,进一步熟悉opengl的语法结构和强大的绘图功

6、能,增强多媒体底层程序绘图能力。二、实验环境(软件、硬件及条件)Microsoft vc+6.0 多媒体计算机三、实验内容1.选择种子填充算法或者多边形的扫描线算法完成多边形的填充。2.选择bezier曲线或者B样条曲线算法完成曲线的绘制。四、实验方法与步骤打开vc+6.0,新建一个工程,再在工程里面建一个.cpp文件,编辑程序,编译连接后执行即可。程序如下:多边形扫描线填充算法:/sweep.h#ifndef SWEEP_H#define SWEEP_Hstruct Edge int nxty; int curx;int dx, dy; Edge *nxt;void sweep(int p2

7、, int n, void (*setPixel)(int, int);#endif/sweepline.cpp#include #include #include #include sweep.hvoid myInit();void setPixel(int x, int y);void myDisplay();int main(int argc, char *argv) glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(640, 480); glutInitWindowP

8、osition (100, 150); glutCreateWindow(SweepLine); glutDisplayFunc(&myDisplay); myInit(); glutMainLoop(); return 0;void setPixel(int x, int y) glBegin(GL_POINTS); glVertex2i(x, y); glEnd();void myInit() glClearColor(1.0, 1.0, 1.0, 0.0); glColor3f(0.0, 0.0, 0.0); glMatrixMode(GL_PROJECTION); glLoadIden

9、tity(); gluOrtho2D(0.0, 640.0, 0.0, 480.0);void myDisplay() int i, j; glClear(GL_COLOR_BUFFER_BIT); int p52; p00 = 100; p01 = 300; p10 = 200; p11 = 50; p20 = 300; p21 = 100; p30 = 400; p31 = 0; p40 = 350; p41 = 470; sweep(p, 5, setPixel); glFlush(); /sweep.cpp#include sweep.h#include using namespace

10、 std;const int MAXN = 1024;int cpMAXN2, n;inline bool cmp(int i, int j) return cpi1 cpj1 | (cpi1 = cpj1 & cpi0 y2) swap(y1, y2); if (y1 y & y dy cpind1 | (h-dy = cpind1 & h-dx cpind0) break; ph = h; h = h-nxt; data = new Edge; data-curx = px; data-nxty = cpind1; data-dx = cpind0 - px; data-dy = cpin

11、d1 - ly; data-nxt = NULL; if (flag) data-nxty-; if (ph) data-nxt = ph-nxt; ph-nxt = data; else data-nxt = ely; ely = data; int exMAXNMAXN, neMAXN;inline int abs(int a) return a 0 ? a : -a;void makepoint(int line, Edge *h) int dx = h-dx, dy = h-dy, cnt=0; int x, y, flag=1; if (h-dx)*(h-dy)curx; ynxty

12、; y+) exyney+ = x; cnt += 2*abs(dx); while (cnt=2*abs(dy) cnt -= 2*abs(dy); if (flag) x+; else x-; void sweep(int p2, int nn, void (*setPixel)(int, int) /对所有点按y坐标递增排序,y坐标相等的按x坐标递增排序 n = nn; int i, j, k, ind, nxt, pre; int *num = new intn; /点索引; for (i=0; in; i+) numi = i; memcpy(cp, p, sizeof(cp); s

13、ort(num, num+n, cmp); /建立有序边表 memset(e, 0, sizeof(e); for (i=0; i pind1) insert(pind1, pind0, nxt); if (ppre1 pind1) insert(pind1, pind0, pre); /处理active edge list memset(ne, 0, sizeof(ne); for (i=0; inxt; sort(exi, exi+nei); for (j=0; jnei; j+=2) for (k=exij; k=exij+1; k+) setPixel(k,i); Bezier曲线绘制

14、:#include#includeGLfloat ctrlpoints43=-4.0,-4.0,0.0,-2.0,4.0,0.0,2.0,-4.0,0.0,4.0,4.0,0.0;void init(void)glClearColor(1.0,0.0,0.0,0.0);glShadeModel(GL_FLAT);glMap1f(GL_MAP1_VERTEX_3,0.0,1.0,3,4,&ctrlpoints00);glEnable(GL_MAP1_VERTEX_3);void display(void)int i;glClear(GL_COLOR_BUFFER_BIT);glColor3f(1

15、.0,1.0,0.0);glBegin(GL_LINE_STRIP);for(i=0;i=30;i+)glEvalCoord1f(GLfloat)i/30.0);glEnd();glPointSize(5.0);glBegin(GL_POINTS);for(i=0;i4;i+)glVertex3fv(&ctrlpointsi0);glEnd();glFlush();void reshape(int w,int h)glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w=h)g

16、lOrtho(-5.0,5.0,-5.0*(GLfloat)h/(GLfloat)w,5.0*(GLfloat)h/(GLfloat)w,-5.0,5.0);elseglOrtho(-5.0*(GLfloat)w/(GLfloat)h,5.0*(GLfloat)w/(GLfloat)h,-5.0,5.0,-5.0,5.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();void keyboard(unsigned char key,int x,int y)switch(key)case 27:exit(0);break;int main(int arg

17、c,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(100,100);glutInitWindowSize(400,400);glutCreateWindow(argv0);init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutMainLoop();return 0;五、 实验结果记录与分析六、 疑难问题报告湖北民族学院信息工程学院

18、实验报告(数字媒体技术专业用)班级:0312413 姓名:谌敦斌 学号:031241318 实验成绩: 实验时间:2013年11 月26 日9、10 节 实验地点:数媒实验室 课程名称:计算机图形学基础教程 实验类型:设计型 实验题目:简易交互式绘图系统的制作 一、 实验目的运用前面所学的绘图知识,利用opengl基于MFC或者直接在MFC上调用函数构建一个简单的绘图系统,完成直线、圆、多边形、椭圆、bezier曲线等的绘制以及三维图形的简单运动与变幻以提高综合绘图能力和程序框架建构能力。二、实验环境(软件、硬件及条件)Microsoft vc+6.0 多媒体计算机三、实验内容在vc环境中,利

19、用opengl基于MFC或者直接在MFC上调用函数构建一个简单的绘图系统,完成直线、圆、多边形、椭圆、bezier曲线等的绘制以及三维图形的简单运动与变幻。自定义菜单栏和工具栏,颜色可选,设计一个漂亮美观的绘图界面,并运行程序实现画图功能。四、实验方法与步骤1.新建一个工程,选择MFC AppWizardexe,并命名,确定后应用程序类型选择单文档,然后都点击下一步(默认的设置),完成后点击确定,一个基本的mfc程序框架就建立成功了。2.在工作空间ResourceView中双击Menu,打开IDR_MAINFRAME,自定义或修改菜单选项,并给自定义的菜单选项取一个名字。比如建立“绘图”菜单,

20、在绘图菜单里面再建立“直线”、“多边形”“圆”等多个小菜单,如果菜单里面还要包含子菜单,就要将该菜单属性设置为“弹出”,最终子菜单不需要设置为“弹出”,但需要命一个名以便在程序中引用。例如“直线”在“绘图”菜单里属于最终子菜单,可以命名为“ID_LINE”,相应的矩形命名为“ID_RECT”,圆命名为“ID_CIRCLE”等等。3.自定义工具栏。建立工具栏与自定义建立菜单类似,首先在工作空间ResourceView中双击Toolbar,可以直接在IDR_MAINFRAME上修改和增删工具,也可以新插入IDR_ToolBar。在工具栏中,自己选择图案颜色绘制画图工具图标,并命以名字,以便在程序中

21、引用,命名方式与自定义菜单栏完全相同。并且工具栏和菜单栏的绘图功能可以相同。4.将菜单栏、工具栏按钮与程序代码联系起来。运用mfc最大的好处就是它能够简化应用程序,而这正是mfc强大的向导功能所作用的。返回工作空间里的FileView,按快捷方式“ctrl+w”打开mfc向导,选中Message Maps,选择view视图类,在Object IDs里面选择上两步建立的菜单栏和工具栏按钮的名字,在Message里面选择Command命令消息,点击AddFunction,则将相应的消息函数添加到视图类里面去了。我们可以在view.h和view.cpp中找到相应函数的踪影。比如,直线ID_LINE的

22、消息函数就为OnLine(),矩形ID_RECT的消息函数就为OnRect()等等。5.根据绘图功能,编写消息函数代码。在FileView中打开Source File选中里边的视图类实现文件view.cpp,找到需要编写的消息函数。例如,写画直线的消息函数就可以找到OnLine函数,修改其函数内容为:void CMy2bView:OnLine() Invalidate();UpdateWindow();CClientDC dc(this);CPen pen; pen.CreatePen(PS_SOLID,w,m_nColor); dc.SelectObject(&pen); dc.MoveTo

23、(500+rand()%20,100+rand()%20);dc.LineTo(600+rand()%20,300+rand()%20);/ TODO: Add your command handler code here画矩形就找到OnRect函数,修改其函数内容为:void CMy2bView:OnRect() Invalidate();UpdateWindow();CClientDC dc(this); CPen pen; CBrush brush; pen.CreatePen(PS_SOLID,w,m_nColor); brush.CreateSolidBrush(m_fColor);

24、 dc.SelectObject(&pen); dc.SelectObject(&brush); dc.Rectangle(500+rand()%20,300+rand()%20,700+rand()%20,400+rand()%20);/ TODO: Add your command handler code here画bezier曲线就找到OnBezier函数,修改其函数内容为:void CMy2bView:OnBezier() Invalidate(); UpdateWindow(); CClientDC dc(this); POINT points7; points0.x=300+ra

25、nd()%50;points0.y=100+rand()%50; points1.x=400+rand()%50;points1.y=200+rand()%50; points2.x=500+rand()%50;points2.y=200+rand()%50; points3.x=600+rand()%50;points3.y=300+rand()%50; points4.x=700+rand()%50;points4.y=400+rand()%50; points5.x=500+rand()%50;points5.y=400+rand()%50; points6.x=400+rand()%5

26、0;points6.y=400+rand()%50; CPen pen; CBrush brush; pen.CreatePen(PS_SOLID,w,m_nColor); brush.CreateSolidBrush(m_fColor); dc.SelectObject(&pen); dc.SelectObject(&brush); dc. PolyBezier(points,7);/ TODO: Add your command handler code here画一个椭圆的消息函数为:void CMy2bView:OnEllipse() Invalidate();UpdateWindow

27、();CClientDC dc(this); CPen pen; CBrush brush; pen.CreatePen(PS_SOLID,w,m_nColor); brush.CreateSolidBrush(m_fColor); dc.SelectObject(&pen); dc.SelectObject(&brush); dc.Ellipse(500+rand()%20,100+rand()%20,600+rand()%20,300+rand()%20);/ TODO: Add your command handler code here画一个多边形比如说十二边形:void CMy2bV

28、iew:OnN10() Invalidate(); UpdateWindow(); CClientDC dc(this); CPen pen; CBrush brush; pen.CreatePen(PS_SOLID,w,m_nColor); brush.CreateSolidBrush(m_fColor); dc.SelectObject(&pen); dc.SelectObject(&brush); POINT points12; points0.x=500+rand()%50;points0.y=100+rand()%50; points1.x=600+rand()%50;points1

29、.y=100+rand()%50; points2.x=700+rand()%50;points2.y=200+rand()%50; points3.x=650+rand()%50;points3.y=300+rand()%50; points4.x=700+rand()%50;points4.y=400+rand()%50; points5.x=650+rand()%50;points5.y=500+rand()%50; points6.x=500+rand()%50;points6.y=500+rand()%50; points7.x=400+rand()%50;points7.y=400

30、+rand()%50; points8.x=300+rand()%50;points8.y=300+rand()%50; points9.x=200+rand()%50;points9.y=250+rand()%50; points10.x=150+rand()%50;points10.y=200+rand()%50; points11.x=100+rand()%50;points11.y=100+rand()%50; dc.Polygon(points, 12);/ TODO: Add your command handler code here其他图形的代码可以类似添加,这里就不再细说。线

31、条或图形的边界颜色设置函数代码为:void CMy2bView:OnColor() CColorDialog Color; if(Color.DoModal() = IDOK)m_nColor=Color.GetColor();/ TODO: Add your command handler code here图形的填充函数代码为:void CMy2bView:OnFillcolor() CColorDialog FillColor; if(FillColor.DoModal() = IDOK)m_fColor=FillColor.GetColor();/ TODO: Add your command handler code here其他的如背景颜色设置函数可以类似,这里也不再细说6.编译连接运行程序,进行画图操作,并保存MFC工程文件。五、实验结果记录与分析绘图系统界面如图:六、疑难问题报告

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

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

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


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