计算机图形学实验--完整版-带结果--vc++实现

合集下载

计算机图形学实验指导书(vc++版)

计算机图形学实验指导书(vc++版)

实验指导书刘文涛2013目录第一章图形学实验环境和要求 (4)1.1 VC++实验环境 (4)1.1.1 基本环境 (4)1.1.1 开发图形程序的一般流程 (7)1.1.3 基本绘图函数介绍 (11)1.2 OpenGL (22)1.2.1 OpenGL介绍 (22)1.2.2 OpenGL开发环境 (24)1.2.3 OpenGL函数 (24)1.2.4 回调函数 (25)1.2.4 一个典型OpenGL例程 (26)1.3 实验要求 (29)1.3.1 实验内容 (29)1.3.2 实验方法 (29)1.3.3 实验效果 (30)第二章直线生成算法 (30)2.1 实验原理 (30)2.1.1 DDA算法 (30)2.1.2 Bresenham算法 (30)2.2 实验内容 (30)2.3 参考示例程序 (30)第三章圆和椭圆生成算法 (32)3.1 实验原理 (32)3.2 实验内容 (32)3.3 参考示例程序1 (32)3.4 参考示例程序2 (33)第四章裁剪算法 (35)4.1 实验原理 (35)4.2 实验内容 (35)4.3 示例程序 (35)4.3.1 参考例子1 (35)4.3.2参考例子2 (38)第五章二维变换 (40)5.1 实验原理 (40)5.2 实验内容 (40)5.3 示例程序 (40)5.3.1参考例子1 (40)第六章三维变换 (44)6.1 实验原理: (44)6.2 实验内容 (45)6.3示例程序 (45)第七章填充算法 (47)7.1 实验原理: (47)7.2 实验内容 (47)7.3示例程序 (47)第八章曲线曲面 (50)8.1 实验原理 (50)8.2 实验内容 (50)8.3示例程序 (51)8.3.1 参考例子(1) (51)8.3.2 参考例子(2) (52)8.3.3 参考例子(3) (54)8.3.4 参考例子(4) (56)第九章真实感图形绘制 (59)9.1 实验原理 (59)9.2 实验内容 (59)9.3示例程序 (59)9.3.1参考例子(1) (59)9.3.2参考例子(2) (61)9.3.3参考例子(3) (63)第十章动画 (66)10.1 实验原理 (66)10.2 实验内容 (66)10.3示例程序 (66)10.3.1 参考例子 (66)参考文献: (72)第一章图形学实验基础1.1 VC++实验环境1.1.1 基本环境Microsoft Visual C++ 6.0 是微软推出的功能强大的可视化C/C++语言编译器,运行在Windows 9x/2000/NT等平台上,可以建立32位应用程序。

计算机图形学实验报告模板

计算机图形学实验报告模板

巢湖学院计算机图形学实验报告(模板>本课程实验包括:以下为实验二和实验三模板实验一:基本图元绘制一、实验目的了解OpenGL图形软件包绘制图形的基本过程及其程序框架,并在已有的程序框架中添加代码实现直线和圆的生成算法,演示直线和圆的生成过程,从而加深对直线和圆等基本图形生成算法的理解。

b5E2RGbCAP二、实验内容实验操作和步骤:本次实验主要的目的是为了掌握基本画线和画圆算法,对于书上给出的代码,要求通过本次实验来具体的实现。

由于实验已经给出大体的框架,所以只需要按照书上的算法思想来设计具体实现代码,对于直线DDA算法,中点Bresenham算法及其改进算法,以及Bresenham画圆算法都有进一步的体会。

DDA算法是对每一步都要进行增量处理,然后取整,绘制,而Bresenham通过判断误差函数和求取递推公式来实现。

特别是对于整数的选择取舍,以及代码的流程和循环的控制有一个深入的了解。

同时也熟练运用OpenGL基本的绘图函数。

p1EanqFDPw三、体会通过本次实验,我进一步加深了对于基本画图算法的理解。

特别是对于DDA,Bresenham和画圆算法。

其中,DDA算法由于每一步都要处理浮点数的四舍五入,所以在绘图时要进行取整,效率较低,但是代码直观好懂,符合原理。

而对于Bresenham及其改进算法,都是在理论推导的基础上来实现的,然后经过整数化,形成了一个高效率的画图算法,所以需要适当的理解,特别是对于取整操作判断比较巧妙,实现了避免多次判断计算浮点数的目的,所以比较高效。

而绘制圆形的时候,用到的基本思想还是和Bresenham画图算法一样,只不过需要注意的是八分法画圆,这样只需要绘制其中的八分之一就可以利用对称的关系来绘制出整个图形。

而对于是否走下一步,或者是停留,判断的依据还是误差函数,和前面的思想是类似。

另外,通过实验训练了自己的编程能力,同时熟悉了OpenGL绘图的函数和流程,也进一步巩固了相关的知识。

《计算机图形学》实验报告

《计算机图形学》实验报告

《计算机图形学》实验报告《实验名称》姓名=学号6010203165专业软件外包班级三班任课教师刘世光天津大学仁爱学院计算机系2012年3 月20 日一、实验目的初步熟悉OpenGL这一图形系统的用法,利用Visual C++编程平台。

学习并掌握常用的三维绘制函数。

二、实验内容准备glut库,并联系使用Visual C++进行最简单的图形处理。

调试并学习Teapot绘制程序。

总结三维绘制和二维绘制的异同点。

三、实验结果程序1程序2程序3四、实验分析和总结五、源代码程序1#include <GL/glut.h>//初始化OpenGLvoid init(void){glClearColor(0.0f, 0.0f, 0.0f, 0.0f);//设置背景颜色glShadeModel(GL_FLAT);//设置明暗处理}//主要的绘制过程void display(void){glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓存glColor3f(0.0f,0.0f,1.0f);glRectf(250.0f,250.0f,400.0f,400.0f);glBegin(GL_LINES);//开始画直线glColor3f(1.0f, 1.0f, 1.0f);//设置颜色为白色glVertex2f(30.0f, 30.0f);//第一根线的两个端点glVertex2f(200.0f, 400.0f);glColor3f(1.0f, 0.0f, 0.0f);//设置第二根线的颜色为红色glVertex2f(25.0f, 350.0f);//第二根线的两个端点glVertex2f(250.0f, 50.0f);glEnd();//画线结束glBegin(GL_TRIANGLES);//开始画三角形,注意,没有设颜色,所以还是红色glVertex2f(400.0f, 100.0f);//三角形的三个顶点glVertex2f(600.0f, 100.0f);glVertex2f(500.0f, 300.0f);glEnd();//结束画三角形glFlush();//开始绘制}//在窗口改变大小时调用void reshape(int width, int height)glViewport(0, 0, width, height);//设置视口glMatrixMode(GL_PROJECTION);//设置当前为投影变换模式glLoadIdentity();//用单位矩阵替换当前变换矩阵gluOrtho2D(0.0, width, 0.0, height);//设置正交投影视图体}//处理键盘void keyboard(unsigned char key, int x, int y){switch (key){case 27://esc键退出exit(0);break;default:break;}}int main(int argc, char** argv){glutInit(&argc, argv);//初始化glutglutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//设置为单缓存,RGB模式glutInitWindowSize(640, 480); //设置窗口大小glutInitWindowPosition(0, 0);//设置窗口起始位置glutCreateWindow("Basic");//设置窗口标题init();//初始化OpenGLglutDisplayFunc(display);//设置显示回调函数glutReshapeFunc(reshape);//设置reshape回调函数glutKeyboardFunc(keyboard);//设置键盘回调函数glutMainLoop();//进入主循环return 0;}//代码要有详细的注释程序2#include "StdAfx.h"#include <stdlib.h>#include <GL/glut.h>void init(void){glEnable(GL_DEPTH_TEST);GLfloat position[] = {1.0, 1.0, 1.0, 0.0};glLightfv(GL_LIGHT0, GL_POSITION, position);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);GLfloat ambient[] = {0.0, 0.0, 0.0, 1.0};GLfloat diffuse[] = {0.8, 0.4, 0.3, 0.7};GLfloat specular[] = {0.5, 0.3, 0.3, 0.0};glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, specular);glMaterialf(GL_FRONT, GL_SHININESS, 50.0);}void display(void){glClearColor(0.65f, 0.3f, 0.05f, 1.0f);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glNewList(1, GL_COMPILE);glutSolidTeapot(0.5);glEndList();glCallList(1);glFlush();}void reshape(GLsizei w, GLsizei h){glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);glMatrixMode(GL_MODELVIEW);}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowPosition(260, 100);glutInitWindowSize(500, 500);glutCreateWindow(argv[0]);init();glutReshapeFunc(reshape);glutDisplayFunc(display);glutMainLoop();return 0;}程序3#include <GL/glut.h>//初始化OpenGLvoid init(void){glClearColor(0.0f, 0.0f, 0.0f, 0.0f);//设置背景颜色glShadeModel(GL_FLAT);//设置明暗处理}//主要的绘制过程void display(void){glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓存glColor3f(0.0f,0.0f,1.0f);glRectf(250.0f,250.0f,400.0f,400.0f);glBegin(GL_LINES);//开始画直线glColor3f(1.0f, 1.0f, 1.0f);//设置颜色为白色glVertex2f(30.0f, 30.0f);//第一根线的两个端点glVertex2f(200.0f, 400.0f);glColor3f(1.0f, 0.0f, 0.0f);//设置第二根线的颜色为红色glVertex2f(25.0f, 350.0f);//第二根线的两个端点glVertex2f(250.0f, 50.0f);glEnd();//画线结束glBegin(GL_TRIANGLES);//开始画三角形,注意,没有设颜色,所以还是红色glVertex2f(400.0f, 100.0f);//三角形的三个顶点glVertex2f(600.0f, 100.0f);glVertex2f(500.0f, 300.0f);glEnd();//结束画三角形glFlush();//开始绘制}//在窗口改变大小时调用void reshape(int width, int height){glViewport(0, 0, width, height);//设置视口glMatrixMode(GL_PROJECTION);//设置当前为投影变换模式glLoadIdentity();//用单位矩阵替换当前变换矩阵gluOrtho2D(0.0, width, 0.0, height);//设置正交投影视图体}//处理键盘void keyboard(unsigned char key, int x, int y){switch (key){case 27://esc键退出exit(0);break;default:break;}}int main(int argc, char** argv){glutInit(&argc, argv);//初始化glutglutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//设置为单缓存,RGB模式glutInitWindowSize(640, 480); //设置窗口大小glutInitWindowPosition(0, 0);//设置窗口起始位置glutCreateWindow("Basic");//设置窗口标题init();//初始化OpenGLglutDisplayFunc(display);//设置显示回调函数glutReshapeFunc(reshape);//设置reshape回调函数glutKeyboardFunc(keyboard);//设置键盘回调函数glutMainLoop();//进入主循环return 0;}//代码要有详细的注释。

计算机图形学作业1(VC程序)

计算机图形学作业1(VC程序)

void CLeviView::OnExercise(){// TODO: Add your command handler code here CDC*pDC=GetDC();RedrawWindow();pDC->Rectangle(50,20,700,400);CPen bluepen(PS_SOLID,1,RGB(0,0,255));CPen*old=pDC->SelectObject(&bluepen);pDC->Rectangle(200,200,500,210);pDC->Rectangle(348,120,352,200);pDC->Rectangle(348,210,352,250);CPen redpen(PS_SOLID,2,RGB(255,0,0));pDC->SelectObject(&redpen);pDC->MoveTo(210,200);pDC->LineTo(348,130);pDC->MoveTo(348,140);pDC->LineTo(250,200);pDC->MoveTo(290,200);pDC->LineTo(348,150);pDC->MoveTo(352,130);pDC->LineTo(490,200);pDC->MoveTo(450,200);pDC->LineTo(352,140);pDC->MoveTo(352,150);pDC->LineTo(410,200);//pDC->SelectObject(&bluepen);//pDC->MoveTo(348,200);//pDC->LineTo(352,200);//pDC->MoveTo(348,210);//pDC->LineTo(352,210);CPen greenpen(PS_SOLID,1,RGB(0,255,0));pDC->SelectObject(&greenpen);pDC->Rectangle(70,100,170,300);pDC->MoveTo(70,100);pDC->LineTo(120,70);pDC->LineTo(220,70);pDC->LineTo(220,200);pDC->MoveTo(220,210);pDC->LineTo(220,270);pDC->LineTo(170,300);pDC->MoveTo(170,100);pDC->LineTo(220,70);pDC->MoveTo(500,190);pDC->Ellipse(500,190,650,230);pDC->MoveTo(650,210);pDC->LineTo(650,280);pDC->Ellipse(500,260,650,300);pDC->MoveTo(500,210);pDC->LineTo(500,280);pDC->TextOut(535,170,"直升机机场"); float t=2*3.1416/5;float q,x[5],y[5];int x0=120,y0=140,r=20,i;for(i=0;i<=4;i++){q=t*i-3.1416/2;x[i]=r*cos(q)+x0;y[i]=r*sin(q)+y0;}CPen red1pen(PS_SOLID,1,RGB(255,0,0)); pDC->SelectObject(&red1pen);pDC->MoveTo(x[0],y[0]);pDC->LineTo(x[2],y[2]);pDC->LineTo(x[4],y[4]);pDC->LineTo(x[1],y[1]);pDC->LineTo(x[3],y[3]);pDC->LineTo(x[0],y[0]);pDC->TextOut(110,160,"巨");pDC->TextOut(110,180,"人");pDC->TextOut(110,200,"大");pDC->TextOut(110,220,"厦");pDC->SelectObject(&redpen);pDC->Ellipse(480,70,540,130);CBrush goldenBrush(RGB(238,199,16)); pDC->SelectObject(&goldenBrush); pDC->FloodFill(500,80,RGB(255,0,0));CBrush green1Brush(HS_FDIAGONAL,RGB(0,255,0));pDC->SelectObject(&green1Brush);pDC->FloodFill(575,210,RGB(0,255,0));CBrush grayBrush(RGB(50,50,50));pDC->SelectObject(&grayBrush);pDC->FloodFill(130,80,RGB(0,255,0));pDC->SelectObject(&bluepen);pDC->MoveTo(70,400);pDC->LineTo(170,350);pDC->LineTo(250,250);pDC->LineTo(300,220);pDC->LineTo(340,220);pDC->LineTo(348,250);pDC->MoveTo(430,400);pDC->LineTo(440,350);pDC->LineTo(470,310);pDC->LineTo(490,230);pDC->LineTo(410,220);pDC->LineTo(360,225);pDC->LineTo(352,250);pDC->LineTo(348,250);pDC->MoveTo(70,400);pDC->LineTo(430,400);CBrush green2Brush(RGB(51,153,102));pDC->SelectObject(&green2Brush);pDC->FloodFill(200,350,RGB(0,0,255));//CBrush green3Brush(RGB(0,255,0));//pDC->SelectObject(&green3Brush);//pDC->FloodFill(210,205,RGB(0,0,255));ReleaseDC(pDC);}。

《计算机图形学》实验报告

《计算机图形学》实验报告

《计算机图形学》实验报告目录1实验2:直线的生成 (1)1.1实验要求和目的 (1)1.2实验课时 (1)1.3实验环境 (1)1.4实验内容 (1)1.5核心代码 (3)1.6实验结果 (7)1.6.1DDA算法 (10)1.6.2Mid-Bresenham算法 (11)1.7心得与体会 (12)2实验4:BSpline曲线绘制 (13)2.1实验要求和目的 (13)2.2实验课时 (13)2.3实验环境 (13)2.4实验内容 (13)2.5核心代码 (16)2.6实验结果 (18)2.6.1B-样条算法 (19)2.6.2Bezeir算法 (22)2.7心得与体会 (24)附录 (25)BSpline曲线控制点的测试数据 (25)数据1 (25)数据2 (27)数据3 (29)数据4 (30)数据5 (31)数据6 (33)数据7 (36)数据8 (38)1实验2:直线的生成1.1实验要求和目的理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力;编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的直线,分别调用DDA算法和Bresenham中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel 等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。

1.2实验课时3学时1.3实验环境本试验提供自带实验平台·开发环境:Visual C++ 6.0·实验平台:Free_Curve(自制平台)1.4实验内容本实验提供名为 Experiment_Frame_One的平台,该平台提供基本绘制、设置、输入功能,学生在此基础上实现·平台界面:如图1.4.1所示·设置:通过view->setting菜单进入,如图1.4.2所示·输入:通过view->input…菜单进入,如图1.4.3所示·实现算法:▪DDA算法:void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1)▪Mid_Bresenham算法:voidCExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1)图 1.4.1 总界面图 1.4.2 设置界面图 1.4.3 输入界面1.5核心代码本次实验的核心代码如下所示。

计算机图形学实验

计算机图形学实验

实验三MFC画直线最近自己在学习如何在VC 6.0 开发环境下的使用MFC AppWizard(exe)来绘画一条直线,虽然比较简单,通过这样的练习可以帮助你熟悉MFC的开发环境以及其中的消息传递机制,希望对于像我一样初入MFC图形绘制学习的人有帮助第一步:构建MFC窗体打开Visual C++ 6.0编译器新建→工程→MFC AppWizard(exe),工程名以DrawLine为例,然后确定。

为了方便,在MFC应用程序向导—步骤1当中选择“单文档”,其余所有的步骤都为默认值,直接“完成”。

这样一个简单的MFC 窗体就构建好了,自己不妨Compile—Build—BuildExecute一下。

第二步:编辑菜单项选择ResourceView视窗展开Menu文件夹,左键双击IDR_DRAWLITYPE,右边就会出现菜单图形编辑界面,为了简化,我们只在添加帮助→DrawLine功能选择项。

双击空白会弹出“菜单项目属性”对话框。

ID:ID_DRAW_LINE;标明:DrawLine(&D),其它的为缺省。

第三步:建立消息命令如果此时运行该程序,你会发现帮助—DrawLine的功能选项是灰色的,原因就在于我们还没有添加该功能的消息命令相应函数。

通过“查看—Message Maps—Project:DrawLine—Class name:CDrawLineView—Object IDs:ID_DRAW_LINE—选定COMMAND—Add Function…”,其它为默认,最后确定完成。

现在如果再重新运行该程序的话,会发现原来的灰色已经消除了。

第四步:添加鼠标消息响应打开ClassView视窗,右键选定CDrawLineView,选择Add Windows Messsage Handler会弹出对话框,完成CDrawLineView类的WM_LBUTTONDOWN、WM_MOUSEMOVE、WM_LBUTTONUP三个Windows消息事件的新建。

计算机图形学实验报告

计算机图形学实验报告

计算机图形学实验报告计算机图形学实验 (一) – OpenGL 基础用OPENGL画直线\圆\曲线等二维图1.1 综述这次试验的目的主要是使大家初步熟悉OpenGL 这一图形系统的用法,编程平台是Visual C++,它对OpenGL 提供了完备的支持。

OpenGL 提供了一系列的辅助函数,用于简化Windows 操作系统的窗口操作,使我们能把注意力集中到图形编程上,这次试验的程序就采用这些辅助函数。

本次实验不涉及面向对象编程,不涉及MFC。

1.2 在 VC 中新建项目1.2.1 新建一个项目选择菜单File 中的New 选项,弹出一个分页的对话框,选中页Projects 中的Win32Console Application 项,然后填入你自己的Project name,如Test,回车即可。

VC 为你创建一个工作区(WorkSpace ),你的项目Test 就放在这个工作区里。

1.2.2 为项目添加文件为了使用OpenGL,我们需要在项目中加入三个相关的Lib 文件:glu32.lib、glaux.lib、opengl32.lib,这三个文件位于c:\programfiles\microsoft visualstudio\vc98\lib 目录中。

选中菜单Project->Add To Project->Files 项(或用鼠标右键),把这三个文件加入项目,在FileView 中会有显示。

这三个文件请务必加入,否则编译时会出错。

或者将这三个文件名添加到Project->Setting->Link->Object/library Modules 即可。

点击工具条中New Text File 按钮,新建一个文本文件,存盘为Test.c 作为你的源程序文件,再把它加入到项目中,然后就可以开始编程了。

1.3 一个 OpenGL 的例子及说明1.3.1 源程序请将下面的程序写入源文件Test.c,这个程序很简单,只是在屏幕上画两根线。

计算机图形学圆的生成算法的实现

计算机图形学圆的生成算法的实现
pDC->SetPixel(x+x0,-y+y0,color>。
}
ReleaseDC(pDC>。
}
四、实验结果分析
调试是程序成功后,运行结果如下:中点算法生成的圆<蓝色圆弧)如图3-2,Bresenham算法生成的圆<黑色圆弧)如图3-3,中点算法生成的椭圆如图3-4。xHAQX74J0X
图3-2 中点法画圆效果图
pDC->SetPixel(-y+x0,-x+y0,c>。
pDC->SetPixel(y+x0,-x+y0,c>。
}
ReleaseDC(pDC>。
}
中点算法画椭圆。设中心在 ,长半轴为 ,短半轴为 。其VC程序设计代码如下:
void CMyView::OnMidpointellispe(>
{
CDC *pDC=GetDC(>。
pDC->SetPixel(y+x0,x+y0,color>。
pDC->SetPixel(-y+x0,x+y0,color>。
pDC->SetPixel(-y+x0,-x+y0,color>。
pDC->SetPixel(y+x0,-x+y0,color>。
}
ReleaseDC(pDC>。
}
Bresenham算法画圆。利用Bresenham画圆算法画出圆心在 、半径为R的圆,其VC程序设计代码如下:jLBHrnAILg
实验三圆的生成算法的实现
班级 08信计2班 学号20080502054姓名曲凯歌分数

计算机图形学 使用VC开发绘图程序的基本方法

计算机图形学  使用VC开发绘图程序的基本方法

七、思考题(尽量做,计入成绩) :
1、为什么要用 CDC 定义一个对象来作图? Windows 使用与设备无关的图形设备环境进行显示 。MFC 基础类库定义了设备环境对象类----CDC 类。 因为使用的是 mfc,如果是 sdk 的话就得用 dc,这个 cdc 想当是一个给设备画画的笔。 2、如果要绘制多条直线,应该如何编程?
4、 VC 中编程环境中,工程(project)是什么意义?为什么要用 project 的方式管理代码?
Project 文件的扩展名是 dsp,这个文件中存放的是一个特定的工程,也就是特定的应用程序的有关信息, 每个工程都对应有一个 dsp 类型的文件。 clw 为扩展名的文件是用来存放应用程序中用到的类和资源的信 以 息的,这些信息是 VC 中的 ClassWizard 工具管理和使用类的信息来源。 因为用 project 的方式管理代码比较方便,可以看成是在一个文件夹下进行的。
3、 在 MyView.cpp 文件的 OnDraw 函数中加入如下代码。 pDC->MoveTo(100,100); pDC->LineTo(200,200); CPen *pOldPen; CPen dashPen; dashPen.CreatePen(PS_DASH,1,RGB(255,0,0)); pOldPen = pDC->SelectObject(&dashPen); pDC->LineTo(300,100); pDC->SelectObject(pOldPen); pDC->LineTo(400,200);
实验(No. 1
)题目:使用 VC 开发绘图程序的基本方法
实验目的及要求:
一、实验目的:
编写一个具有一定功能的 MFC 类库应用程序 (引入简单的视图/文档概念) 掌握 GDI 画图的基本方法, , 并调用系统函数画直线。

《计算机图形学》实验报告

《计算机图形学》实验报告

实验报告模板《计算机图形学》实验报告一、实验目的及要求1.实习三维图形的坐标系之间的变换;2.三维图形几何变换;3.掌握三维图形的坐标系之间的变换算法及三维图形几何变换的原理和实现;4.实现二维图形的基本变换(平移、旋转、缩放、错切、对称、复合等);5.实现三维图形的基本变换(平移、旋转、缩放、复合等);二、理论基础在齐次坐标理论下,二维图形几何变换矩阵可用下式表示:⎪⎪⎪⎭⎫⎝⎛===ifchebgdaTnkxx kk2,1,0,)(ϕ平移变换:[x* y* 1] =[x y 1] *0000001ts⎛⎫⎪⎪⎪⎝⎭=[t*x s*y 1]比例变换:[x* y* 1]=[x y 1] *1000101m n⎛⎫⎪⎪⎪⎝⎭=[m+x n+y 1]旋转变换:在平面上的二维图形饶原点逆时针旋转Ө角,变换矩阵为[x* y* 1]=[x y 1] *cos sin0sin cos0001θθθθ⎛⎫⎪- ⎪⎪⎝⎭= [x*cosө-y*sinө]复合变换:以上各种变换矩阵都是以原点为参照点,当以任意参照点进行变换的时候,我们就要用到复合变换矩阵。

三维变换类似于二维,在画图时,把三维坐标转换为二维即可。

三、算法设计与分析二维变换:#define dx 50#define dy 100void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+dx;a[1]=m[i][1]+dy;b[0]=m[i+1][0]+dx;b[1]=m[i+1][1]+dy;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define h 0.1745#include<math.h>void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*cos(h)-m[i][1]*sin(h);a[1]=m[i][1]*cos(h)+m[i][0]*sin(h);b[0]=m[i+1][0]*cos(h)-m[i+1][1]*sin(h);b[1]=m[i+1][1]*cos(h)+m[i+1][0]*sin(h);DDALine(a,b, RGB(0, 200, 255), pDC);}}#define k 2;#define f 2.5void CCGWithVCView::OnTransMove() //缩放{// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Scale Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*k;a[1]=m[i][1]*f;b[0]=m[i+1][0]*k;b[1]=m[i+1][1]*f;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define n 2#define d 0void CCGWithVCView::OnTransOther(){// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Other Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+n*m[i][1];a[1]=m[i][1]+d*m[i][0];b[0]=m[i+1][0]+n*m[i+1][1];b[1]=m[i+1][1]+d*m[i+1][0];DDALine(a,b, RGB(0, 200, 255), pDC);}}三维变换:#include<math.h>#define dx 100#define dy 100#define dz 0void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]+dy-p3d[i][0]+dx/sqrt(2);p2d[i][1]=p3d[i][2]+dz+p3d[i][0]+dx/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}#define k 0.1745void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]*cos(k)-p3d[i][2]*sin(k)-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]*cos(k)+p3d[i][1]*sin(k)+p3d[i][0]/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}四、程序调试及结果的分析二维:三维:五、实验心得及建议在实验过程中,尽管过程中任由许多不会的地方,而且有待于今后的提高和改进,但我加深了对书本上知识的理解与掌握,同时也学到了很多书本上没有东西,并积累了一些宝贵的经验,这对我以后的学习与工作是不无裨益的。

计算机图形学实验报告

计算机图形学实验报告

计算机图形学 实验报告实验一:二维线画图元的生成实验目的:掌握直线段的生成算法,并用C/WIN-TC/VC++实现算法,包括中点法生成直线,微分数值法生成直线段等。

实验内容:用不同的方法生成斜率不同的直线段,比较各种方法的效果。

Bresenham 算法的思想Bresenham 画法与中点法相似,都是通过每列象素中确定与理想直线最近的像素来进行直线的扫描的转换的。

通过各行、各列的象素中心构造一组虚拟网格线的交点,然后确定该列象素中与此交点最近的像素。

该算法的巧妙之处在于可以采用增量计算,使得对于每一列,只需要检查一个误差项的符号,就可以确定该列的所有对象。

1.1方法一:直线的中点算法 算法的主要思想:讨论斜率k ∈[1,+∞)上的直线段的中点算法。

对直线01p p ,左下方的端点为0p (x0,y0),右上方的端点为1p (x1,y1)。

直线段的方程为: y m x B =+⇔yy x B x y y x x B x∆=+⇔∆=∆+∆∆ (,)0F x y xy yx xB ⇔=∆-∆-∆= 现在假定已求得像素(,,i r i x y ),则如图得,,11(,]22i i r i r x x x ∈-+ 由于直线的斜率k ∈[1,+∞),故m=1/k ∈(0,1],则1,,13(,]22i i r i r x x x +∈-+ 在直线1i y y =+上,区间,,13(,]22i r i r x x -+内存在两个像素NE 和E 。

根据取整原则,当11(,)i i x y ++在中点M 11(,)2i i x y ++右方时,取像素NE ,否则取像素E ,即,11,,1()()01()()0i r i i r i r i x E F M x x x NE F M x +++⎧⇔≤=⎨+⇔>⎩i i 点当(,y +1)在左方时点当(,y +1)在右方时若取2()i d F M =,则上式变为 ,1,,()01(0i r i i r i r i x E d x x NE d +⎧≤=⎨+>⎩点当点)当计算i d 的递推公式如下:,11,12[(2)()]0122(,2)0122[(2)(1)]2i i r i i i i i i i rx y y x xB d d F x y d x y y x xB ++⎧∆+-∆+-∆⎪≤⎪=++=⎨>⎪∆+-∆++-∆⎪⎩=202()i i i i d xd d x y d +∆≤⎧⎨+∆-∆>⎩算法的初始条件为:00,00,0(,)(0,0)12(,1)22r r x y x y d F x y x y =⎧⎪⎨=++=∆-∆⎪⎩ 相应的程序示例:建立成员函数:void MidPointLine4(CDC*pDC,int x0,int y0,int x1,int y1,int color) { /*假定x0<x1,直线斜率m>1*/int dx,dy,incrE,incrNE,d,x,y; dx=x1-x0; dy=y1-y0; d=2*dx-dy; incrE=2*dx;incrNE=2*(dx-dy); x=x0;y=y0;pDC->SetPixel(x,y,color); while (x<x1) {if (d<=0) d+=incrE; else{ d+=incrNE; x++; } y++;p->SetPixel(x,y,color);} }编写OnDraw 函数:void CMy1_1View::OnDraw(CDC* pDC) { CMy1_1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here MidPointLine4(pDC,200,200,300,300,RGB(0,0,0)); MidPointLine4(pDC,300,200,400,300,RGB(0,0,0)); MidPointLine4(pDC,400,200,500,300,RGB(0,0,0)); }编译运行程序得到如下结果:1.2方法二:直线的数值微分法 算法的主要思想:由于课本上已经给出了斜率m ∈[-1,1]上的算法,故此处给出斜率m ∈[1,+∞〕上的算法,m ∈(-∞,-1]上的可同理推导。

计算机图形学实验内容

计算机图形学实验内容

计算机图形学实验内容计算机图形学实验肖加清实验一图形学实验基础一、实验目的(1)掌握VC++绘图的一般步骤;(2)掌握OpenGL软件包的安装方法;(3)掌握OpenGL绘图的一般步骤;(4)掌握OpenGL的主要功能与基本语法。

二、实验内容1、VC++绘图实验(1)实验内容:以下是绘制金刚石图案。

已给出VC++参考程序,但里面有部分错误,请改正,实现以下图案。

N=3N=4N=5N=10CP2();virtual ~CP2();CP2(double,double);double x;double y;};CP2::CP2(){this->x=0.0;this->y=0.0;}CP2::~CP2(){}CP2::CP2(double x0,double y0) {this->x=x0;this->y=y0;}//视图类的一个成员函数,这个成员函数可以放在OnDraw函数里调用。

//在视图类的头文件(.h)里定义此函数void Diamond();//在视图类的实现文件(.cpp)里实现此函数void CTestView::Diamond(){CP2 *P;int N;double R;R=300;N=10;P=new CP2[N];CClientDC dc(this);CRect Rect;GetClientRect(&Rect);double theta;theta=2*PI/N;for(int i=0;i<N;i++){P[i].x=R*cos(i*theta);P[i].y=R*sin(i*theta);}for(i=0;i<=N-2;i++){for(int j=i+1;j<=N-1;j++){//其中ROUND函数需要自己实现,实现四舍五入的功能。

dc.MoveTo(ROUND(P[i].x+Rect.right/2),RO UND(P[i].y+Rect.bottom/2));dc.LineTo(ROUND(P[j].x+Rect.right/2),RO UND(P[j].y+Rect.bottom/2));}}delete []P;}2、OpenGL绘图(1)以下是用OpenGL绘制茶壶的代码,请在OpenGL环境下运行,分析OpenGL程序的结构#include <windows.h>#include <GL/gl.h>#include <GL/glu.h>#include <GL/glaux.h>//定义输出窗口的大小#define WINDOW_HEIGHT 300#define WINDOW_WIDTH 500//用户初始化函数void myninit(void);//窗口大小变化时的回调函数void CALLBACK myReshape(GLsizei w,GLsizei h);//每帧OpenGL都会调用这个函数,应该把显示代码放在这个函数中void CALLBACK display(void);int window_width=WINDOW_WIDTH;int window_height=WINDOW_HEIGHT;//视点离物体的距离float distance=3.6f;//初始化,此时为空,可以在这里进行初始化操作void myinit(void){}void CALLBACK display(void){//设置清屏的颜色,并清屏和深度缓冲glClearColor(0.0f,0.0f,0.0f,0.0f);glClear(GL_COLOR_BUFFER_BIT|GL_ DEPTH_BUFFER_BIT);//设置成模型矩阵模式glMatrixMode(GL_MODELVIEW);//载入单位化矩阵glLoadIdentity();//坐标中心向Z轴平移-distance,这样使坐标中心位于视点前方glTranslatef(0.0,0.0,-distance);//在坐标中心显示一个茶壶auxWireTeapot(1.0);//等待现有的OpenGL命令执行完成glFlush();//交换前后缓冲区auxSwapBuffers();}void CALLBACK myReshape(GLsizei w,GLsizei h){if(!h) return ;//这定视区glViewport(0,0,w,h);//设定透视方式glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60.0,1.0*(GLfloat)w/(GLflo at)h,1.0,30.0);window_width=w;window_height=h;}//移近移远的回调函数void CALLBACK MoveNear(void){distance-=0.3f;}void CALLBACK MoveFar(void){distance +=0.3f;}//主函数int main(int argc,char **argv){//初始化OpenGL的显示方式auxInitDisplayMode(AUX_DOUBLE|AUX _RGB|AUX_DEPTH16);//设定OpenGL窗口位置和大小auxInitPosition(0,0,WINDOW_WIDTH,W INDOW_HEIGHT);//打开窗口auxInitWindow("OpenGL的一个简单的例子!");//调用初始化函数myinit();//设定窗口大小变化的回调函数auxReshapeFunc(myReshape);//设定移动视点的回调函数auxKeyFunc('A',MoveNear); //按A键变大auxKeyFunc('a',MoveFar); //按a键变小//使display函数一直被调用auxIdleFunc(display);//开始OpenGL的循环auxMainLoop(display);//结束程序return (0);}其运行结果如图所示:(2)OPENGL绘制矩形的简单例子参考程序:#include <gl/glut.h>void Initial(void){glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION);//设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0);}void Display(void){glClear(GL_COLOR_BUFFER_BIT); //用当前背景色填充窗口glColor3f(1.0f, 0.0f, 0.0f); //设置当前的绘图颜色为红色glRectf(50.0f, 100.0f, 150.0f, 50.0f); //绘制一个矩形glFlush(); //处理所有的OpenGL程序}int main(int argc, char* argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300);//设置窗口的尺寸glutInitWindowPosition(100,120);//设置窗口的位置glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display);//设置当前窗口的显示回调函数Initial();//完成窗口初始化glutMainLoop();//启动主GLUT事件处理循环return 0;}三、实验结果分析实验二直线生成算法与用户接口与交互式技术一、实验目的1、掌握直线生成算法(1)DDA算法(2)Bresenham算法2、掌握交互式技术(1)鼠标(2)键盘数字键、字母键、功能键和特殊键3、实现拾取操作二、实验内容1、以下给出了DDA算法的C++代码,请参考用Visual C++实现Bresenham算法。

《计算机图形学》课内实验报告(实验一)

《计算机图形学》课内实验报告(实验一)
PFNGLGETINFOLOGARBPROC glGetInfoLogARB;
PFNGLUNIFORM1FARBPROC glUniform1fARB;
PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
#ifndef __APPLE__
PFNGLSECONDARYCOLOR3FPROC glSecondaryColor3f;
{
GLbyte infoLog[MAX_INFO_LOG_SIZE];
glGetInfoLogARB(progObj, MAX_INFO_LOG_SIZE, NULL, infoLog);
fprintf(stderr, "Error in program linkage!\n");
fprintf(stderr, "Info log: %s\n", infoLog);
// Demonstrates high-level shaders
// Program by Benjamin Lipchak
#include "../../Common/OpenGLSB.h" // System and OpenGL Stuff
#include "../../Common/GLTools.h" // System and OpenGL Stuff
// Initially set the blink parameter to 1 (no flicker)
if (flickerLocation != -1)
glUniform1fARB(flickerLocation,1.0f);
// Program object has changed, so we should revalidate

计算机图形学曲线曲面

计算机图形学曲线曲面

北方工业大学计算机图形学课程实验报告题目:实验五曲线曲面学院:计算机学院专业:数字媒体技术指导教师:蔡兴泉学生班级:学生学号:学生姓名:教师评定:实验报告5 曲线曲面一.实验目的1.熟悉OpenGL图形库;2.掌握曲线曲面实现算法。

二.实验环境1.软件环境:操作系统:WinXp应用软件:VC6.0,OpenGL2.硬件环境(查看自己的机子)CPU: Intel PIV 2.80GHz内存RAM: 1GB显卡:NVIDIA GeForce7650,256M显存三.实验内容1. 写程序实现Bezier曲线2. 写程序实现绘制3个半径不同、颜色不同的小球3. 写程序实现一个场景,绘制1个立方体、1个圆锥、1个圆柱、1个茶壶四.程序及结果1. Bezier曲线实现关键程序及注释void RenderScene(void){int i;glClear(GL_COLOR_BUFFER_BIT) //设置贝塞尔曲线glMap1f(GL_MAP1_VERTEX_3, //生成的数据类型0.0f, //u值的下界100.0f, / //u值的上界3, //顶点在数据中的间隔,x,y,z所以间隔是 3nNumPoints, //u方向上的阶,即控制点的个数&ctrlPoints[0][0]); //指向控制点数据的指针glEnable(GL_MAP1_VERTEX_3);// //必须在绘制顶点之前开启glBegin(GL_LINE_STRIP); //使用画线的方式来连接点for(i = 0; i <= 100; i++){glEvalCoord1f((GLfloat) i); //求的点坐标}glEnd();DrawPoints();//画点glutSwapBuffers();/ /交换两个缓冲区指针}2. 小球绘制实现关键程序及注释void RenderScene(void){GLUquadricObj *pObj; // 定义Quadric ObjectglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清屏glPushMatrix();//矩阵状态glTranslatef(0.0f, -1.0f, -5.0f);glRotatef(xRot, 1.0f, 0.0f, 0.0f);//glRotatef(yRot, 0.0f, 1.0f, 0.0f);pObj = gluNewQuadric();//创建一个新的二次曲面状态对象gluQuadricNormals(pObj, GLU_SMOOTH);//glPushMatrix();glColor3f(1.0f, 1.0f, 1.0f); //定义颜色为白glTranslatef(0.0f, 1.0f, 0.0f);//圆心坐标gluSphere(pObj, .3f, 26, 13); // 绘制小球半径为0.3 glPopMatrix();glPushMatrix();glColor3f(1.0f, 0.0f, 0.0f);//定义颜色为红glTranslatef(0.0f, 0.0f, 0.0f); // 圆心坐标gluSphere(pObj, .5f, 26, 13);//绘制小球半径为0.5glPopMatrix();//glPushMatrix();//glColor3f(0.0f, 0.0f, 0.0f);// 定义颜色为黑glTranslatef(0.0f, 2.0f, 0.0f); // 圆心坐标gluSphere(pObj, 0.2f, 26, 13);// 绘制小球半径为0.2glPopMatrix();glPopMatrix();//恢复矩阵状态glutSwapBuffers();//交换缓冲}3. 场景绘制实现关键程序及注释void RenderScene(void){GLUquadricObj *pObj; // 定义Quadric ObjectglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清屏glPushMatrix();//保存矩阵glTranslatef(0.0f, -1.0f, -5.0f);glRotatef(xRot, 1.0f, 0.0f, 0.0f);glRotatef(yRot, 0.0f, 1.0f, 0.0f);pObj = gluNewQuadric();//创建一个新的二次曲面状态对象gluQuadricNormals(pObj, GLU_SMOOTH);//绘制正方体glBegin(GL_QUADS); //顶面glNormal3f(0.0f,1.0f,0.0f);glVertex3f(0.5f,0.5f,0.5f);glVertex3f(0.5f,0.5f,-0.5f);glVertex3f(-0.5f,0.5f,-0.5f);glVertex3f(-0.5f,0.5f,0.5f);glEnd();glBegin(GL_QUADS); //底面glNormal3f(0.0f,-1.0f,0.0f);glVertex3f(0.5f,-0.5f,0.5f);glVertex3f(-0.5f,-0.5f,0.5f);glVertex3f(-0.5f,-0.5f,-0.5f);glVertex3f(0.5f,-0.5f,-0.5f);glEnd();glBegin(GL_QUADS); //前面计算机图形学实验报告05glNormal3f(0.0f,0.0f,1.0f);glVertex3f(0.5f,0.5f,0.5f);glVertex3f(-0.5f,0.5f,0.5f);glVertex3f(-0.5f,-0.5f,0.5f);glVertex3f(0.5f,-0.5f,0.5f);glEnd();glBegin(GL_QUADS); //背面glNormal3f(0.0f,0.0f,-1.0f);glVertex3f(0.5f,0.5f,-0.5f);glVertex3f(0.5f,-0.5f,-0.5f);glVertex3f(-0.5f,-0.5f,-0.5f);glVertex3f(-0.5f,0.5f,-0.5f);glEnd();glBegin(GL_QUADS); //左面glNormal3f(-1.0f,0.0f,0.0f);glVertex3f(-0.5f,0.5f,0.5f);glVertex3f(-0.5f,0.5f,-0.5f);glVertex3f(-0.5f,-0.5f,-0.5f);glVertex3f(-0.5f,-0.5f,0.5f);glEnd();glBegin(GL_QUADS); //右面glNormal3f(1.0f,0.0f,0.0f);glVertex3f(0.5f,0.5f,0.5f);glVertex3f(0.5f,-0.5f,0.5f);glVertex3f(0.5f,-0.5f,-0.5f);glVertex3f(0.5f,0.5f,-0.5f);glEnd();//绘制圆锥glPushMatrix();glColor3f(1.0f, 0.6f, 0.3f);glTranslatef(0.0f, 0.5f, 0.0f);glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);gluCylinder(pObj, 0.18f, 0.0f, 0.3f, 26, 13);glPopMatrix();// 绘制圆柱glPushMatrix();glColor3f(0.0f, 0.0f, 0.0f);glTranslatef(0.0f, 1.3f, 0.0f);glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);gluCylinder(pObj, 0.17f, 0.17f, 0.4f, 26, 13);glDisable(GL_CULL_FACE);计算机图形学实验报告05gluDisk(pObj, 0.28f, 0.28f, 26, 13);glTranslatef(0.0f, 0.0f, 0.40f);gluDisk(pObj, 0.0f, 0.17f, 26, 13);glPopMatrix();/绘制/茶壶glPushMatrix();glColor3f(0.0f, 1.0f, 1.0f);glTranslatef(0.0f, 1.0f, 0.0f);glutSolidTeapot(0.25f);glPopMatrix();glPopMatrix();//glutSwapBuffers();//交换缓冲}五.实验收获通过这次实验,我熟悉了OpenGL图形库,掌握了曲线曲面的算法,.掌握了了Bezier 曲线的实现,和基本基本几何体如球体、圆锥、圆柱、茶壶、立方体的画法。

计算机图形学上机报告模板(2)

计算机图形学上机报告模板(2)

实验报告(第2周)
班级:姓名:学号:
实验名称:使用Visual Studio建立第一个MFC程序
报告内容:
1、任务描述
(1)使用向导创建一个单文档MFC应用程序,在主菜单添加绘图-画点的菜
单项;单击菜单项弹出消息框,输出“Hello,MFC!”的信息
(2)创建一个CRect类,用于描述矩形。

成员变量包括长度、宽度、颜色;
成员函数包括求矩形面积、求矩形周长;增加构造函数和析构函数,输
出构造和析构信息
(3)在CRect类基础上,派生一个CCube类,增加高度成员变量;增加构造
函数和析构函数
(4)建立一个控制台程序,实例化CRect类和CCube类,并输出结果(可参
见《基础教程》P38程序)
(5)(选作)尝试建立CRect类数组,随机初始化,并使用数组指针顺序输

2、试验环境
(1)Visual Studio 6.0 (或以上)标准版
3、试验目标
(1)熟悉Visual Studio开发环境
(2)熟悉MFC应用程序的组成
(3)复习C++语法,巩固类和继承的概念
4、实验步骤
(运行结果抓图,有用的程序代码,并辅助文字说明)。

计算机图形学报告

计算机图形学报告

沈阳航空航天大学计算机图形学实验报告班级:34140102学号:20130 姓名:成绩:指导教师:实验一:OpenGL绘制球体线框图1.实验目的:本实验要求熟悉OpenGL基本图元函数的使用。

通过使用OpenGL及GLUT库在Visual C++环境下编写图形绘制程序掌握图形绘制的一般框架,从而为进一步做综合性的图形绘制实验奠定基础2.实验要求:编写一个程序,在窗口中显示一个旋转的球体线框,利用光标键可启动图形旋转切换视点。

3.实验过程:先配置环境,把相关文件放到相应的文件夹C:\Program Files\Microsoft Visual Studio\VC98\Include\GL C:\WINDOWS\system32 C:\Program Files\Microsoft Visual Studio\VC98\Lib建一个新工程,比照pdf敲代码再通过VC++进行编译4.实验结果:程序运行后,弹出窗口,使用光标键可使球体旋转。

代码:include <windows.h>#include <math.h>#include <gl/gl.h>#include <gl/glu.h>#include <gl/glaux.h>void init();void CALLBACK reshapae(GLsizei w,GLsizei h);void CALLBACK display();GLfloat s, h;//回调函数,绘制窗口时调用void CALLBACK display(){//清空窗口设置背景为白色glClearColor(1, 1, 1, 1);glClear(GL_COLOR_BUFFER_BIT);//取景变换glLoadIdentity();gluLookAt(5, 5, h, s, 0, 0, 0, 1, 0);//glRotatef(30,1,1,0);//设置前景色为黑色glColor3f(0,0,0);//绘图开始,两条水平平行线GLfloat RAD = 3.1415926/180;GLfloat x, y, z, r;int i, j;for(i = 0; i < 180; i+=5){glBegin(GL_LINE_LOOP);r = 2 * sin(i * RAD);z = 2 * cos(i * RAD);for(j = 0; j <= 360; j+=10){x = r * cos(j * RAD);y = r * sin(j * RAD);glVertex3f(x, y, z);}glEnd();}for(j = 0; j < 360; j+=10){glBegin(GL_LINE_LOOP);for(i = 0;i <=180; i+=5){r = 2 * sin(i * RAD);z = 2 * cos(i * RAD);x = r * cos(j * RAD);y = r * sin(j * RAD);glVertex3f(x, y, z);}glEnd();}//清空帧缓存glFlush();}//OpenGL初始化,设置颜色为单一着色模式void init(){glShadeModel(GL_FLAT);s = 0;h = 5;}//回调函数,窗口初始化和大小改变时,调用此函数void CALLBACK reshape(GLsizei w,GLsizei h){//设置当前矩阵为投影变换矩阵glMatrixMode(GL_PROJECTION);//设置投影变换glLoadIdentity();gluPerspective(30, 1, -3, 3);//设置当前矩阵为模式变换矩阵glMatrixMode(GL_MODELVIEW);//设置视区变换glViewport(0, 0, w, h);}void CALLBACK Left(){s+=0.1;}void CALLBACK Right(){s-=0.1;}void CALLBACK Up(){h-=0.1;}void CALLBACK Down(){h+=0.1;}void main(){//设置OpenGL的显示模式:单缓存、RGB模式auxInitDisplayMode(AUX_SINGLE|AUX_RGB);//设置窗口位置、大小和标题auxInitPosition(0, 0, 300, 300);auxInitWindow("OpenGL Demo");init();//设置回调函数auxKeyFunc(AUX_LEFT,Left);auxKeyFunc(AUX_RIGHT,Right);auxKeyFunc(AUX_UP,Up);auxKeyFunc(AUX_DOWN,Down);auxReshapeFunc(reshape);auxMainLoop(display);}5.实验心得:对vc下opengl的配置还是花费了很多时间,通过本次试验,熟悉了OpenGL基本图元函数的使用,通过使用OpenGL及GLUT库在Visual C++环境下编写图形绘制程序掌握图形绘制的一般框架,从而为进一步做综合性的图形绘制实验奠定基础。

图形学实验一Visual C++图形程序设计

图形学实验一Visual C++图形程序设计

实验一Visual C++图形程序设计一、实验目的Visual C++是在Microsoft C的基础上发展而来的,随着计算机软、硬件技术的快速发展,如今Visual C++已成为集编辑、编译、运行、调试于一体功能强大的集成编程环境。

本章以Visual C++ 6.0为对象,主要介绍Visual C++集成编成环境的使用、图形设备接口和常用图形程序设计、鼠标编程以及菜单设计等基础,目的是通过对Visual C++的学习,掌握Visual C++图形程序设计的方法,为计算机图形学原理部分的算法实现提供程序工具和方法。

二、实验任务1.学习Visual C++图形程序设计的方法;2.掌握Visual C++集成编成环境的使用、图形设备接口和常用图形程序设计。

三、基础知识和实验步骤3.1 Visual C++ 6.0应用程序开发方法介绍Visual C++ 6.0集成开发环境,以一个简单的实例介绍利用Visual C++应用程序工程建立方法和程序设计框架。

3.1.1 Visual C++的集成开发环境从开始菜单中启动Visual C++ 6.0,进入开发集成环境。

打开一个项目后,可以看到Visual C++ 6.0的开发环境由标题栏、工具栏、工作区窗口、源代码编辑窗口、输出窗口和状态栏组成,见图3.1所示。

标题栏用于显示应用程序名和所打开的文件名,标题栏的颜色可以表明对应窗口是否被激活。

菜单栏包括文件、编辑、显示、插入、工程、编译、工具、窗口和帮助九项主菜单,包含了从源代码的编辑、界面设计、程序调试和编译运行在内的所有功能。

工具栏列出了常用的菜单命令功能和对象方法。

工具栏的下面是两个窗口,一个是工作区窗口,用于列出工程中的各种对象,一个是源代码编辑窗口,用于各个对象的程序设计。

输出窗口显示项目建立过程中所产生的各种信息。

屏幕底端是状态栏,它给出当前操作或所选择命令的提示信息。

标题栏菜单栏工作区源代码编辑窗口状态栏图3.1 Visual C++ 6.0集成开发环境3.1.2 应用程序工程的建立方法Visual C++提供了一种称为App Wizard的工具,利用该工具,用户可以方便地按照自己的需要创建符合需要的应用程序框架。

计算机图形学实验(全)

计算机图形学实验(全)

计算机图形学实验(全)实验1 直线的绘制实验目的1、通过实验,进一步理解和掌握DDA和Bresenham算法;2、掌握以上算法生成直线段的基本过程;3、通过编程,会在TC环境下完成用DDA或中点算法实现直线段的绘制。

实验环境计算机、Turbo C或其他C语言程序设计环境实验学时2学时,必做实验。

实验内容用DDA算法或Besenham算法实现斜率k在0和1之间的直线段的绘制。

实验步骤1、算法、原理清晰,有详细的设计步骤;2、依据算法、步骤或程序流程图,用C语言编写源程序;3、编辑源程序并进行调试;4、进行运行测试,并结合情况进行调整;5、对运行结果进行保存与分析;6、把源程序以文件的形式提交;7、按格式书写实验报告。

实验代码:DDA:# include abs(dy))epsl=abs(dx);elseepsl=abs(dy);xIncre=(float)dx/(float)epsl;yIncre=(float)dy/(float)epsl;for(k=0;k#includevoid BresenhamLine(int x0,int y0,int x1,int y1,int color) {int x,y,dx,dy,e;dx=x1-x0;dy=y1-y0;e=-dx;x=x0;y=y0;while(x0){y++;e=e-2*dx;}}}main(){int gdriver ,gmode ; gdriver = DETECT;initgraph( BresenhamLine(0, 0 , 120, 200,5 );getch ( );closegraph ( );}实验2 圆和椭圆的绘制实验目的1、通过实验,进一步理解和掌握中点算法;2、掌握以上算法生成椭圆或圆的基本过程;3、通过编程,会在TC环境下完成用中点算法实现椭圆或圆的绘制。

实验环境计算机、Turbo C或其他C语言程序设计环境实验学时2学时,必做实验。

2021年计算机图形学实验报告完整版

2021年计算机图形学实验报告完整版

试验一Window图形编程基础一、试验类型: 验证型试验二、试验目1、熟练使用试验关键开发平台VC6.0;2、掌握怎样在编译平台下编辑、编译、连接和运行一个简单Windows图形应用程序;3、掌握Window图形编程基础方法;4、学会使用基础绘图函数和Window GDI对象;三、试验内容创建基于MFCSingle Document应用程序(Win32应用程序也可, 同学们可依据自己喜好决定), 程序能够实现以下要求:1、用户能够经过菜单选择绘图颜色;2、用户点击菜单选择绘图形状时, 能在视图中绘制指定形状图形;四、试验要求与指导1、建立名为“颜色”菜单, 该菜单下有四个菜单项: 红、绿、蓝、黄。

用户经过点击不一样菜单项, 能够选择不一样颜色进行绘图。

2、建立名为“绘图”菜单, 该菜单下有三个菜单项: 直线、曲线、矩形其中“曲线”项有级联菜单, 包含: 圆、椭圆。

3、用户经过点击“绘图”中不一样菜单项, 弹出对话框, 让用户输入绘图位置, 在指定位置进行绘图。

五、试验结果:六、试验关键代码1、画直线: CClientDC *m_pDC;再在OnDraw函数里给变量初始化m_pDC=new CClientDC(this);在OnDraw函数中添加:m_pDC=new CClientDC(this);m_pDC->MoveTo(10,10);m_pDC->LineTo(100,100);m_pDC->SetPixel(100,200,RGB(0,0,0));m_pDC->TextOut(100,100);2、画圆:void CMyCG::LineDDA2(int xa, int ya, int xb, int yb, CDC *pDC){int dx = xb - xa;int dy = yb - ya;int Steps, k;float xIncrement,yIncrement;float x = xa,y= ya;if(abs(dx)>abs(dy))Steps = abs(dx);elseSteps = abs(dy);xIncrement = dx/(float)Steps;yIncrement = dy/(float)Steps;pDC->SetPixel(ROUND(x),ROUND(y),RGB(0,0,0));for(k=0;k<Steps;k++){x +=xIncrement;y +=yIncrement;sleep(10);pDC->SetPixel(ROUND(x),ROUND(y),RGB(0,0,0));}3、画矩形void CRectangleDlg::OnLButtonDown(UINT nFlags, CPoint point){lButtonDownNotUp = TRUE;RECT rect;m_showRectangle. GetClientRect( &rect ) ;if( (point. x<rect. right) && (point. x>rect. left) && (point. y<rect. bottom) && (point. y>rect. top) ){regionLeftTopTemp = point;}CDialog::OnLButtonDown(nFlags, point);}void CRectangleDlg::OnMouseMove(UINT nFlags, CPoint point){RECT rect;m_showRectangle. GetClientRect( &rect );if( ( point.x<rect.right ) && ( point.x>rect.left ) && ( point.y<rect.bottom ) && ( point.y>rect.top ) ){if( ( lButtonDownNotUp == TRUE ){regionRightBottomTemp = point;CDC * pDC = m_showRectangle. GetWindowDC ();pDC -> Rectangle( CRect( regionLeftTopTemp, regionRightBottomTemp ) ) ;}}CDialog::OnMouseMove(nFlags, point);}void CRectangleDlg::OnLButtonUp(UINT nFlags, CPoint point){lButtonDownNotUp=FALSE;CDialog::OnLButtonUp(nFlags, point);}试验二基础图形生成算法一、试验类型: 验证型试验二、试验目1、掌握DDA、Bresenham直线生成算法;2、掌握Bresenham或中点圆生成算法;3、掌握Bresenham或中点椭圆生成算法;三、试验内容1、实现DDA、Bresenham直线生成算法;2、实现Bresenham画圆法或中点画圆法;3、实现Bresenham或中点法椭圆生成算法;4、利用1、2、3实现直线、圆、椭圆图形生成函数进行图形绘制;四、试验要求与指导1、根据试验指导书1.6节创建一个基于MFCSingle Document应用程序。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机图形学实验报告信息学院计算机专业20081060183 周建明综括:利用计算机编程语言绘制图形,主要实现以下内容:(1)、中点算法生成任意斜率直线,并设置线型线宽。

(2)、中点算法生成圆(3)、中点算法生成椭圆(4)、扫描算法实现任意多边形填充(5)、Cohen_Sutherland裁剪(6)、自由曲线与曲面的绘制(7)、二维图形变换(8)、三视图变换实验一、直线的生成一、实验内容根据提供的程序框架,修改部分代码,完成画一条直线的功能(中点画线法或者Bresenham画线法任选一),只要求实现在第一象限内的直线。

二、算法原理介绍双击直线生成.dsw打开给定的程序,或者先启动VC++,文件(file)→打开工作空间(open workspace)。

打开直线生成view.cpp,按注释改写下列函数:1.void CMyView::OnDdaline() (此为DDA生成直线)2.void CMyView::OnBresenhamline()(此为Bresenham画直线)3.void CMYView::OnMidPointLine()(此为中点画线法)三、程序源代码1.DDA生成直线画法程序:float x,y,dx,dy,k;dx=(float)(xb-xa);dy=(float)(yb-ya);k=dy/dx;x=xa;y=ya;if(abs(k)<1){for (x=xa;x<=xb;x++){pdc->SetPixel(x, int(y+0.5),COLOR);y=y+k;}}if(abs(k)>=1){for(y=ya;y<=yb;y++){pdc->SetPixel(int(x+0.5),y,COLOR);x=x+1/k;}}//DDA画直线结束}2.Bresenham画直线源程序:float b,d,xi,yi;int i;float k;k=(yb-ya)/(xb-xa);b=(ya*xb-yb*xa)/(xb-xa);if(k>0&&k<=1)for(i=0;i<abs(xb-xa);i++){ d=ya+0.5-k*(xa+1)-b;if(d>=0){ xi=xa+1;yi=ya;xa++;ya=ya+0.5;}if(d<0){ xi=xa+1;yi=ya+1;xa++;ya=ya+1.5;}pdc->SetPixel(xi,yi,COLOR);}//BresenHam画直线结束}3.中点画线法源程序:float b,d,xi,yi;int i;float k;k=(yb-ya)/(xb-xa);b=(ya*xb-yb*xa)/(xb-xa);if(k>0&&k<=1)for(i=0;i<abs(xb-xa);i++){ d=ya+0.5-k*(xa+1)-b;if(d>=0){ xi=xa+1;yi=ya;xa++;ya=ya+0.5;}if(d<0){ xi=xa+1;yi=ya+1;xa++;ya=ya+1.5;}pdc->SetPixel(xi,yi,COLOR); }//BresenHam画直线结束}四、实验结果1、DDA生成直线2、Bresenham画直线3、中点画线法实验二、bresenham画圆一、实验内容根据提供的程序框架,修改部分代码,用Bresenham画法画一段圆弧或者画圆。

二、算法原理介绍双击experiment.dsw打开,或者先启动VC++,文件(file)→打开工作空间(open workspace)。

打开直线生成view.cpp,按注释改写下列函数:void CMyView::OnBresenhamCircle()三、程序源代码bresenham画圆源程序void Bresenhan_circle();int x,y=180,color=1,xcenter,ycenter;x=0;int d=3-2*180;while(x<y){if(d<0){d=d+4*x+6;x=x+1;}else{d=d+4*(x-y)+10;x=x+1;y=y-1;}pdc->SetPixel(0+x,0+y,COLOR);pdc->SetPixel(0+x,0-y,COLOR);pdc->SetPixel(0-x,0+y,COLOR);pdc->SetPixel(0-x,0-y,COLOR);pdc->SetPixel(0+y,0+x,COLOR);pdc->SetPixel(0+y,0-x,COLOR);pdc->SetPixel(0-y,0+x,COLOR);pdc->SetPixel(0-y,0-x,COLOR);}四、实验结果实验三、二维图形的几何变换一、实验内容以一条直线段为例,完成目标的平移、绕任一点旋转。

(缩放等其它变换选做)二、实验步骤和方法1、打开二维变换.dsw2、改写二维变换view.cpp里的void CMyView::Onrecycle()函数(需要改写的地方我已经做了说明)。

3、生成直线的函数采用VC里的函数。

4、函数的主要任务是计算出变换后的坐标。

三、程序源代码1.目标的平移的源程序xa1=xa+dx;ya1=ya+dy;xb1=xb+dx;yb1=yb+dy;2.绕任意点旋转的源程序xa1=cos(angle/57.1)*xa-sin(angle/57.1)*ya+x-x*cos(angle/57.1)+y*sin(angle/57.1);y a1=sin(angle/57.1)*xa+cos(angle/57.1)*ya+y-y*cos(angle/57.1)-x*sin(angle/57.1); xb1=cos(angle/57.1)*xb-sin(angle/57.1)*yb+x-x*cos(angle/57.1)+y*sin(angle/57.1);y b1=sin(angle/57.1)*xb+cos(angle/57.1)*yb+y-y*cos(angle/57.1)-x*sin(angle/57.1);四、实验结果1、目标的平移的源程序2、绕任意点旋转的源程序实验四、用扫描线算法实现多边形填充:(1)算法思想:用水平扫描线从上到下扫描由点线段构成的多段定义的多边形。

每根扫描线与多边形各边产生一系列交点,将这些交点按照x坐标进行排序,将排序后的交点成对取出,作为两个端点,用所需填充的色彩画水平直线。

多边形被扫描完毕,则填充结束。

实现步骤:(1)建立边的分类表ET;(2)将扫描线纵坐标y的初值为ET中非空元素的最小序号;(3)置活化边表AEL为空;(4)执行下列步骤直至ET和AEL都为空;A、如果ET中的第y类非空,则将其中的所有边取出并插入AEL中,在插入过程忠进行排序;B、对AEL中的边两两配对,将每对边中x坐标按规则取整,获得有效的填充区段,再填充;C、将当前扫描线纵坐标y值递增1,即y=1;D、将AEL中满足y=ymax边删去;E、对AEL中剩下的每一条边的x递增deltax,即x=x+deltax;(2)程序实现typedef struct{int y_top;float x_int;int delta_y;float x_change_per_scan; }EACH_ENTRY;EACH_ENTRY sides[MAX_POINT];int x[MAX_POINT],y[MAX_POINT];int side_count,first_s,last_s,scan,bottomscan,x_int_count;void fill_area(int count){sort_on_bigger_y(count); first_s=1; last_s=1;for(scan=sides[1].y_top;scan>=bottomscan;scan--){ update_first_and_last(count,scan);process_x_intersections(first_s,last_s);draw_lines(scan,x_int_count,first_s);update_sides_list(); } }sort_on_bigger_y(int n){ int k,x1,y1;int tem;side_count=0; y1=y[n];x1=x[n]; bottomscan=y[n];for(k=1;k<n+1;k++){ if(y1!=y[k]){ side_count++; if(k!=n) tem=y[k+1];else tem=y[1];put_in_sides_list(side_count,x1,y1,x[k],y[k],tem);}else { setcolor(13); line(x1,y1,x[k],y[k]); }if(y[k]<bottomscan) bottomscan=y[k];y1=y[k];x1=x[k]; }}put_in_sides_list(int entry,int x1,int y1,int x2,int y2,int next_y) { int maxy; float x2_temp,x_change_temp;x_change_temp=(float)(x2-x1)/(float)(y2-y1);x2_temp=x2; if((y2>y1)&&(y2<next_y)){ y2--; x2_temp-=x_change_temp; }else { if((y2<y1)&&(y2>next_y)){ y2++; x2_temp+=x_change_temp; } }maxy=(y1>y2)? y1:y2;while((entry>1)&&(maxy>sides[entry-1].y_top)){ sides[entry]=sides[entry-1];entry--; }sides[entry].y_top=maxy;sides[entry].delta_y=abs(y2-y1)+1;if(y1>y2) sides[entry].x_int=x1;else sides[entry].x_int=x2_temp;sides[entry].x_change_per_scan=x_change_temp;}update_first_and_last(int count,int scan){while((sides[last_s+1].y_top>=scan)&&(last_s<count))last_s++; while(sides[first_s].delta_y==0)first_s++; }process_x_intersections(int first_s,int last_s){ int k; x_int_count=0;for(k=first_s;k<last_s+1;k++){ if(sides[k].delta_y>0){ x_int_count++;sort_on_x(k,first_s);}}}sort_on_x(int entry,int first_s){ while((entry>first_s)&&(sides[entry].x_int<sides[entry-1].x_int)) { swap(&sides[entry],&sides[entry-1]); entry--;}}swap(EACH_ENTRY *x,EACH_ENTRY *y){ int i_temp;float f_temp;i_temp=x->y_top;x->y_top=y->y_top;y->y_top=i_temp;f_temp=x->x_int;x->x_int=y->x_int;y->x_int=f_temp;i_temp=x->delta_y;x->delta_y=y->delta_y;y->delta_y=i_temp;f_temp=x->x_change_per_scan;x->x_change_per_scan=y->x_change_per_scan;y->x_change_per_scan=f_temp;}draw_lines(int scan,int x_int_count,int index){int k,x,x1,x2; for(k=1;k<(int)(x_int_count/2+1.5);k++) { while(sides[index].delta_y==0)index++; x1=(int)(sides[index].x_int+0.5);index++;while(sides[index].delta_y==0)index++;x2=(int)(sides[index].x_int+0.5);setcolor(13);line(x1,scan,x2,scan); index++;}}update_sides_list() {int k;int temp;for(k=first_s;k<last_s+1;k++){ if(sides[k].delta_y>0){ sides[k].delta_y--;sides[k].x_int-=sides[k].x_change_per_scan;}}}实验五用Cohen-Sutherland裁剪算法实现直线段裁剪:5.1编码算法:5.1.1算法思想:本算法分为三个步骤:判断线段两端是否都在窗口内,如果是,线段完全可见;否则判断线段是否显然不可见,如果是,裁剪结束。

相关文档
最新文档