当前位置:文档之家› 计算机图形学OpenGL(第三版)教案

计算机图形学OpenGL(第三版)教案

计算机图形学OpenGL(第三版)教案
计算机图形学OpenGL(第三版)教案

《计算机图形学》教案

2016年3月22日

目录

1.个人授课守则……………………………………………………………………

2.课程概貌…………………………………………………………………………

3.课程教学总体目标与要求………………………………………………………

4.课程教学方式总体设计…………………………………………………………

5.课程板书总体设计………………………………………………………………

6.主页面板书设计…………………………………………………………………

7.课程教学进度安排………………………………………………………………

8.课时备课教案……………………………………………………………………

8.1第1次课……………………………………………………………………

8.2第2次课……………………………………………………………………

8.3第3次课……………………………………………………………………

8.4第4次课……………………………………………………………………

8.5第5次课……………………………………………………………………

8.6第6次课……………………………………………………………………

8.7第7次课……………………………………………………………………

8.8第8次课……………………………………………………………………

8.9第9次课……………………………………………………………………

8.10第10次课……………………………………………………………………

8.11第11次课……………………………………………………………………

8.12第12次课……………………………………………………………………

9.课程综合性实验设计……………………………………………………………

10.英语参考词……………………………………………………………………

11.平时考勤与成绩记载汇总表…………………………………………………

本科课程:计算机图形学

《计算机图形学》教案

陆济湘 2015年12月第三版

1 个人授课守则

☆为人师表身体力行

做阳光下纯净的代表,做黑夜中引路的烛光,布局平凡,杜绝市侩,求真求新,坦然一生。

不求大富大贵,大红大紫,惟求平安康健,无愧我心。

☆授业传道教书育人

给学生一方无污的净土,一片创意的天空,一座智慧的树林,一泓真理的泉水,一把求知的钥匙。

不但授人以鱼,更应授人以渔,还应授人以海。☆答疑解惑恪尽职守

课堂知识讲解力求做到复杂问题简单化,抽象问题形象化,枯燥问题生动化,切实帮助学生理解课程知识。

力争深入浅出,决不故弄玄虚以示深奥。

2 课程概貌

3 课程教学总体目标与要求

4 课程教学方式总体设计

5 课程板书总体设计

5.1设计课程导航页

首页设课程导航页,

总览全课程内容。

5.2设计章首页

每章设一开始页面,明确本章内容。

5.3设计节首页

每节设一开始页面,明确本节内容。

5.4主页面分区设计

主页面分标题、侧边、主内容三区。

5.5设计节内容

每节设具体实例页面,加深本节印象。

5.6设计章末页

每章设一结束页面,布置学生任务

6 主页面板书设计

侧边前述内容目录区记录本页前面所述节的一、二、三级标题,以方

7 课程教学进程安排

8 课时备课教案

下面是使用GLUT库,名为

myMouse的回

调函数例子,它方便地注册了与鼠标关联的事件:glutMouseFunc(myMouse);glutMouseFunc是GLUT库的固有函数,但是回调函数myMouse是程序员定义的,并由程序员编写代码,处理每个可能感兴趣的鼠标动作。

4种主要的OpenGL库:

1)基本GL库,OpenGL库的基础。它提供OpenGL的基本函数。每个OpenGL函数都以字符GL开头。

2)GLUT库:GL实用工具包。它用来打开窗口,开发和管理菜单,以及管理事件等。3)GLU库:GL实用库,它提供高级例程,处理矩阵操作和绘制二次曲面如球和圆柱体;

4)GLUI库:用户接口库,提供控制工具和菜单。

glutDisplayFunc(myDisplay):重绘窗口调用myDisplay回调函数;glutReshapeFun(myReshape):对屏幕窗口的形状进行调整;

void main()

{

glutDisplayFunc(myDisplay); // 注册重绘函数

glutReshapeFunc(myReshape); // 注册改变窗口形状函数绘制三个点:

glBegin(GL_POINTS);

glVertex2i(100, 50);

glVertex2i(100, 130);

glVertex2i(150, 130);

glEnd();

或者用浮点值代替整数值:

glBegin(GL_POINTS);

glVertex2d(100.0, 50.0);

glVertex2d(100.0, 130.0);

glVertex2d(150.0, 130.0);

glEnd();

2.2.2 Sierpinski(塞平斯基)垫片

//初始值P(0),在for循环外面

GLintPoint point = T[index]; // 初始值

glutMouseFunc(myMouse); //

注册鼠标动作函数

glutMotionFunc(myMouse); // 注册鼠标移动函数

glutKeyboardFunc(myKeyboard); // 注册键盘动作函数

//可能初始化其他工作

glutMainLoop(); // 进入主循环等待事件发生 }

void main(int argc, char** argv) {

glutInit(&argc, argv); // 初始化工具包

glutInitDisplayMode(GLUT_SINGLE |

GLUT_RGB); // 设置显示模式

glutInitWindowSize(640,480); // 设置窗口大小

glutInitWindowPosition(100, 150); // 设置窗口在屏幕上的位置

glutCreateWindow("my first attempt"); // 打开屏幕窗口 // 注册回调函数

glutDisplayFunc(myDisplay);

drawDot(point.x, point.y); // 画初始点

for(int i = 0; i < 1000; i++) //画1000点 {

index = rand()%3;

//P (k )=(P (k-1)+T )/2

point.x = (point.x + T[index].x) / 2;

point.y = (point.y + T[index].y) / 2;

drawDot(point.x,point.y); }

glVertex2i(50,80);

glEnd();

glFlush();

绘制多边形,只需要用GL_LINE_LOOP替换GL_LINE_STRIP 即可,即是闭合的。

f(x) = 300 - 100 cos(2p x/100) + 30 cos(4p x/100) + 6 cos(6p x/100)

< Calculate constants A, B, C and D for scaling and shifting>

glBegin(GL_LINE_STRIP);

for(x = 0; x <= 300; x += 3)

glVertex2d(A * x + B, C * f(x) + D);

glEnd();

glFlush;

moveTo和lineTo函数实现为:GLintPoint CP; // 全局位置变量

//<<<<<<<<<<<<< moveto >>>>>>>>>>>>>>

void moveto(GLint x, GLint y)

{

CP.x = x; CP.y = y; // 更新CP

}

//<<<<<<<<<<<< lineTo >>>>>>>>>>>>>>>>> void lineto(GLint x, GLint y)

{

glBegin(GL_LINES); // 绘制曲线

glVertex2i(CP.x, CP.y);

glVertex2i(x, y); //

{

static GLintPoint corner[2];

static int numCorners = 0; // initial value is 0

if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)

{

corner[numCorners].x = x;

corner[numCorners].y = screenHeight - y; // flip y coordinate

numCorners++; // have another point

if(numCorners == 2)

{

glRecti(corner[0].x, corner[0].y, corner[1].x, corner[1].y);

numCorners = 0; // back to 0 corners

}

}

else if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)

glClear(GL_COLOR_BUFFER_BIT); // clear the window

glFlush();

}

2.4.3

使用户用鼠标指定初始三角形的三个顶点,置于数组

static GLintPoint corners[3];

static int numCorners = 0;

if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)

{

corner[numCorners].x = x;

corner[numCorners].y = screenHeight - y; // flip y coordinate

if(++numCorners == 3)

Sierpinski(corners); // draw the gasket numCorners = 0; // back to 0 corners

}

鼠标移动

鼠标移动会产生一个鼠标事件:glutMotionFunc(myMovedMouse);

注册函数

参数,即事件发生时鼠标所在的位置。glutPassiveMotionFunc(myPassiveMotion);

这个函数是没有按下鼠标按钮的情况下,

在窗口内移动时调用。

橡皮矩形:随着用户移动鼠标,矩形将相应地变大或变小。

glEnd();

glFlush();

CP.x = x; CP.y = y; // 更新CP

}

§2.4与鼠标和键盘的交互

当用户按下或释放鼠标按钮、移动鼠标或者松开或按下键盘时,就会产生一个相关事件。程序员可以用每类事件注册一个回调函数

glutMouseFunc(myMouse) :

利用按下或者鼠标按钮时发生事件来注册myMouse() ·

glutMotionFunc(myMovedMouse)

利用鼠标移动注册函数myMovedMouse()

glutKeyboardFunc(myKeyboard)

利用按下或者松开键盘按键时注册函数myKeyBoard()

2.4.1 用鼠标交互

注册一个函数到glutMouseFunc (myMouse),myMouse()的名字可以任意,有四个参数:

void myMouse(int button, int state, int x, int y);

button的值如下:GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, 或GLUT_RIGHT_BUTTON;下面的程序是用户单击鼠标建立矩形的一个角点,然后不按下鼠标时移动鼠标,调用myPassiveMotion(int x, int y)

第二个角点。

()函数。

图形学(

\2.2.1-threeDots.doc

2.4.4

按下键盘上的某个按键时就会产生一个键盘事件,

()

这种事件,该函数的原型为:myKeyboard(unsigned int key, int x, int y);

在的位置。实例代码为:

void myKeyboard(unsigned char theKey, int mouseX, int mouseY)

{

GLint x = mouseX;

GLint y = screenHeight - mouseY; //

switch(theKey)

{

case

drawDot(x, y); // draw a dot at the mouse position

break;

case GLUT_KEY_LEFT: List[++last].x = x; // add a point

List[ last].y = y;

break;

case

exit(-1); //terminate the program

default:

break; // do nothing

}

}

计算机图形学OpenGL中绘制太阳_地球_月亮的运动模型源代码

#include static int day = 148; // day的变化:从0到359 void myDisplay(void) { glEnable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(75, 1, 1, 400000000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0, -200000000, 200000000, 0, 0, 0, 0, 0, 1); // 红色的“太阳” glColor3f(1.0, 0.0, 0.0); glutSolidSphere(69600000, 100, 100); // 蓝色的“地球” glColor3f(0.0, 0.0, 1.0); glRotatef(day/360.0*360.0, 0.0, 0.0, -1.0); glTranslatef(150000000, 0.0, 0.0); glutSolidSphere(15945000, 100, 100); // 黄色的“月亮” glColor3f(1.0, 1.0, 0.0); glRotatef(day/30.0*360.0 - day/360.0*360.0, 0.0, 0.0, -1.0); glTranslatef(38000000, 0.0, 0.0); glutSolidSphere(4345000, 100, 100); glFlush(); glutSwapBuffers(); } void myIdle(void) { ++day; if( day >= 360 ) day = 0; myDisplay(); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); glutInitWindowPosition(100, 100); glutInitWindowSize(450, 450);

计算机图形学实验--橡皮筋技术(完整代码,准确无误)

计算机图形学上机实验报告 橡皮筋技术 计算机科学与技术学院 姓名: xxx 完成日期: 2010-12-7

实验:橡皮筋技术 一、实验目的与要求 实验目的:1.学会使用OpenGL,进一步掌握基本图形的绘制方法, 2.理解glut程序框架 3.理解窗口到视区的变换 4.理解OpenGL实现动画的原理 5.学会基于鼠标和键盘实现交互的实现方法 二、实验内容: 利用OpenGL实现折线和矩形的皮筋绘制技术,并采用右键菜单实现功能的选择 实现方法:1.橡皮筋技术的实现采用双缓存技术,绘制图形时分别绘制到两个缓存,交替显示。 2.右键菜单控制选择绘制折线还是绘制矩形,实现方法:通过菜单注册函数创建一个弹出式菜单,然后使用函数加入菜单项,最后使用函数讲菜单与鼠标右键关联起来,GLUT通过为菜单提供一个整数标识符实现对菜单的管理,在main主函数通过标识符用函数指定对应的菜单为当前的菜单。 2. 折线的橡皮筋绘制技术实现:鼠标所在位置确定一个点,移动鼠标时,每次移动时将点的信息保存在数组中,连接当前鼠标所在点和前一个点的直线段。 3.矩形的橡皮筋绘制技术:每个矩形由两个点唯一确定,鼠标当前点为第一个点,移动鼠标确定第二个点的位置,由这两点的坐标绘制出举行的四条边(直线段),矩形即绘制完毕。 三、实验结果

图鼠标右键菜单 图绘制矩形 四、体会 1> 经过这次实验,逐步对opengl软件有了一定的了解,而且对于理论知识有了很好的巩固,并非仅仅会C语言就能编写画图程序,gult程序有自己特殊的框架与实现过程.在这次试验中,虽然没有完全理解其原理,但在一定程度上已经为我们今后的学习应用打下了基础. 2>初步了解了如何在OpenGL实现基本的绘图功能,以及鼠标和键 盘灯交互设备的实现,还有如何由初始生成元绘制分形物体。在这个过 程中遇到了很多问题,程序的调试也是困难重重,通过自己看书思考和 老师、同学的帮助最终完成了程序的调试,在这一过程中加深了对理论 知识的理解,以及理清了理论到实践转换的一点点思路,再一次体会到 理论与实践的结合的重要性,今后要多多提高提高动手能力。

研究生计算机图形学课程室内场景OpenGL--实验报告Word版

《高级计算机图形学》实验报告 姓名:学号:班级: 【实验报告要求】 实验名称:高级计算机图形学室内场景 实验目的:掌握使用OpenGL生成真实感复杂对象的方法,进一步熟练掌握构造实体几何表示法、扫描表示法、八叉树法、BSP树法等建模方法。 实验要求:要求利用OpenGL生成一个真实感的复杂对象及其周围场景,并显示观测点变化时的几何变换,要具备在一个纹理复杂的场景中漫游功能。要求使用到光线跟踪算法、 纹理映射技术以及实时绘制技术。 一、实验效果图 图1:正面效果图

图2:背面效果图 图4:背面效果图

图4:室内场景细节效果图 图5:场景角度转换效果图

二、源文件数据代码: 共6个文件,其实现代码如下: 1、DlgAbout.cpp #include "StdAfx.h" #include "DlgAbout.h" CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() 2、FormCommandView.cpp #include "stdafx.h" #include "Tool.h" #include "MainFrm.h" #include "FormCommandView.h" #include "ToolDoc.h" #include "RenderView.h" // Download by https://www.doczj.com/doc/9e658161.html, #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // CFormCommandView IMPLEMENT_DYNCREATE(CFormCommandView, CFormView) CFormCommandView::CFormCommandView() : CFormView(CFormCommandView::IDD) { //{{AFX_DATA_INIT(CFormCommandView)

计算机图形学 实验 利用OpenGL实现图形的平移、旋转、缩放

XXXXXXXX大学(计算机图形学)实验报告 实验名称利用OpenGL实现图形的平移、旋转、缩放 实验时间年月日 专业姓名学号 预习操作座位号 教师签名总评 一、实验目的: 1.了解OpenGL下简单图形的平移、旋转、缩放变换的编程的基本思想; 2.掌握OpenGL下简单图形的平移、旋转、缩放变换的编程的基本步骤; 二、实验原理: 在OpenGL中,可以使用下面三个函数便捷地实现简单图形平移、旋转、缩放变换的功能: glRotatef(theta, vx, vy, vz); glTranslatef(dx, dy, dz); glScalef(sx,sy,sz); 三、实验内容: // 1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "glut.h" #include "math.h" void display() { glClear( GL_COLOR_BUFFER_BIT); // Clear the frame buffer glColor3f( 0.0, 1.0, 1.0); // Set current color to green glBegin( GL_POLYGON); // Draw the triangle glV ertex2f( 0.0, -0.2); glV ertex2f( 0.2, 0.0); glV ertex2f( 0.0, 0.0); glEnd(); glFlush(); } void dsp()

计算机图形学与图像处理教案

精编资料 了解图形学与图像处理的发展,应用以及当前国际国内研究的热点和重要成果;理解图形学与图像处理对图元以及图像的分析与理解的以及二维与三维形状重建等;... 图形,图像 计算机图形学与图像处理教案 学时:36,其中讲授26学时,上机10学时。 适用专业:信计专业与数学专业。 先修课程:高等数学、线性代数、数据结构、VC++或者C# 一、课程的性质、教育目标及任务: 计算机图形学与图像处理实际上是两门课程的一个综合。这是一门研究图形学与图像处理的基本理论、方法及其在智能化检测中应用的学科,是计算机科学与技术等电子信息类本科专业的专业课。 本课程侧重于对图形学的基本图元的基本生成,以及图像处理中对图像在空间域与频率域的基本处理算法的研究。并对图形学与图像处理基本理论和实际应用进行系统介绍。目的是使学生系统掌握图形学与图像处理的基本概念、原理和实现方法,学习图形学与图像处理分析的基本理论、典型方法和实用技术,具备解决智能化检测与控制中应用问题的初步能力,为在计算机视觉、模式识别等领域从事研究与开发打下扎实的基础。 二、教学内容基本要求: 1.了解图形学与图像处理的发展、应用以及当前国际国内研究的热点和重要成果; 2.理解图形学与图像处理对图元以及图像的分析与理解的以及二维与三维形状重建等; 3.掌握图形学与图像处理中最基本、最广泛应用的概念、原理、理论和算法以及基本技术和方法; 4.能够运用一门高级语言编写简单的图形学与图像处理软件,实现各种图形学与图像处理的算法。 三、主要教学内容:

学习图形学的基本概念,了解光栅显示系统的原理;掌握基本图元的生成算法:直线的生成算法、曲线的生成算法、多边形的生成算法;掌握区域填充、线段剪裁以及多边形的剪裁;掌握图元的几何变换、以及投影的基本理论。 了解图像的概念;图像数字化的基本原理:取样、量化、数字图像的表示;线性系统理论在图像变换,滤波中的应用:线性系统理论、离散图像变换、小波变换;图像编码压缩、增强,以及复原的基本方法:无失真压缩、有失真压缩、变换编码、压缩标准、图像滤波原理、复原滤波器、直方图运算、点运算;图像识别的基本原理和方法:图像分割、图像分析、图像分类; 四、学时安排 总课时72学时,图形学36学时,其中包括26个学时讲授,10个学时上机;图像处理36学时,其中包括26个学时讲授,10个学时上机; 五、参考书目: (1), Donald Hearn & M,Pauline Baker (2),< Computer Graphics with OpenGL, Third Edition> Donald Hearn & M,Pauline Baker (3),计算机图形学实用技术陈元琰,张晓竞,科学出版社 (4),计算机图形学倪明田,吴良芝北京大学出版社 (5) <>, Rafael C. Gonzalez & Richard E. Woods. Publishing House of Electronics Industry. (6) << Image Processing ,Analysis, and Machine Vision ( second Edition)>> ,Milan Sonka, V aclav Hlavac. Publishing House of People Post 第一讲图形学基本概念 重点: 了解图形学概念;掌握图形学中的几个概念:分辨率,光栅,扫描线,像素,帧缓冲器;了解图形学的基本用途;掌握图形学光栅扫描显示系统的工作原理; 难点: 光栅扫描显示系统的工作原理; 教学方法: 课堂讨论式教学方法,基于问题式以及启发式教学方法相结合。双语教学。 主要内容: 1,什么是计算机图形学? 2,计算机图形学的主要用途是什么? 3,计算机图形学中的一些基本概念: 什么是分辨率?什么是光栅?什么是光栅扫描系统的扫描线?什么是像 素?什么是帧缓冲器?什么是刷新率?

计算机图形学试验指导一–OpenGL基础

计算机图形学实验指导(一) –OpenGL基础 1.综述 这次试验的目的主要是使大家初步熟悉OpenGL这一图形系统的用法,编程平台是Visual C++,它对OpenGL提供了完备的支持。 尽管OpenGL包括渲染命令,但却独立于任何窗口系统和操作系统。因此,OpenGL并不包括用来打开窗口以及从键盘或鼠标读取事件的命令。在这里,我们应用GLUT库简化Windows窗口操作。 2.准备GLUT库 下载glut压缩包后,解压,把glut32.dll放在Windows的system32目录下,将glut32.lib 放在C:\program files\Microsoft Visual Studio\VC98\Lib目录中,将glut.h放在C:\program files\Microsoft Visual Studio\VC98\Include\GL目录中 2.在VC中新建项目 新建一个项目。 选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32 Console Application项,然后填入你自己的Project name,回车即可。VC为你创建一个工作区(WorkSpace),你的项目就放在这个工作区里。 为项目添加文件 为了使用OpenGL,我们需要在项目中加入相关的Lib文件:glut32.lib 选中菜单Project->Settings项,在link选项卡中的Object/Library modules栏中加入glut32.lib。 选择菜单File中的New选项,弹出一个分页的对话框,选中页Files中的C++sourcefile,填入文件名,钩选添加到刚才建的那个工程里,然后就可以开始编程了。 3.一个OpenGL的例子 #include //初始化OpenGL void init(void) { glClearColor(0.0f, 0.0f, 0.0f, 0.0f);//设置背景颜色 glShadeModel(GL_FLAT);//设置明暗处理 } //主要的绘制过程 void display(void) { glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓存 glBegin(GL_LINES);//开始画直线 glColor3f(1.0f, 1.0f, 1.0f);//设置颜色为白色 glVertex2f(30.0f, 30.0f);//第一根线的两个端点 glVertex2f(200.0f, 400.0f);

计算机图形学实验C++代码

一、bresenham算法画直线 #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 (x1>xEnd) { x=xEnd;y=yEnd; xEnd=x1; } else { x=x1; y=y1; } draw_pixel(x,y); while(x

} void myinit() { glClearColor(0.8,1.0,1.0,1.0); glColor3f(0.0,0.0,1.0); glPointSize(1.0); glMatrixMode(GL_PROJECTION); 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(); glutMainLoop(); } 二、中点法绘制椭圆 #include #include #include inline int round(const float a){return int (a+0.5);} void setPixel(GLint xCoord,GLint yCoord) { glBegin(GL_POINTS); glVertex2i(xCoord,yCoord); glEnd(); } void ellipseMidpoint(int xCenter,int yCenter,int Rx,int Ry) { int Rx2=Rx*Rx; int Ry2=Ry*Ry; int twoRx2=2*Rx2; int twoRy2=2*Ry2; int p; int x=0; int y=Ry; int px=0; int py=twoRx2*y; void ellipsePlotPoints(int,int,int,int);

计算机图形学课程教学大纲

《计算机图形学》课程教学大纲一、课程基本信息 课程代码:110053 课程名称:计算机图形学 英文名称:Computer Graphics 课程类别:专业课 学时:72 学分: 适用对象:信息与计算科学专业本科生 考核方式:考试(平时成绩占总成绩的30%) 先修课程:高级语言程序设计、数据结构、高等代数 二、课程简介 中文简介: 计算机图形学是研究计算机生成、处理和显示图形的学科。它的重要性体现在人们越来越强烈地需要和谐的人机交互环境:图形用户界面已经成为一个软件的重要组成部分,以图形的方式来表示抽象的概念或数据已经成为信息领域的一个重要发展趋势。通过本课程的学习,使学生掌握计算机图形学的基本原理和基本方法,理解图形绘制的基本算法,学会初步图形程序设计。 英文简介: Computer Graphics is the subject which concerned with how computer builds, processes and shows graphics. Its importance has been shown in people’s more and more intensively need for harmony human-machine interface. Graphics user interface has become an important part of software. It is a significant trend to show abstract conception or data in graphics way. Through the learning of this course, students could master Computer Graphics’basic theories and methods,understand graphics basic algorithms and learn how to design basic graphics program. 三、课程性质与教学目的 《计算机图形学》是信息与计算科学专业的一门主要专业课。通过本课程的学习,使学生掌握基本的二、三维的图形的计算机绘制方法,理解光栅图形生成基本算法、几何造型技术、真实感图形生成、图形标准与图形变换等概念和知识。学会图形程序设计的基本方法,为图形算法的设计、图形软件的开发打下基础。 四、教学内容及要求 第一章绪论 (一)目的与要求 1.掌握计算机图形学的基本概念; 2.了解计算机图形学的发展、应用; 3.掌握图形系统的组成。

《计算机图形学》答案,第六章

第六章曲线和曲面 3、参照Hermite三次曲线的几何形式,试用B[P 0 P 1 P u P 1 u P uu P 1 uu]T , 推导相 应五次曲线的调和函数和系数矩阵M。 解:设Hermite五次曲线的几何形式为: P(t)=a5t5 + a4t4 + a3t3 + a2t2 + a1t + a0其中 t∈[0,1] 按题意,已知曲线两端点的坐标值P0 P1 曲线两端点的一阶导数值P0u P1u 曲线两端点的二阶导数值P0uu P1uu 则求出系数a5,a4,a3,a2,a1,a0 则P(t)就可确定; 由于P(t)= a5t5 + a4t4 + a3t3 + a2t2 + a1t + a0其中 t∈[0,1] P’(t)=5a5t4 + 4a4t3 + 3a3t2 + 2a2t + a1 P”(t)=20a5t3+12a4t2+6a3t+2a2 P0=P(0)=a0 P1=P(1)=a5+a4+a3+a2+a1+a0 P0’=P’(0)=a1 P1’=P’(1)=5a5+4a4+3a3+2a2+a1 P0”=P”(0)=2a2 P1”=P”(1)=20a5+12a4+6a3+2a2 所以 a0 = P(0) a1 =P’(0) a2 =P”(0)/2 a3 = 10P(1)- 10P(0) - 4P’(1) - 6P’(0) + P”(1)/2 - 3P”(0)/2 a4 =-15P(1)+ 15P(0) + 7P’(1) + 8P’(0) - P”(1) - 3P”(0)/2 a5 = 6P(1)- 6P(0) - 3P’(1) - 3P’(0) - P”(0)/2 + P”(1)/2 => P(t)=[ -6P(0) + 6P(1) - 3P’(0) - 3P’(1) - P”(0)/2 + P”(1)/2] t5 +[+15P(0) - 15P(1) + 8P’(0) + 7P’(1) + 3P”(0)/2 ] t4 +[-10P(0) + 10P(1) - 6P’(0) - 4P’(1) - 3P”(0)/2 + P”(1)/2] t3 + [ P”(0)/2] t2 + [P’(0)] t +P(0) 整理得: P(t) = (-6t5 + 15t4 - 10t3 + 1) P(0) + (6t5-15t4+10t3) P(1) + (-3t5 + 8t4 -6t3 + t) P’(0) + (-3t5 +7t4-4t3) P’(1) + (-t5/2+ 3t4/2-3t3/2+t2/2) P”(0) + (t5/2-t4+t3/2) P”(1) 故调和函数为: F(0)= -6t5 + 15t4 - 10t3 + 1 F(1)= 6t5 - 15t4 + 10t3 F(2)= -3t5 + 8t4 - 6t3 + t F(3)= -3t5 + 7t4- 4t3 F(4)= -t5/2 + 3t4/2 -3t3/2 + t2/2

计算机图形学 实验一:生成彩色立方体(含源代码)

实验一 实验目的:生成彩色立方体 实验代码://ColorCube1.java import java.applet.Applet; //可以插入html import java.awt.BorderLayout; //窗口采用BorderLayout方式布局import com.sun.j3d.utils.applet.MainFrame; //application import com.sun.j3d.utils.geometry.ColorCube;//调用生成ColorCube的Utility import com.sun.j3d.utils.geometry.Primitive; import com.sun.j3d.utils.universe.*; //观测位置的设置 import javax.media.j3d.*; //核心类 import javax.vecmath.*; //矢量计算 import com.sun.j3d.utils.behaviors.mouse.*; public class ColorCube1 extends Applet { public BranchGroup createSceneGraph() { BranchGroup objRoot=new BranchGroup(); //BranchGroup的一个对象objRoot(放置背景、灯光)BoundingSphere bounds=new BoundingSphere(new Point3d(0.0,0.0,0.0),100.0);//有效范围 TransformGroup objTrans=new TransformGroup(); objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); objRoot.addChild(objTrans); MouseRotate behavior = new MouseRotate(); behavior.setTransformGroup(objTrans); objRoot.addChild(behavior); behavior.setSchedulingBounds(bounds); MouseZoom behavior2 = new MouseZoom(); behavior2.setTransformGroup(objTrans); objRoot.addChild(behavior2); behavior2.setSchedulingBounds(bounds); MouseTranslate behavior3 = new MouseTranslate(); behavior3.setTransformGroup(objTrans); objRoot.addChild(behavior3); behavior3.setSchedulingBounds(bounds);

计算机图形学课程设计--图形绘制变换教案资料

计算机图形学 实验报告 课程名称 : 计算机图形学 实验名称 :图形绘制与变换学院 : 电子信息工程学院专业 : 计算机科学与技术班级 : 11计科本 01班学号 : 姓名 : 张慧 指导教师 : 王征风 二零一四年

目录 一、引言--------------------------------------------------------------------- 3 二、设计需求----------------------------------------------------------------- 4 设计目标--------------------------------------------------------------- 4设计环境--------------------------------------------------------------- 4 VC++ -------------------------------------------------------------- 4 MFC --------------------------------------------------------------- 4设计题目及要求 -------------------------------------------------------- 5总体流程图------------------------------------------------------------ 5三、课程设计原理------------------------------------------------------------- 5 实现的算法------------------------------------------------------------- 5 Bresenham算法画直线------------------------------------------------ 6中心点算法画圆和椭圆------------------------------------------------ 6图形变换的基本原理 ----------------------------------------------------- 8平移变换 ----------------------------------------------------------- 8 旋转变换 ---------------------------------------------------------- 8 比例变换 ---------------------------------------------------------- 9四、总体设计与功能实现 ------------------------------------------------------- 9 主要界面设计 ----------------------------------------------------------- 9设置颜色界面 ----------------------------------------------------------- 9界面设置代码 ------------------------------------------------------- 9 运行结果 ---------------------------------------------------------- 10二维线画图元实现 ------------------------------------------------------ 10画多边形功能的实现 --------------------------------------------------- 14画Bezier曲线功能的实现----------------------------------------------- 15

计算机图形学(第三版)孙家广课后习题答案

第一章:P56 1、列出在你过去学习工作中用过与计算机图形学有关的程序c语言: #include main() { int graphdriver = VGA, graphmode=VGAHI; initgraph(&graphdriver,&graphmode,””); setbkcolor(BLUE); setcolor(WHITE); setfillstyle(1,LIGHTRED); bar3d(100,200,400,350,100,1); floodfill(450,300,WHITE); floodfill(250,450,WHITE); setcolor(LIGHTGREEN); rectangle(450,400,500,450); floodfill(470,420,LIGHTGREEN); getch(); closegraph(); } JA V A语言: 例1、画点 Import java.io.*; Class point { int ax; int ay; int bx; int by; public point(int ax, int ay, int bx, int by) { float k ; //计算斜率 float b; k=(by-ay)/(bx-ax); b=ay-ax*k; system.out.println(“直线的方程为:y=”+k+”x”+”+”+b); } } 例2、画矩形 class DrawPanel extends Jpanel { public void paint(Graphics g)

计算机图形学 opengl 文字显示

#include #include #include #pragma comment(linker, "/subsystem:console") using namespace std; void myReshape(GLsizei w,GLsizei h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w<=h) glOrtho(-20.0,20.0,-20.0*(GLfloat)h/(GLfloat)w, 20.0*(GLfloat)h/(GLfloat)w,-50.0,50.0); else glOrtho(-20.0*(GLfloat)h/(GLfloat)w, 20.0*(GLfloat)h/(GLfloat)w,-20.0,20.0,-50.0,50.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void drawCNString(const char* str) { int len=0, i; wchar_t* wstring; HDC hDC = wglGetCurrentDC(); GLuint list = glGenLists(1); for(i=0; str[i]!='\0'; ++i) { if( IsDBCSLeadByte(str[i]) ) ++i; ++len; } wstring = (wchar_t*)malloc((len+1) * sizeof(wchar_t)); MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, wstring, len); wstring[len] = L'\0'; for(i=0; i

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

计算机图形学实验报告信息学院计算机专业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=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); }

计算机图形学_有效边表算法源代码

#include #include #include #include #define EPSILON 0.000001 //最小浮点数 //点结构体 struct Point { int x; //x坐标 int y; //y坐标 }; //线结构体 struct Line { Point high_point; //高端点 Point low_point; //低端点 int is_active; //是否为有效边,水平边(0),非水平边(1) double inverse_k; //斜率k的倒数 }; //边结点 struct EdgeNode { double x; //扫描线与边交点的x坐标(边的低端点的x坐标)int y_max; //边的高端点的y坐标ymax double inverse_k; //斜率k的倒数 EdgeNode *next; //下一个边结点的指针 }; //有效边表 struct ActiveEdgeTable { int y; //扫描线y EdgeNode *head; //边链表的头指针 }; //桶结点 typedef struct Bucket { int y; //扫描线y EdgeNode *head; //边链表的头指针

Bucket *next; //下一个桶的指针 } EdgeTable; int compare(Point p1, Point p2); Line* create_lines(Point points[], int n); Point get_lowest_point(Line lines[], int n); Point get_highest_point(Line lines[], int n); void swap(Line &l1, Line &l2); void sort(Line lines[], int n); EdgeTable* create_edge_table(Line lines[], int n); ActiveEdgeTable* init_active_table(EdgeTable *edge_table); void delete_edge(ActiveEdgeTable *active_table, int y_max); void add_edge(ActiveEdgeTable *active_table, EdgeNode edge); ActiveEdgeTable* update_active_table(ActiveEdgeTable *active_table, EdgeTable *edge_table); void DrawPolygon(Point points, int n); void DrawGrid(int x, int y); void Fill(Point points[], int n); void Initial(); void Display(); int main(int argc, char* argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400, 300); glutInitWindowPosition(100, 120); glutCreateWindow("Polygon Filling"); glutDisplayFunc(Display); Initial(); glutMainLoop(); return 0; } //比较2个点的高度 int compare(Point p1, Point p2) { if (p1.y > p2.y) return 1; else if (p1.y == p2.y) return 0; return -1; }

计算机图形学课程示范性教学设计

软件学院《计算机图形学》课程示范性教学设计 一、本课程教学方法 1. 教学方法 概述:教学手段以多媒体教学为主、板书教学为辅,考虑到本课程内容多、学时少的特点,教学方法采用基础算法详细讲解、高级应用以专题讲座形式介绍的金字塔式教学方法,即对本科生应掌握的基本内容先详细介绍,以便学生上机时可以直接动手编程实现,然后对后面稍难一些的内容采用专题讲座的形式,即每次课介绍一个专题,既有“点”的深度,又有“面”的广度,点面结合,相辅相成,以达到在有限的学时内、开阔学生视野、提高学生学习兴趣的目的。 (1) 从宏观上介绍计算机图形学的研究内容及其应用领域。 (2) 选择一些常用的、经典的计算机图形学算法详细介绍。 (3)为了加深学生对算法实现过程的理解,强调理论联系实际的重要性,通过编程演示算法的实现结果,并借助于动画软件Flash演示算法的执行过程。 2.建议开课学期:第5学期 3.建议教学形式与教学方法:多媒体授课 二、各部分重点及难点 概述:本课程主要内容包括计算机图形学的研究内容、发展与应用,图形输入输出设备,图形显示原理,图形软件标准,基本图形生成算法,图形几何变换与裁剪,自由曲线和曲面,三维实体造型,分形几何造型,分形艺术,隐藏面消除,光照模型,颜色模型,光线跟踪,纹理细节模拟,常用的计算机动画技术和软件等。 第1章绪论 主要知识点:计算机图形学的研究内容及其与相关学科的关系,计算机图形学的发展与应用 主要能力点:通过阅读文献了解计算机图形学软硬件方面的最新研究进展,提高跟踪学科前沿能力、把握学科方向能力、进行文献检索、文献阅读和文献综述的能力。 主要素质点:科研工作人员的基本素质——把握学科方向、文献检索、阅读和综述 重点:计算机图形学的研究内容 难点:计算机图形学与相关学科的关系 第2章图形输入输出设备 主要知识点:交互式计算机图形处理系统的组成,图形输入输出设备,显示器分类,光栅扫描图形显示原理 主要能力点:通过阅读文献了解在图形输入、输出设备方面的最新研究进展,提高跟踪学科前沿能力、把握学科方向能力、进行文献检索、文献阅读和文献综述的能力。 主要素质点:科研工作人员的基本素质——把握学科方向、文献检索、阅读和综述

相关主题
文本预览
相关文档 最新文档