计算机图形学课程设计

2024-07-15

计算机图形学课程设计(共8篇)

计算机图形学课程设计 篇1

计算机图形学 实验报告

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

二零一四年

目录

一、引言----------------3

二、设计需求---------3

2.1 设计目标--3 2.2 设计环境--3

2.2.1 VC++6.0------------------------3 2.2.2 MFC------------------------------4 2.3 设计题目及要求----------------------4 2.4 总体流程图----------------------------4

三、课程设计原理---5

3.1 实现的算法------------------------------5

3.1.2 Bresenham算法画直线------5 3.1.3 中心点算法画圆和椭圆------5 3.2 图形变换的基本原理------------------7

3.2.1平移变换------------------------7 3.2.2 旋转变换----------------------8 3.2.3 比例变换----------------------8

四、总体设计与功能实现-------------------------8

4.1 主要界面设计---------------------------8 4.2 设置颜色界面---------------------------8

4.2.1 界面设置代码------------------8 4.2.2 运行结果------------------------9 4.3 二维线画图元实现---------------------9 4.4 画多边形功能的实现--------------13 4.5 画Bezier曲线功能的实现-------14 4.6 二维图形变换的实现--------------16 4.7 三维图形的变换--------------------17

五、实验心得体会

一、引言

计算机图形学(Computer Graphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。是计算机科学的一个分支领域,主要关注数字合成与操作视觉的图形内容。计算机图形学研究的是应用计算机产生图像的所有工作,不管图像是静态的还是动态的,可交互的还是固定的,等等。图形API是允许程序员开发包含交互式计算机图形操作的应用而不需要关注图形操作细节或任务系统细节的工具集。计算机图形学有着广泛的应用领域,包括物理、航天、电影、电视、游戏、艺术、广告、通信、天气预报等几乎所有领域都用到了计算机图形学的知识,这些领域通过计算机图形学将几何模型生成图像,将问题可视化从而为各领域更好的服务。

计算机图形学利用计算机产生让人赏心悦目的视觉效果,必须建立描述图形的几何模型还有光照模型,再加上视角、颜色、纹理等属性,再经过模型变换、视图变换、投影操作等,这些步骤从而实现一个完整的OpenGL程序效果。OpenGL是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植。计算机图形学通过应用OpenGL的功能,使得生成的图形效果具有高度真实感。学习计算机图形学的重点是掌握OpenGL在图形学程序中的使用方法。事实上,图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其主要的研究内容。同时,真实感图形计算的结果是以数字图像的方式提供的,计算机图形学也就和图像处理有着密切的关系。

通过21世纪是信息的时代,在日新月异的科技更新中相信计算机会发挥越来越重要的作用,计算机图形学也会在更多的领域所应用,虽然我国在这方面还比较薄弱,但相信会有越来越好的时候的。

二、设计需求

2.1 设计目标

以图形学算法为目标,深入研究。继而策划、设计并实现一个能够表现计算机图形学算法原理的或完整过程的演示系统,并能从某些方面作出评价和改进意见。通过完成一个完整程序,经历策划、设计、开发、测试、总结和验收各阶段,达到:巩固和实践计算机图形学课程中的理论和算法;学习表现计算机图形学算法的技巧;培养认真学习、积极探索的精神。

2.2 设计环境

2.2.1 VC++6.0 VC++6.0是 Microsoft 公司推出的一个基于 Windows 系统平台、可视化的 集成开发环境,它的源程序按 C++语言的要求编写,并加入了微软提供的功能 强大的 MFC(Microsoft Foundation Class)类库。MFC 中封装了大部分 Windows API 函数和 Windows 控件,它包含的功能涉及到整个 Windows 操作系统。MFC 不仅给用户提供了 Windows 图形环境下应用程序的框架,而且还提供了创建应 用程序的组件,这样,开发人员不必从头设计创建和管理一个标准 Windows 应 用程序所需的程序,而是从一个比较高的起点编程,故节省了大量的时间。另 外,它提供了大量的代码,指导用户编程时实现某些技术和功能。因此,使用VC++提供的 高度可视化的应用程序开发工具和 MFC 类库,可使应用程序开发变 得简单。2.2.2 MFC MFC(Microsoft Foundation Classes),是 一 个 微 软 公 司 提 供 的 类 库(class libraries)以 C++类的形式封装了 Windows 的 API,它包含了窗口等许多类的定义。各种类的集合构成了一个应运程序的框架结构,以减少应用程序开发人员的工作 量。其中包含的类包含大量 Windows 句柄封装类和很多 Windows 的内建控件和组 件的封装类。MFC 6.0 版本封装了大约 200 个类,其中的一些可以被用户直接使用。例如CWnd 类封装了窗口的功能,包括打印文本、绘制图形及跟踪鼠标指针的移动等;CsplitterWnd 类是从 CWnd 类派生出来的,继承了基类或称父类 CWnd 类的所 有特 性,但增加了自己的功能,实现拆分窗口,使窗口至少可被拆分成两个窗口,用户 可以移动两个窗口之间的边框来改变窗口的大小;CtoolBar 类可以定义工具栏等。MFC 命名的惯例是类的名字通常是由“C”打头;成员变量使用前缀“m_”,接着使用一个字母来指明数据类型,然后是变量的名称;所有的单词用大写字母开头。

2.3 设计题目及要求

(1)题目:实现多边形和曲线的绘制和变换

(2)要求:学会使用VC++编写实现图形的绘制变换,需包括直线、曲线、多边形的绘制和变换,及三维立体图形的相应变换.2.4 总体流程图

三、课程设计原理

3.1 实现的算法

3.1.1 DDA算法画直线

DDA是数字微分分析式(Digital Differential Analyzer)的缩写。

已知直线两端点(x1,y1)、(x2,y2)则斜率m为:m =(y2-y1)/(x2-x1)= Dx/Dy;直线中的每一点坐标都可以由前一点坐标变化一个增量(Dx, Dy)而得到,即表示为递归式: xi+1=xi+Dx yi+1=yi+Dy。

递归式的初值为直线的起点(x1, y1),这样,就可以用加法来生成一条直线。具体算法是: 该算法适合所有象限,其中用了用了两个函数如:Integer(-8.5)=-9;Integer(8.5)=8;Sign(i),根据i的正负,分别得到-1,0,+1; 相应代码:

//DDA DrawLine

{if(abs(x2-x1)> abs(y2-y1))

length = abs(x2-x1);

else

length = abs(y2-y1);

Dx =(x2-x1)/length;

Dy =(y2-y1)/length;

x = x1+0.5*Sign(Dx);

y = x2 + 0.5*Sign(Dy);

i = 1;

while(i <= lenght)

{ setpixel(Integer(x),Integer(y),color);

x= x + Dx;

y= y + Dy;

i+=1;} } 3.1.2 Bresenham算法画直线

思路如下: // 假设该线段位于第一象限内且斜率大于0小于1,设起点为(x1,y1),终点为(x2,y2).// 根据对称性,可推导至全象限内的线段.1.画起点(x1,y1).2.准备画下个点。x坐标增1,判断如果达到终点,则完成。否则,由图中可知,下个要画的点要么为当前点的右邻接点,要么是当前点的右上邻接点.如果线段ax+by+c=0与x=x1+1的交点的y坐标大于M点的y坐标的话,下个点为U(x1+1,y1+1),否则,下个点为B(x1+1,y1),3.画点(U或者B).4.跳回第2步.5.结束.3.1.3中心点算法画圆和椭圆

(1)中心点算法画圆

在一个方向上取单位间隔,在另一个方向的取值由两种可能取值的中点离圆的远近而定。实际处理中,用决策变量的符号来确定象素点的选择,因此算法效率较高。生成圆弧的中点算 法和上面讲到的生成直线段的中点算法类似。

考虑第一象限内x[0,R/2]的八分之一圆弧段。经过计算,得出判别式的递推公式为:

di1di2xi3di2(xiyi)5d0d0

(xi, M SE yi,r)E 这两个递推公式的初值条件为:

(x0,y0,r)(0,R)d05/4R

编写成员函数如下:

void CMy2_9View::MidPointEllipse(CDC *pDC, double a, double b, int color){ double x,y,d,xP,yP,squarea,squareb;

squarea=a*a;

squareb=b*b;

xP=(int)(0.5+(double)squarea/sqrt((double)(squarea+squareb)));

yP=(int)(0.5+(double)squareb/sqrt((double)(squarea+squareb)));

x=0;

y=b;

d=4*(squareb-squarea*b)+squarea;

pDC->SetPixel(x,y,color);

while(x<=xP)

{if(d<=0)d+=4*squareb*(2*x+3);

else

{d+=4*squareb*(2*x+3)-8*squarea*(y-1);

y--;}

x++;

pDC->SetPixel(x,y,color);}

x=a;

y=0;

d=4*(squarea-a*squareb)+squareb;

pDC->SetPixel(x,y,color);

while(y

{ if(d<=0)d+=4*squarea*(2*y+3);

else

{d+=4*squarea*(2*y+3)-8*squareb*(x-1);

x--;}

y++;

pDC->SetPixel(x,y,color);}} 编写OnDraw函数如下:

void CMy2_9View::OnDraw(CDC* pDC){CMy2_9Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);MidPointEllipse(pDC,500,300,RGB(0,0,0));}(2)中心点算法画椭圆

我们先考虑圆心在原点的椭圆的生成,对于中心不是原点的椭圆,可以通过坐标的平移变换获得相应位置的椭圆。中心在原点。焦点在坐标轴上的标准椭圆具有X轴对称、Y轴对称和原点对称特性,已知椭圆上第一象限的P点坐标是(x, y),则椭圆在另外三个象限的对称点分别是(x,-y)、(-x, y)和(-x,-y)。因此,只要画出第一象限的四分之一椭圆,就可以利用这三个对称性得到整个椭圆。

相应代码:

void MP_Ellipse(int xc , int yc , int a, int b){ double sqa = a * a;double sqb = b * b;double d = sqb + sqa *(-b + 0.25);int x = 0;int y = b;EllipsePlot(xc, yc, x, y);while(sqb *(x + 1)< sqa *(y1))* 2-(a * b)* 2;while(y > 0){if(d < 0){ d += sqb *(2 * x + 2)+ sqa *(-2 * y + 3);x++;} else

{d += sqa *(-2 * y + 3);} y--;EllipsePlot(xc, yc, x, y);}} 3.2 图形变换的基本原理

3.2.1平移变换

平移变换函数如下:

void glTranslate{fd}(TYPE x, TYPE y, TYPE z); 三个函数参数就是目标分别沿三个轴向平移的偏移量。这个函数表示用于这三个偏移量生成的矩阵乘以当前矩阵。当参数是(0.0,0.0,0.0)时,表示对函数glTranslate*()的操作是单位矩阵,也就是对物体没有影响。

3.2.2 旋转变换

旋转变换函数如下:

Void glRota{fd}TYPE angle, TYPE x, TYPE y, TYPE z);

函数中第一个参数是表示目标沿从点(x,y,z)到原点方向逆时针旋转的角度,后三个参数是旋转的方向点坐标。这个函数表示用这四个参数生成的矩阵乘以当前矩阵。当角度参数是0.0时,表示对物体没有影响。3.2.3 比例变换

比例变换函数如下:

Void glScale{fd}(TYPE x, TYPE y, TYPE z);

单个函数参数值就是目标分别沿三个轴方向缩放的比例因子。这个函数表示用这三个比例因子生成的矩阵乘以当前矩阵。这个函数能完成沿相应的轴对目标进行拉伸、压缩和反射三项功能。以参数x为例,若当x大于1.0时,表示沿x方向拉伸目标;若x小于1.0,表示沿x轴方向收缩目标;若x=-1.0表示沿x轴反射目标。其中参数为负值时表示对目标进行相应轴的反射变换。

四、总体设计与功能实现

4.1 主要界面设计

4.2 设置颜色界面

4.2.1 界面设置代码:

void CGraphicsView::OnClock(){ WHAT_TO_DO=ID_CLOCK;

clean();int xx = 450, yy = 300, r = 150,d = 5;int i, white = RGB(255,255,255);mile(xx, yy, r, COLOR);Matrix m(xx, 240), s(xx, 200);Matrix t1(xx, yy, true), t2(-xx,-yy, true), mr(PI/1800), sr(PI/30);mile(m.getx(), m.gety(), d+1, COLOR);mile(s.getx(), s.gety(), d, COLOR);dne(m.getx(), m.gety(), xx, yy, COLOR);dne(s.getx(), s.gety(), xx, yy, COLOR);

for(i=0;i<120;i++){

::Sleep(80);

mile(m.getx(), m.gety(), d+1, white);mile(s.getx(), s.gety(), d, white);dne(m.getx(), m.gety(), xx, yy, white);dne(s.getx(), s.gety(), xx, yy, white);m = t1*mr*t2*m;s = t1*sr*t2*s;mile(m.getx(), m.gety(), d+1, COLOR);mile(s.getx(), s.gety(),d, COLOR);dne(m.getx(), m.gety(), xx, yy, COLOR);dne(s.getx(), s.gety(), xx, yy, COLOR);}} 4.2.2 点击“设置--颜色”后,运行结果如下:

4.3 二维线画图元实现

4.3.1 实现代码:

void CGraphicsView::MidCir(CDC *pdc, int x0, int y0, int x1, int y1, int color){ int r,x,y,deltax,deltay,d;r=sqrt(((double)x1-(double)x0)*((double)x1-(double)x0)+((double)y1-(double)y0)*((double)y1-(double)y0));x=0;y=r;deltax=3;deltay=2-r-r;d=1-r;while(x<=y){ ::Sleep(time);

pdc->SetPixel(x+x0,y+y0,color);

::Sleep(time);

pdc->SetPixel(-x+x0,y+y0,color);

::Sleep(time);

pdc->SetPixel(x+x0,-y+y0,color);

::Sleep(time);

pdc->SetPixel(-x+x0,-y+y0,color);

::Sleep(time);

pdc->SetPixel(y+x0,x+y0,color);

::Sleep(time);

pdc->SetPixel(-y+x0,x+y0,color);

::Sleep(time);

pdc->SetPixel(y+x0,-x+y0,color);

::Sleep(time);

pdc->SetPixel(-y+x0,-x+y0,color);

if(d<0)

{ d+=deltax;

deltax+=2;

x++;}

else

{ d+=deltax+deltay;

deltax+=2;

deltay+=2;

x++;

y--;}}} void CGraphicsView::midellispse(int xx, int yy, int r1, int r2, int color){ } void CGraphicsView::Ellipse(CDC *pdc, int x1, int y1, int x2, int y2, int color){

xx0=(x2+x1)/2;yy0=(y2+y1)/2;rra=abs(x2-x1)/2;rrb=abs(y2-y1)/2;if(rra==0 && rrb==0)return;Ellipse0(pdc,xx0,yy0,rra,rrb,color);} void CGraphicsView::Ellipse0(CDC *pdc, int x0, int y0, int a, int b, int color){

int i,yy;int x,y,deltax,deltay;int aa,aa2,aa3,bb,bb2,bb3;double d1,d2;aa=a*a;aa2=aa*2;aa3=aa*3;bb=b*b;bb2=bb*2;bb3=bb*3;x=0;y=b;d1=bb+aa*(-b+0.25);deltax=bb3;deltay=-aa2*b+aa2;pdc->SetPixelV(x+x0,y+y0,color);pdc->SetPixelV(x+x0,-y+y0,color);while(bb*(x+1)

yy=y;

if(d1<0)

{ d1+=deltax;

deltax+=bb2;

x++;}

else

{

d1+=deltax+deltay;

deltax+=bb2;

deltay+=aa2;

x++;

y--;}

::Sleep(time);

pdc->SetPixelV(x+x0,y+y0,color);

::Sleep(time);

pdc->SetPixelV(-x+x0,y+y0,color);

::Sleep(time);

pdc->SetPixelV(x+x0,-y+y0,color);

::Sleep(time);

pdc->SetPixelV(-x+x0,-y+y0,color);} d2=bb*(x+0.5)*(x+0.5)+aa*(y-1)*(y-1)-aa*bb;deltax-=bb;deltay+=aa;while(y>0){ if(d2<0)

{ d2+=deltax+deltay;

deltax+=bb2;

deltay+=aa2;

x++;

y--;}

else

{ d2+=deltay;

deltay+=aa2;

y--;}

::Sleep(time);

pdc->SetPixelV(x+x0,y+y0,color);

::Sleep(time);

pdc->SetPixelV(-x+x0,y+y0,color);

::Sleep(time);

pdc->SetPixelV(x+x0,-y+y0,color);

::Sleep(time);

pdc->SetPixelV(-x+x0,-y+y0,color);}} void CGraphicsView::DDALine(CDC *pdc, int x0, int y0, int x1, int y1, int color){ int xx,yy,s,s1,s2,di;float dx,dy,k,x,y;dx=x1-x0;if(dx>=0)

s1=1;else

s1=-1;dy=y1-y0;if(dy>=0)

s2=1;else s2=-1;dx=abs(dx);dy=abs(dy);if(dx>=dy){

s=0;

di=(int)dx;

k=dy/dx*s2;} else { s=1;

di=(int)dy;

k=dx/dy*s1;} x=x0;y=y0;for(int i=0;i<=di;i++){if(s==0)

{

xx=(int)x;

yy=(int)(y+0.5);

::Sleep(time);

pdc->SetPixel(xx,yy,color);

x+=s1;

y+=k;}

else{

xx=(int)(x+0.5);

yy=(int)y;

::Sleep(time);

pdc->SetPixel(xx,yy,color);

y+=s2;

x+=k;}}} 4.3.2 点击二维线画图元,课相应画出直线、圆和椭圆,结果如下:

4.4 画多边形功能的实现

4.4.1 部分实现代码:

void CGraphicsView::OnDrawDuoBX(){ Vertex_Count dlg;if(dlg.DoModal()==IDOK){ if(dlg.m_vertex_count>MAX)

{ MessageBox(“输入顶点数过大”);

return;}

VertexTotal=dlg.m_vertex_count;

CDC *pDC=GetDC();

CPen pen(PS_SOLID,2,RGB(255,255,255));

CPen *pOldpen=pDC->SelectObject(&pen);

pDC->MoveTo((int)(inVertexArray[0].x+0.5),(int)(inVertexArray[0].y+0.5));

int i;

for(i=1;i

pDC->LineTo((int)(inVertexArray[i].x+0.5),(int)(inVertexArray[i].y+0.5));

pDC->LineTo((int)(inVertexArray[0].x+0.5),(int)(inVertexArray[0].y+0.5));

pDC->SelectObject(pOldpen);

ReleaseDC(pDC);

inLength=0;

outLength=0;

WHAT_TO_DO=ID_DrawDuoBX;}}

4.4.2 点击多边形,输入定点个数,可绘制出相应的多边形,结果如下:

4.5 画Bezier曲线功能的实现

4.5.1 部分实现代码:

void CGraphicsView::OnBezier(){ // TODO: Add your command handler code here WHAT_TO_DO=ID_BEZIER;CDC *p=GetDC();

p->TextOut(10, 20, “PS:鼠标左键添加曲线,鼠标右键修改曲线.”);

ReleaseDC(p);} void CGraphicsView::OnBezierClear(){ n =-1;RedrawWindow();} void CGraphicsView::DrawBezier(DPOINT *p){ if(n <= 0)return;if((p[n].x < p[0].x+1)&&(p[n].x > p[0].x-1)&&(p[n].y < p[0].y+1)&&(p[n].y > p[0].y-1)){ pDC->SetPixel(p[0].x, p[0].y, COLOR);

return;} DPOINT *p1;p1 = new DPOINT[n+1];int i, j;p1[0] = p[0];for(i=1;i<=n;i++){ for(j=0;j<=n-i;j++)

{ p[j].x =(p[j].x + p[j+1].x)/2;

p[j].y =(p[j].y + p[j+1].y)/2;}

p1[i] = p[0];} DrawBezier(p);DrawBezier(p1);delete p1;} void CGraphicsView::OnBezierAdd(){ AddorMove = 1;} void CGraphicsView::OnBezierMove(){ AddorMove =-1;} void CGraphicsView::OnMouseMove(UINT nFlags, CPoint point){ switch(WHAT_TO_DO){ case ID_BEZIER:

{ if(current >= 0){ points[current].x = point.x;

points[current].y = point.y;

RedrawWindow();} if(current2 >= 0)

{ points[current2].x = point.x;

points[current2].y = point.y;

RedrawWindow();}

break;} default:break;} CView::OnMouseMove(nFlags, point);} 4.5.2 点击曲线--Beizer曲线,可实现Beizer曲线的绘制功能,绘制结果如下图:

图 1 图 2

4.5.3 点击曲线--Beizer曲线,可实现Beizer曲线的移动,鼠标点击其中的任一点,可实现曲线的移动,绘制结果如下图:

上图1移动后的曲线

上图2移动后的曲线 4.6 二维图形变换的实现

可以实现一椭圆在界面上的随机移动,一圆在界面上饶某一点的旋转和一正方形由大变小在变大的变化,部分实现代码如下: void CGraphicsView::OnXuanzhuan(){ WHAT_TO_DO=ID_XUANZHUAN;

time=0;

OnClear();

CClientDC dc(this);CDC* pDC=&dc;

int i, white=RGB(255,255,255), point [2][2]={{300,200},{300,250}};

Matrix a(point[0][0],point[0][1]), b(point[1][0],point[1][1]);

int midx=(point[0][0]+point[1][0])/2,midy=(point[0][1]+point[1][1])/2;

Matrix t1(midx, midy,true), t2(-midx,-midy,true);

Matrix r(PI/50);

Matrix temp(midx, midy,true);

temp = t1*r*t2;

for(i=0;i<200;i++){

::Sleep(50);

MidCir(pDC, a.getx(), a.gety(), b.getx(), b.gety(), white);

a = temp*a;

b = temp*b;

MidCir(pDC, a.getx(), a.gety(), b.getx(), b.gety(), COLOR);}

for(i=0;i<200;i++){

::Sleep(50);

MidCir(pDC,a.getx(), a.gety(), b.getx(), b.gety(), white);

a = temp*a;

b = temp*b;

MidCir(pDC, a.getx(), a.gety(), b.getx(), b.gety(), COLOR);}

time=5;} void CGraphicsView::OnUpdateXuanzhuan(CCmdUI* pCmdUI){ pCmdUI->SetCheck(WHAT_TO_DO==ID_XUANZHUAN);} void CGraphicsView::OnScale(){ WHAT_TO_DO=ID_SCALE;

OnClear();CClientDC dc(this);CDC* pDC=&dc;

time=0;int i,white=RGB(255,255,255), point[4][2]={{300,250},{400,250},{300,300},{400,300}};float sx=0.9,sy=0.85;int midx=(point[0][0]+point[3][0])/2,midy=(point[0][1]+point[3][1])/2;Matrix s1(sx,sy),s2(1/sx,1/sy);Matrix t1(midx, midy,true), t2(-midx,-midy,true);

Matrix a(point[0][0],point[0][1]), b(point[1][0],point[1][1]);Matrix c(point[2][0],point[2][1]), d(point[3][0],point[3][1]);Matrix temp(midx, midy,true);temp = t1*s1*t2;DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),COLOR);DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),COLOR);DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),COLOR);DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),COLOR);for(i=0;i<20;i++){

::Sleep(30);

DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),white);

DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),white);

DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),white);

DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),white);

a=temp*a;

b=temp*b;

c=temp*c;

d=temp*d;

DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),COLOR);

DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),COLOR);

DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),COLOR);

DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),COLOR);} temp = t1*s2*t2;for(i=0;i<20;i++){

::Sleep(30);

DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),white);

DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),white);

DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),white);

DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),white);

a=temp*a;

b=temp*b;

c=temp*c;

d=temp*d;

DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),COLOR);

DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),COLOR);

DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),COLOR);

DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),COLOR);} time=5;} void CGraphicsView::OnUpdateScale(CCmdUI* pCmdUI){ pCmdUI->SetCheck(WHAT_TO_DO==ID_SCALE);} 4.7 三维图形的变换

主要实现三维图形的上下左右平移,分别绕X轴Y轴Z轴的旋转,放大和缩小,以及正方体六个面的颜色变换,除此之外,还可以选择背景颜色的改变 4.7.1 部分代码如下:

void CGraphicsView::OnAoduomianti(){ WHAT_TO_DO=ID_AODUOMIANTI;CDrawDLG dlg1;dlg1.DoModal();} void CGraphicsView::OnUpdateAoduomianti(CCmdUI* pCmdUI){ pCmdUI->SetCheck(WHAT_TO_DO==ID_AODUOMIANTI);} void CDrawDLG::OnPaint()

{ CPaintDC dc(this);// device context for painting CWnd *pWnd=GetDlgItem(IDC_DRAW);pWnd->UpdateWindow();// CDC *PDC=pWnd->GetDC();Draw();} void CDrawDLG::Draw(){ CWnd *pWnd=GetDlgItem(IDC_DRAW);pWnd->UpdateWindow();CDC *pDC=pWnd->GetDC();CRect rect;pWnd->GetClientRect(rect);D v[8]={ {-fs,-fs,fs},{-fs,fs,fs},{fs,fs,fs},{fs,-fs,fs},{-fs,-fs,-fs},{-fs,fs,-fs},{fs,fs,-fs},{fs,-fs,-fs} },d[8];

POINT p0[4],p1[4],p2[4],p3[4],p4[4],p5[4],w[8];int z[8];

for(int i=0;i<8;i++){ d[i].x=v[i].x;

d[i].y=(int)(v[i].y*cos(a*DU)-v[i].z*sin(a*DU));

d[i].z=(int)(v[i].y*sin(a*DU)+v[i].z*cos(a*DU));

v[i].x=(int)(d[i].x*cos(b*DU)+d[i].z*sin(b*DU));

v[i].y=d[i].y;

v[i].z=(int)(d[i].z*cos(b*DU)-d[i].x*sin(b*DU));

d[i].x=(int)(v[i].x*cos(c*DU)-v[i].y*sin(c*DU));

d[i].y=(int)(v[i].x*sin(c*DU)+v[i].y*cos(c*DU));

d[i].z=v[i].z;

w[i].x=d[i].x+cx;

w[i].y=d[i].y+cy;

z[i]=d[i].z;} p0[0]=w[0];p0[1]=w[1];p0[2]=w[2];p0[3]=w[3];p1[0]=w[4];p1[1]=w[5];p1[2]=w[6];p1[3]=w[7];

p2[0]=w[0];p2[1]=w[1];p2[2]=w[5];p2[3]=w[4];p3[0]=w[1];p3[1]=w[2];p3[2]=w[6];p3[3]=w[5];p4[0]=w[2];p4[1]=w[3];p4[2]=w[7];p4[3]=w[6];p5[0]=w[0];p5[1]=w[3];p5[2]=w[7];p5[3]=w[4];switch(Maxnum(z,7)){ case 0:fill(p0,p2,p5,0,2,5);break;

case 1:fill(p0,p2,p3,0,2,3);break;

case 2:fill(p0,p3,p4,0,3,4);break;

case 3:fill(p0,p4,p5,0,4,5);break;

case 4:fill(p1,p2,p5,1,2,5);break;

case 5:fill(p1,p2,p3,1,2,3);break;

case 6:fill(p1,p3,p4,1,3,4);break;

case 7:fill(p1,p4,p5,1,4,5);break;}} BOOL CDrawDLG::OnInitDialog(){ CDialog::OnInitDialog();m_scroll1.SetScrollRange(-180,180);m_scroll1.SetScrollPos(0);m_scroll2.SetScrollRange(-180,180);m_scroll2.SetScrollPos(0);m_scroll3.SetScrollRange(-180,180);m_scroll3.SetScrollPos(0);m_scroll4.SetScrollRange(0,350);m_scroll4.SetScrollPos(200);m_scroll5.SetScrollRange(0,300);m_scroll5.SetScrollPos(115);m_scroll6.SetScrollRange(0.00,300.00);m_scroll6.SetScrollPos(50.00);a=b=c=0;fs=50.00;SetTimer(1,100,NULL);Ctrl=0;cx=200;cy=115;COLOR1=RGB(123,234,43);COLOR2=RGB(123,123,0);COLOR3=RGB(123,24,235);COLOR4=RGB(0,123,95);COLOR5=RGB(23,234,34);COLOR6=RGB(234,124,0);COLOR7=RGB(0,43,98);return TRUE;// return TRUE unless you set the focus to a control} void CDrawDLG::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar){ int nID=pScrollBar->GetDlgCtrlID();switch(nID){ case IDC_SCROLLBAR1: a=pScrollBar->GetScrollPos();

switch(nSBCode)

{ case SB_LINELEFT: a--;break;

case SB_LINERIGHT: a++;break;

case SB_PAGELEFT: a-=10;break;

case SB_PAGERIGHT: a+=10;break;

case SB_THUMBTRACK: a=nPos;break;}

if(a<-180)a=180;

if(a>180)a=-180;

pScrollBar->SetScrollPos(a);

break;case IDC_SCROLLBAR2: b=pScrollBar->GetScrollPos();

switch(nSBCode)

{ case SB_LINELEFT: b--;break;

case SB_LINERIGHT: b++;break;

case SB_PAGELEFT: b-=10;break;

case SB_PAGERIGHT: b+=10;break;

case SB_THUMBTRACK: b=nPos;break;}

if(b<-180)b=180;

if(b>180)b=-180;

pScrollBar->SetScrollPos(b);

break;case IDC_SCROLLBAR3: c=pScrollBar->GetScrollPos();

switch(nSBCode)

{ case SB_LINELEFT: c--;break;

case SB_LINERIGHT: c++;break;

case SB_PAGELEFT: c-=10;break;

case SB_PAGERIGHT: c+=10;break;

case SB_THUMBTRACK: c=nPos;break;}

if(c<-180)c=180;

if(c>180)c=-180;

pScrollBar->SetScrollPos(c);

break;case IDC_SCROLLBAR4: cx=pScrollBar->GetScrollPos();

switch(nSBCode)

{ case SB_LINELEFT: cx--;break;

case SB_LINERIGHT: cx++;break;

case SB_PAGELEFT: cx-=10;break;

case SB_PAGERIGHT: cx+=10;break;

case SB_THUMBTRACK: cx=nPos;break;}

if(cx<0)cx=200;

if(cx>350)cx=200;

pScrollBar->SetScrollPos(cx);

break;case IDC_SCROLLBAR5: cy=pScrollBar->GetScrollPos();

switch(nSBCode)

{ case SB_LINELEFT: cy--;break;

case SB_LINERIGHT: cy++;break;

case SB_PAGELEFT: cy-=10;break;

case SB_PAGERIGHT: cy+=10;break;

case SB_THUMBTRACK: cy=nPos;break;}

if(cy<0)cy=300;

if(cy>300)cy=0;

pScrollBar->SetScrollPos(cy);

break;

case IDC_SCROLLBAR6: fs=pScrollBar->GetScrollPos();

switch(nSBCode)

{ case SB_LINELEFT: fs--;break;

case SB_LINERIGHT: fs++;break;

case SB_PAGELEFT: fs-=0.55;break;

case SB_PAGERIGHT: fs+=0.55;break;

case SB_THUMBTRACK: fs=nPos;break;}

if(fs<0)fs=50;

if(fs>300)fs=50;

pScrollBar->SetScrollPos(fs);

break;// UpdateData(FALSE);} // Invalidate();Draw();CDialog::OnHScroll(nSBCode, nPos, pScrollBar);} void CDrawDLG::OnOK(){ KillTimer(1);

CDialog::OnOK();} int CDrawDLG::Maxnum(int *p, int n){ int max=p[0];int x;for(int i=0;i<=n;i++){

if(max<=p[i])

{ max=p[i];x=i;} } return x;} void CDrawDLG::fill(POINT *x, POINT *y, POINT *z, int i,int j,int q){ CWnd *pWnd=GetDlgItem(IDC_DRAW);pWnd->UpdateWindow();CDC *pDC=pWnd->GetDC();CRect rect;pWnd->GetClientRect(rect);

CDC dcmem;dcmem.CreateCompatibleDC(pDC);CBitmap bmp,*oldbmp;bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());oldbmp=dcmem.SelectObject(&bmp);CBrush brush[6];brush[0].CreateSolidBrush(COLOR1);brush[1].CreateSolidBrush(COLOR2);brush[2].CreateSolidBrush(COLOR3);brush[3].CreateSolidBrush(COLOR4);brush[4].CreateSolidBrush(COLOR5);brush[5].CreateSolidBrush(COLOR6);CBrush *oldbrush=dcmem.SelectObject(&brush[i]);dcmem.FillSolidRect(rect,COLOR7);dcmem.Polygon(x,4);dcmem.SelectObject(&brush[j]);dcmem.Polygon(y,4);dcmem.SelectObject(&brush[q]);dcmem.Polygon(z,4);dcmem.SelectObject(oldbrush);for(int b=0;b<6;b++)brush[b].DeleteObject();pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(), &dcmem,0,0,SRCCOPY);dcmem.SelectObject(oldbmp);bmp.DeleteObject();dcmem.DeleteDC();} 4.7.2 运行结果如下:

(1)实现多面体的上下左右平移(2)实现多面体的绕轴旋转:

(3)实现多面体的放大缩小:

(4)实现多面体及背景的颜色设置:

(5)三维图形变换整体图形

五、实验心得体会

在本次课程设计过程中,基本掌握了计算机图形学关于图形绘制变换的基础知识,DDA法画直线和中心点法画圆及椭圆的方法,还对图形的变换及需要用到的一系列的函数有了相应的理解,也了解的很多有关于图形学中三维图形的变换的知识。不过都只是皮毛而已,从中锻炼了自己的动手做实验的能力,但同时也让自己看清了自己的水平,以便在以后的生活里多加强有关这方面的学习,从而提升自己在图形学方面的知识水平。

在本次课程设计中,设计方案存在着很多的死板化的实现方法,也是很不人性化的一点,只提供了画一种曲线的方法,且画出的曲线只能移动,此为本次设计方案的不足之一;然后就是能实现曲面和多边形的绘制,却没有对应的实现绘制好图形后直接对其进行平移、选择等变换,此为设计方案不足之二。再者就是三维图形只能实现变换不能实现绘制,此为设计方案不足之三。鉴于个人能力真的有限,所以只能设计出此种级别的效果了。因为实验重要的只是思想过程,效果的不美观只能是因为学习的知识还远远不够,所以不能设计出完美的全面的图形绘制变换程序。

经过此次设计,使我学到了很多东西,在没有开始做程序之前,没有任何思路,不知道该从哪里入手,可能是因为自己平时不认真听课的缘故。后来经过上网查询资料,翻阅参考书,在别人做的程序的启发下,才有了做此程序设计的眉目。在设计过程中遇到了很多的问题,在这里需要感谢王征风老师的帮助和指导,以及同学的帮助,最后一个个问题都被解决了,写出了完整的程序设计。最后也发现,其实只要努力,写出一个设计不是很困难,重要的是自己在写程序的过程中,要会学习,会查阅资料。这次的课程设计让我学习到了很多,以后我会努力提高自己在图形学方面的知识水平。

计算机图形学课程设计 篇2

在教学中普遍采用的PPT课件以文字结合图片、视频和非交互式动画的形式完成教学资源的展示, 在3D交互展示方面有着固有缺陷, 同时其传统二维形式缺乏足够的吸引力。计算机图形学作为计算机科学最为活跃的一个分支[1], 推动了游戏、影视制作、广告、计算机辅助设计等诸多行业的快速发展, 也影响到与教学密切相关的课件制作。近年来, 国内开始了三维课件制作方面新的尝试, 例如林浩[2]基于X3D开发交互式三维课件, 陈军和蔡金玲[3]基于Unity3D制作《摄影技术》课程的三维多媒体课件, 邝海等[4]基于立体视觉原理搭建3D多媒体教室并使用Microsoft Power Point 2007制作3D PPT课件。然而, 由于三维课件的开发难度大, 在教学中的应用并未普及, 应用于《计算机图形学》课程的教学更未曾见。

《计算机图形学》是计算机学科的核心课程之一, 在很多应用型本科院校中也有开设。传统的图形学教学内容偏理论化, 着重介绍理论和底层算法, 对数学基础要求高, 内容枯燥, 不适合数学基础薄弱的应用型本科院校学生, 也不能够引发学生的兴趣。因此, 近几年我校推行了《计算机图形学》课程的一系列改革[5,6], 包括:以突出应用实践能力培养为目标, 对课程教学内容进行优化调整;引入新版Open GL, 将图形学基本知识的传授和API应用编程结合起来;在实验教学方面, 结合专业实际, 设置多层次、个性化的实验内容;搭建网络课程等等。这些举措有效提升了教学效果, 然而发现, 针对3D图形学中的一些知识和方法, 利用现有的PPT加板书与口头讲解相结合的方式, 很难给学生以形象直观的认识, 将3D内容进行3D交互展示是最佳的解决方案;另一方面, 将三维图形技术应用于《计算机图形学》课程教学本身, 是非常有意义的一个工作, 因此开始了交互式三维课件的开发工作。

2. 交互式三维课件开发与应用

交互式三维课件采用Unity3D进行开发, 开发的总体思路是:将文字、图片、演示动画、示例程序进行有机地整合, 并以3D形式呈现, 同时允许用户在课件中进行多样化的控制。下面对三维课件的基本功能进行介绍, 并以常用坐标系和实例化变换讲解为例, 讲述该课件在课堂教学中的应用。

2.1 交互式三维课件基本功能简介

交互式三维课件实现了PPT课件的所有基本功能, 例如文字和图片展示、跳转到指定页面、通过鼠标或键盘进行课件播放、文字动画等等, 但是以更炫酷的3D方式呈现, 图1给出了课件的基本界面示例。我们为每一章节设置了统一的主题, 例如图1 (a) - (c) 中的太空主题, 背景是一个动态的3D太空场景, 并添加了粒子效果;所有的文字是绘制在三维面板上的, 面板会随着用户鼠标位置的改变而发生相应方向上的轻微倾斜;通过主界面可进入缩略图界面 (如图1 (b) 所示) , 利用缩略图功能可直接跳转到指定页面;在内容页面, 除了传统的PPT功能, 可将演示动画和示例程序直接集成进课件中, 例如:在图1 (c) 所显示的页面中, 在点击“演示”按钮后, 左右两个窗口即开始分别播放第三人称视角和照相机视角下的照相机移动动画;而在图1 (d) 的页面中, 可利用鼠标和键盘交互式地控制投影矩阵的推导过程, 窗口中所配的3D示意图可通过按钮调整不同的视角。

2.2 常用坐标系讲解

图形流水线是贯穿计算机图形学课程内容的核心, 其中固定功能流水线中所涉及的6个坐标系的讲解是一个重点和难点。以往采用的是PPT文字配口头举例讲解的方式, 即使例子再好, 学生不能直接看到, 只能凭想象, 很不直观。而在采用了交互式三维课件后, 以一个游戏场景的绘制为例, 可以将这6个坐标系以及坐标系之间的转换以动态可交互控制的方式直接呈现给学生:

对象坐标系或建模坐标系:在点击按钮后, 出现游戏场景中所用到的一个石柱的模型, 此时所显示的坐标系即为对象坐标系 (如图2 (a) 所示) ) , 是美工以方便建模为目的而设置的一个坐标系;

世界坐标系:点击按钮后, 切换到游戏场景画面, 其中显示了世界坐标系和对象坐标系, 在未应用任何实例化变换前, 这两个坐标系重合, 此时可通过键盘和鼠标控制模型进行缩放、旋转和平移等实例化变换, 以确定石柱的大小、朝向和位置, 在画面中可直接看到效果;

眼坐标系或照相机坐标系:在完成场景的搭建后, 开始确定相机位置, 此时可控制眼坐标系的位置和朝向, 也可以在第一人称视角和第三人称之间切换, 在画面中还可看到相机的可视范围, 如图2 (b) 所示;

其他3个坐标系:在点击相应的按钮后, 可看到相应的静态示意图, 例如窗口坐标系的展示即是最终的绘制结果———一幅二维的游戏场景图像, 只不过在其上标注了窗口坐标系。

在授课时虽然同样是以课件加口头讲解的方式, 但由于采用了更加形象直观的交互式三维课件, 授课效果截然不同。

2.3 实例化变换讲解

变换也是3D图形学中的一个重点和难点内容, 实例化变换则是在用模型搭建三维场景时所不可或缺的, 而学生往往难以准确把握变换的次序。我们在三维课件中集成了一个交互演示程序, 如图3所示。其中给出了三维模型及其坐标系, 过坐标系原点的细线是旋转变换的旋转轴, 用户可通过鼠标右键自由调整视角;左下角是实例化变换通常所用到的平移、旋转、缩放三个变换, 用户可通过鼠标点击变换名称来切换变换的次序, 也可点击相应变换参数上下拖动来调整变换的参数;在调整好参数后, 可以点击按钮来播放变换动画, 点击“模型更换”可在多个内置模型间切换。使用此演示程序, 一方面可直观地展示变换的过程, 为何实例化变换通常采用先缩放再旋转最后平移的顺序, 通过展示一目了然;另一方面学生也可在课后完成实例化变换方面练习时利用此课件验证结果。

3. 结语

本文重点论述了交互式三维课件在计算机图形学课程中的应用。通过采用交互式三维课件, 可将文字、图片、演示动画、示例程序进行有机地整合, 实现3D计算机图形学中一些重点和难点内容的直观交互演示, 且提高了对学生的吸引力, 从而进一步提升了教学效果。

参考文献

[1]孙家广, 胡事民.计算机图形学基础教程[M].第2版.北京:清华大学出版社, 2009.

[2]林浩.基于X3D的交互式三维课件设计[J].中国科技信息, 2005, (24) :190.

[3]陈军, 蔡金玲.基于Unity3D三维多媒体课件的设计与制作[J].现代计算机 (专业版) , 2014, (34) :64-67.

[4]邝海, 玉琨, 吕玮, 等.3D创新思维视域下PPT立体课件设计探索与实践[J].大众科技, 2016, 18 (197) :106-108.

[5]邹昆, 徐翔, 杨亮.面向应用能力培养的计算机图形学课程教学改革[C].第二届高等教育理工类教学研讨会, 泰安, 2012:906-909.

计算机图形学课程设计 篇3

本文围绕高职高专教育培养目标,从图形图像制作专业教学的现状出发, 结合教学实践和教学思考,提出了关于有利于图形图像制作专业教育教学的一些建议。

关键词:教学内容研究 教學方法 讲练结合教学法实践教学法 启发引导教学法 谈论式教学法 思维训练 考核方法

一、引言

“计算机图形设计基础”是图形图像制作专业的一门专业基础课。该课程注重培养学生利用计算机制作图形的基本技能和图形设计的制作能力,并着重培养学生进行标准化图形设计制作的操作能力、创新的设计思维方式、自主学习能力和应用能力的培养和训练,为后续平面设计实训课程的制作奠定基础。

二、课程教学内容体系构建的研究

1、理论内容体系的构建

1)理论内容包括平面构成、色彩构成、字体设计、图形创意设计、广告设计、版式设计、包装设计、VIS企业视觉形象识别设计内容。制作方法与创新理论类内容各占一定比例,使学生能够在较宽的课程面上构建知识结构。

2)课程各部分内容设置目的明确,主次分明,课程内容之间联系紧密,可归纳为:计算机图形设计基础的造型基础部分、构成部分、图形创意思维设计部分、广告排版部分,包装部分、综合表现部分,六位一体,内容互相联系支撑,构成了一个有机整体,充分体现计算机图形设计基础课程的综合性、多学科交叉性和融合性特征。

2、实践内容体系的构建

实践教学体系以培养学生创新精神、创新实践能力和综合素质培养为目标,设置了形式多样的、目的明确的实践教学类型,总体上由课内实践、集中实践、课外实践构成。实践教学时数占总教学时数的52%,有目的、有次序、分阶段、分层次地进行培养。

1)掌握造型的基本原理、形态空间、结构素描等基本知识,实践完成设计素描一系列手绘作品成果。

2)学习掌握平面构成、色彩构成的基本内容设计制作规律,实践完成构成设计部分设计制作并提交作品成果。

3)掌握字体笔画、结构、编排、内容、字体组合设计,实践完成字体设计在平面设计中运用的成果。掌握图形创意设计概论、图形创意思维联想、图形创意视觉表现,实践完成图形创意设计在平面设计中运用的成果;

4)运用图象、文字、色彩、版面、图形等表达广告的元素和版式设计内容,完成实践成果。

5)掌握产品包装设计的基本构成要素;掌握书籍的护封设计、书籍内页字体与版面的编排完成实践成果。

6)理解企业视觉形象识别设计的基本概念及其设计的基本性质与特点、熟悉VIS设计的程序;运用综合的学习方法和技巧,实践完成具有独特、新颖、别致的VI系统设计手册。

3、课程教学学时分配的分布:总学时:104学时;理论学时50学时;实践学时:54学时,

第一部分设计素描内容,理论14学时、实践14学时;

第二部分构成设计内容,理论6学时、实践8学时;

第三部分字体设计内容,理论4学时、实践2学时;

图形创意设计内容,理论4学时、实践4学时;

第四部分广告设计内容,理论4学时、实践2学时;

版式设计内容,理论4学时、实践4学时;

第五部分包装设计内容,理论10学时;实践10学时;

第六部分VIS企业视觉形象识别设计内容,理论4学时;实践10学时。

三、课程教学方法与手段的研究

结合课程实际,采用多种教学方法和手段完成教学实施过程。

1)讲练结合教学法

讲练结合是传统的教学方法。先以教师讲授理论知道为前提,让学生了解掌握其知识;然后在通过实践表现的方法实现对知识的掌握和理解;最后,教师根据不同学生的掌握情况,在对其内容的重点和难点再次进行辅导和讲授,从而达到很好教学效果。

2)启发引导教学法

对设计基础知识的学习,采用启发引导教学法,在课堂上只是教师单方面的去讲授知道还不够,不能让知识去摆在那儿,而是让知识内容去牵引学生的思维,吸引学生主动的去理解、去思考问题;让知识点渗透在学生的大脑里,这个从每位学生回答出来的问题的过程,也就能体现学生的思维设计过程。是有助于使学生变被动学习为主动学习,培养学生的自主创新学习能力。

3)案例分析教学法

在本课程的内容里,案例设计是非常重要的,因为在讲授过程中,大多数都是通过案例来去发现问题、分析问题和解决问题的。有利于教师对课程内容知识的讲授;有利于培养学生对专业知识的学习。

4)谈论式教学法

谈论式教学法,是教师提出问题,师生互动,共同找到解决问题的方法。

5)任务驱动教学法

任务驱动教学法是学生在教师指导下,围绕一个共同任务为活动中心,在问题动机驱动下,通过对学习资源的积极主动应用,进行自主探索和互动协作的学习;并在完成既定任务的同时,引导学生产生一种学习实践活动。

四、课程考核方法的研究

本课程是专业必修考查课,注重平时考核与阶段性的成果考核方式。

平时考核包括平时出勤和课堂表现情况;出于高职高专学生上课的特点,出勤是保证上课学习效果的一种方法所以在出勤占的比例效多,一方面培养学生学习的态度,把被动学习养成习惯变成主动学习;一方面提高学生学习质量,只有量的积累才有质的飞跃。

阶段性的成果考核包括按要求提每次课程内容提交一次与案例相关的作业成果。

五、结语

计算机图形设计基础课程,通过在教学内容、教学方法、教学模式和考核等方面进行全面系统的研究。达到以就业为目的的教学方法,培养学生利用计算机制作图形的基本技能和具有创新思维设计的能力,为后续课程奠定基础。为社会培养技能型的设计制作人才。

参考文献:

[1]何成战.高校艺术设计课程中计算机图形教学初探[J].柳州职业技术学院报,2002.12

[2]王亚非,韩晓曼著.设计师掌中宝--平面设计实用手册[M].辽宁美术出版社,2009.6

计算机图形学实验报告 篇4

一、实验目的

1、掌握有序边表算法填充多边形区域;

2、理解多边形填充算法的意义;

3、增强C语言编程能力。

二、算法原理介绍

根据多边形内部点的连续性知:一条扫描线与多边形的交点中,入点和出点之间所有点都是多边形的内部点。所以,对所有的扫描线填充入点到出点之间所有的点就可填充多边形。

判断扫描线上的点是否在多边形之内,对于一条扫描线,多边形的扫描转换过程可以分为四个步骤:

(1)求交:计算扫描线与多边形各边的交点;(2)排序:把所有交点按x值递增顺序排序;

(3)配对:第一个与第二个,第三个与第四个等等;每对交点代表扫描线与多边 形的一个相交区间;(4)着色:把相交区间内的象素置成多边形颜色,把相交区间外的象素置成背景色。

p1,p3,p4,p5属于局部极值点,要把他们两次存入交点表中。如扫描线y=7上的交点中,有交点(2,7,13),按常规方法填充不正确,而要把顶点(7,7)两次存入交点表中(2,7,7,13)。p2,p6为非极值点,则不用如上处理。

为了提高效率,在处理一条扫描线时,仅对与它相交的多边形的边进行求交运算。把与当前扫描线相交的边称为活性边,并把它们按与扫描线交点x坐标递增的顺序存放在一个链表中,称此链表为活性边表(AET)。

对每一条扫描线都建立一个与它相交的多边形的活性边表(AET)。每个AET的一个节点代表一条活性边,它包含三项内容

1.x-当前扫描线与这条边交点的x坐标;

2.Δx-该边与当前扫描线交点到下一条扫描线交点的x增量; 3.ymax-该边最高顶点相交的扫描线号。

每条扫描线的活性边表中的活性边节点按照各活性边与扫描线交点的x值递增排序连接在一起。

当扫描线y移动到下一条扫描线y = y+1时,活性边表需要更新,即删去不与新扫

描线相交的多边形边,同时增加与新扫描线相交的多边形边,并根据增量法重新计算扫描线与各边的交点x。

当多边形新边表ET构成后,按下列步骤进行:

① 对每一条扫描线i,初始化ET表的表头指针ET[i]; ② 将ymax = i的边放入ET[i]中;

③ 使y =多边形最低的扫描线号; ④ 初始化活性边表AET为空; ⑤ 循环,直到AET和ET为空。

 将新边表ET中对应y值的新边节点插入到AET表。 遍历AET表,将两两配对的交点之间填充给定颜色值。

 遍历AET表,将 ymax= y的边节点从AET表中删除,并将ymax> y的各边节点的x值递增Δx;并重新排序。 y增加1。

三、程序源代码

#include “graphics.h” #define WINDOW_HEIGHT 480 #define NULL 0 #include “alloc.h” #include “stdio.h” #include “dos.h” #include “conio.h” typedef struct tEdge /*typedef是将结构定义成数据类型*/ { int ymax;/* 边所交的最高扫描线号 */ float x;/*当前扫描线与边的交点的x值 */ float dx;/*从当前扫描线到下一条扫描线之间的x增量*/ struct tEdge *next;}Edge;

typedef struct point{int x,y;}POINT;/*将结点插入边表的主体函数*/

void InsertEdge(Edge *list,Edge *edge)/*活性边edge插入活性边表list中*/ { Edge *p,*q=list;p=q->next;/*记住q原来所指之结点*/ while(p!=NULL)/*按x值非递减顺序增加边表*/ {

if(edge->x

x)/*要插入的边的x较大不应该在当前插入*/

p=NULL;

else /*要插入的边的x较小应该在当前插入*/

{q=p;

p=p->next;

} } edge->next=q->next;/*使欲插入之结点edge指向q原来所指之结点*/ q->next=edge;/*使q指向插入之结点*/ }

int yNext(int k,int cnt,POINT *pts)/*对于多边形中的某个顶点序号k(0,1...6),返回下一顶点的纵坐标,如果这2个顶点所在边是 水平的,则顺延,即返回第(k+2)个顶点的纵坐标),cnt是顶点个数+1,pts指向多边形顶点结构体的指针*/

{ int j;if((k+1)>(cnt-1))/*当前顶点为最后一个顶点,则下一个顶点为第0个顶点 */

j=0;else

j=k+1;/*当前顶点不是最后一个顶点,下一个顶点为数组下标加一*/ while(pts[k].y==pts[j].y)/*扫描线扫过平行顶点,需分情况找到当前顶点下下个顶点*/ if((j+1)>(cnt-1))

j=0;

else

j++;return(pts[j].y);/*返回下一个顶点的y值 */ }

/* 计算增量,修改AET*/ /*生成边表结点,并插入到边表中的主体函数*/ void MakeEdgeRec(POINT lower,POINT upper,int yComp,Edge *edge,Edge *edges[])/*把边结点edge,放到lower.y扫描线所在的边结点指针数组edges[]中 */ {edge->dx=(float)(upper.x-lower.x)/(upper.y-lower.y);edge->x=lower.x;if(upper.yymax=upper.y-1;/*缩短上层顶点*/ /*奇点,应该把这点当作两个点而分开,所以把y的最大值减一,向下移动*/ else edge->ymax=upper.y;/*不是奇点,不需改变y值 */ insertEdge(edges[lower.y],edge);/*插入一个边缘扫描线,插入到列表 */ }

/*创建边表的主体函数*/ void BuildEdgeList(int cnt,POINT *pts,Edge *edges[])/*建立新边表,cnt:多边形顶点个数+1,edges[]:指向活性边结点的指针数组*/ { Edge *edge;POINT v1,v2;int i,yPrev=pts[cnt-2].y;/*当前顶点的前一个顶点的y值,在当前顶点不是奇点时使用该参数*/ v1.x=pts[cnt-1].x;v1.y=pts[cnt-1].y;for(i=0;i

edge=(Edge *)malloc(sizeof(Edge));

edge=(Edge*)malloc(sizeof(Edge));if(v1.y

yNext*/ MakeEdgeRec(v1,v2,yNext(i,cnt,pts),edge,edges);/*确定v1,v2边较高端点的开闭*/

else

MakeEdgeRec(v2,v1,yPrev,edge,edges);/*当前顶点

是奇点*/ } yPrev=v1.y;v1=v2;} }

/*建立活性边表的主体函数:建立第scan条扫描线的活性边表*/ void BuildActiveList(int scan,Edge *active,Edge *edges[])/*建立扫描线scan的活性边表,把活性边结点放入扫描线scan的结点指针数组 edges[scan]中*/ { Edge *p,*q;p=edges[scan]->next;/*查找当前扫描线对应的y桶*/ while(p)/*y桶不空*/

{q=p->next;/*找到最后一个边结点,插入*/

InsertEdge(active,p);/*把更新后的边表重新插入边表中保存*/

p=q;

} }

/*填充一对交点的主体函数*/ void FillScan(int scan,Edge *active,int color)/*填充扫描线:填充扫描线上,且在下一结点到再下一结点之间的点*/ { Edge *p1,*p2;int i;p1=active->next;while(p1){

p2=p1->next;

for(i=p1->x;i

x;i++)

putpixel((int)i,scan,color);/*画出图形内部的点*/ p1=p2->next;/*活性表的下一条边表 */ } }

void DeleteAfter(Edge *q)/*删除链表中结点,删除边结点q的后续结点p*/ { Edge *p=q->next;q->next=p->next;/*删除结点*/ free(p);} /* 删除 y=ymax 的边 */

/*填充完后,更新活动边表的主体函数*/ void UpdateActiveList(int scan,Edge *active)/*删除扫描线scan完成交点计算的活性边,同时更新交点x域*/ { Edge *q=active,*p=active->next;while(p)if(scan>=p->ymax)/*扫描线超过边的最大y值,此条边的节点应该删掉*/ { p=p->next;deleteAfter(q);} else /*扫描线未超过边的最大y值,相应的x值增加*/ { p->x=p->x+p->dx;q=p;p=p->next;} }

/*对活性边表结点重新排序的主体函数*/ void ResortActiveList(Edge *active)/*活性边表active中的结点按x域从小到大重新排序*/ { Edge *q,*p=active->next;active->next=NULL;while(p){q=p->next;InsertEdge(active,p);/*把更新后的边表重新插入边表中保存 */ p=q;} }

/*多边形填充的主体程序*/ void ScanFill(int cnt,POINT *pts,int color)/*填充函数,输入:多边形顶点个数+1=cnt, 指向多边形顶点的指针数组pts*/

{ Edge *edges[WINDOW_HEIGHT],*active;int i,scan,scanmax=0,scanmin=WINDOW_HEIGHT;for(i=0;i

{if(scanmax

if(scanmin>pts[i].y)scanmin=pts[i].y;

} for(scan=scanmin;scan<=scanmax;scan++)/*初始化每条扫面线的边链表*/ {edges[scan]=(Edge *)malloc(sizeof(Edge));/*建

edges[scan]->next=NULL;

} BuildEdgeList(cnt,pts,edges);/*建立有序边表*/ active=(Edge *)malloc(sizeof(Edge));“桶”*/ active->next=NULL;for(scan=scanmin;scan<=scanmax;scan++)/*扫描每条扫描线,求活性表*/ {

BuildActiveList(scan,active,edges);/*建立活性边表*/

if(active->next)/*活性边表不为空*/

{ FillScan(scan,active,color);/*填充当前扫描线*/ UpdateActiveList(scan,active);/*更新活化边表*/ ResortActiveList(active);/*重排活化边表*/

} } }

/*开始菜单*/ void main(){ POINT pts[7];/*保存数组*/ int gdrive=DETECT,gmode;pts[0].x=100;pts[0].y=40;/*多边形顶点x、y坐标*/ pts[1].x=220;pts[1].y=140;pts[2].x=280;pts[2].y=80;pts[3].x=350;pts[3].y=300;pts[4].x=200;pts[4].y=380;pts[5].x=50;pts[5].y=280;pts[6].x=100;pts[6].y=40;/*合并桶中的新边,按次序插入到 AET 中*/ initgraph(&gdrive,&gmode,“C:TC3.0BGI”);/*设置graphic模式*/ ScanFill(7,pts,2);getch();}

四、实验结果

图1 用有序边表算法生成的多边形

五、总结与体会

实验步骤

1)分析多边形区域扫描线填充算法的原理,确定算法流程

① 初始化:构造边表,AET表置空

② 将第一个不空的ET表中的边插入AET表

③ 由AET表取出交点进行配对(奇偶)获得填充区间,依次对这些填充区间着色

④ y=yi+1时,根据x=xi+1/k修改AET表所有结点中交点的x坐标。同时如果相 应的ET表不空,则将其中的结点插入AET表,形成新的AET表 ⑤ AET表不空,则转(3),否则结束。2)编程实现

① 首先确定多边形顶点和ET/AET表中结点的结构

② 编写链表相关操作(如链表结点插入、删除和排序等)

③ 根据1)中的算法结合上述已有的链表操作函数实现多边形区域扫描线填充的主体功能

④ 编写主函数,测试该算法 通过运用C语言环境下的图像显示设置,本次实验我学会了多边形区域扫描线填充的有序边表算法,设计相关的数据结构(如链表结构、结点结构等),并将实现的算法应用于任意多边形的填充,为深一步的学习做好了铺垫。

六、参考文献

计算机图形学中英文关键词 篇5

geometric transformation 几何变换 composite transformations 复合变换

Two-dimensional viewing-transformation 二维观察变换 matrix 矩阵 translate平移 rotate 旋转 scale 缩放

reflection 对称(反射)projection 投影

geometric planar projections平面几何投影 Classification 分类

Bresenham algorithm Bresenham 算法 DDA algorithm

数字微分分析算法 homogenous coordinates 齐次坐标 object representation对象表示 rastering 栅格化

scan conversion 扫描转换

geometric primitives 几何图元 region codes 区域码 aliasing 走样

antialiasing 反走样 supersampling 超采样 pixel intensities 像素强度 line-drawing 画线 principle 原理

advantage and disadvantage 优点和缺点 point by point 逐点

the following figure 下图 parallel projection平行投影

oblique parallel projection 斜投影

orthographic parallel projection(正投影)perspective projection 透视投影

line clipping algorithm 线段裁剪算法 cutting window 裁剪窗口 line segment 线段 polygon 多边形

scan-line polygon-fill algorithm 扫描线填充算法 Seed fill methods 种子填充算法 seed point 种子

left, top, right, bottom 左上右下 order of popping stack 出栈顺序 ordered edge list 有序边表 procedure 过程 pseudo-code 伪码

interactive OpenGL program交互式的OpenGL程序 with mouse 用鼠标 draw lines 画线

draw rectangles 画矩形

quadtree representation 四叉树 octree representation 八叉树

组合图形的面积计算教学设计 篇6

选一种你最喜欢的方法进行计算,并将题目的解题过程写下来。

巩固、练习:

(学生独立完成)

进一步巩固组合图形面积的计算方法以及书写时的注意点。

通过学生的独立练习,让学生明确在书写时的注意点以及熟悉解题的步骤。

教师活动

学生活动

设计意图

1、出示课堂练习:

求下面涂色部分的面积(单位:厘米)

10

10

5

20

2、个别指导

课堂练习

培养学生综合运用有关知识的能力。

结束语:

通过这节课对组合图形面积的学习,今后在解这样的题目时,你有什么心得或对其他同学有什么建议?

即发挥了学生的主动性,又将本堂课的内容进行了总结。

1、布置课堂作业

2、个别指导

课堂练习

巩固本节课所学的内容。

计算机图形学课程设计 篇7

一、计算机图形学的简单论述

1. 主要内容

如何将图形通过计算机表现出来, 并对相关的图形利用计算机进行计算以及相关处理, 并将其显示出来的计算方法与相关原理在计算机图形学研究中, 是最主要的内容。计算机图形图像通常是由体、面、线、点等不同的几何元素以及线宽、线型、色彩和灰度等几种不同的不属于几何属性的内容组成。通常在相关的技术处理上来说, 计算机图形大致可以分为两个基本内容, 其中一类就是用线条信息将其进行相关表示处理, 比如说一些相关的工程图、线框上的曲面图等等;另一类就是大家常说的比较有真实感的图形图像即为明暗图。

在计算机图形学中, 利用计算机将图形呈现出一种比较赏心悦目的真实感, 这是其学科内容要表达的最重要目的。为达到相应的效果, 我们应将建立起几何表示, 这样能将图形中想要表达的真实的场景结合外在的光照模型设备展现出来, 并达到计算机在将假想的材质属性、纹理以及光源计算出来, 以便能达到预期的光照明效果。所以说, 在几何设计中计算机辅助功能与计算机图形学密不可分, 在实际操作中, 在几何场景中, 计算机图形学也能将其实体和曲线曲面造型的相关技术操作作为主要的研究对象。于此同时, 用数字图像方式将计算机图形相对比较真实的计算结果得以提供, 对于计算机图形图像处理技术来说, 图形学与其之间的关系也密不可分。

2. 发展

十九世纪五十年代, 在美国诞生了计算机附件, 经后来出现的滚筒式绘图仪逐渐将数字记录仪取代, 而在这一时期, 计算机仅仅局限于电子管式, 直到五十年代末期, 在美国的林肯实验室中相继开发出的空中防御计算机体系, 用来控制和指挥的计算机显示器也被第一次投入使用, 这样在显示器屏幕上操作者直接可以用笔将确定的目标指出来, 而在同一时期内, 一些相似的生产过程和技术设计也被人们广泛的应用, 这就表示初期的计算机图形学已经正式诞生。在此之前, 计算机系统一般都是符号处理, 计算机图形学出现之后, 计算机能将人们局部的右脑功能部分的表现出来, 这对建立计算机图形学来说, 意义也较为重要。

二、基本概念以及系统的功能和组成

1. 基本概念

计算机图形图像处理的操作过程就是将需要表示物体的几何模型和数据由数学或者概念的形势描述出来, 再经由计算机进行修改、存储、显示以及完善等。其最主要的内容有以下几点:

(1) 投影、平移、缩放、旋转等的几何转变

(2) 图像分析和分割、数字化和编码、增强以及复原等

(3) 消除计算机图形图像的隐面、线

(4) 设计计算机图形图像的造型和建模

(5) 将图形图像的曲面和曲线进行拟合操作

(6) 最后进行色彩设计以及将相对的明暗处以及贴图纹理进行处理

2. 功能和组成

(1) 功能

在计算机工程和科学领域, 计算机图形系统的研制和设计是最重要的内容, 而作为一个计算机图形处理系统, 必须应具备对话、输入和输出、存储和计算等相应的基本功能。计算机图形处理系统中的对话功能就是利用相关交互设备或者显示器直接将计算机和人进行通信功能, 人们对不满意的地方可以利用设计的图形和结果再关联相关设备对其进行修改;输入和输出功能就是讲图形图像中输入各种几何参数的形体命令, 在显示的状态下, 对最终修改的结果进行输出和拷贝;存储和计算功能就是将计算机图形图像中的关系以及几何数据进行实时的维护和检索, 在设计时所需要的一系列分析、变换、计算等等。

(2) 组成

相应的一些图形图像处理软件和配置的硬件设备两个部分组成计算机的图形图像系统。一般来说, 一些质量较高的图形跟其具有高性能的硬件设备密不可分, 图形图像结构系统中图形处理器是其部件的最重要部分, 它是将显示终端与计算机相衔接的纽带。对图形处理器本身来说, 因为自身存在的处理和存储功能, 并且能将其函数计算得到大部分的完成, 这对计算机的微软处理器来说, 不仅将其负担大大的减轻, 也将计算机操作系统的速度和图形图像的显示能力也得以提高。在计算机图像系统中, 鼠标和键盘是最常用的输入设备, 操作人员利用鼠标和键盘将相对应的图形软件在屏幕上进行输入和定位图形。而计算机图形输出设备则是利用快速输出或者处理和生成的显示系统上将绘图系统永久的保存下来, 其中最主要的就是打印机设备、绘图仪设备和显示器设备等等。随着社会经济建设的发展, 我国不断的引进先进的技术, 使计算机图形图像处理技术也在逐步的发展, 与此同时, 相关软件也在不断的完善和更新, 就目前来说, 我国相继出现了许多对计算机图行图像处理技术相关的软件系统, 并且得到了大力支持。为了能将计算机图形图像技术顺应时代的发展, 一些相关专业人员提出了将计算机图形软件逐渐趋于标准化的相关问题, 并相继开发了能直接满足用户以及相关设备的管理和驱动程序包。

三、计算机图形学的研究前沿和应用

1. 辅助制造和设计

在工业界中, 应用领域最活跃以及最广泛的计算机图形学就是CAD或者CAU。在设计一些产品时或者进行机械构造以及土建工程时, 计算机图形学得到广泛的运用, 同时在一些网络分析、电子线路以及集成电路等电子工业中也被广泛的采用, 其优势也相当明显, 遇到一个规模较大或者系统较复杂的电路板图时, 人工的力量已经不能满足其绘制和设计, 利用计算机图形系统能在较短的时间内对整个系统进行画图和设计, 这样既节省了时间, 也减少了人工的浪费。随着现代化互联网计算机的发展, 在互联网经济体制下将协同设计形成一套异地异构系统, 在当今社会和CAD领域中成为社会各界人士探讨的重要话题之一。在以工程图纸为基础, 研究CAD领域的最关键步骤就是重建三维形体, 即为:从一些二维信息中提取一些相关信息, 并对其进行综合分类, 以三维空间为主题, 重新将二维信息进行构造, 从而将重建的形体得以真正实现。但在目前来说, 一些重要的重建三维形体计算法主要都是面对一些受到严格限制的且对主轴方向以及多面体的二次曲面体, 但是, 重建三维形体中的任意曲面体在当今社会里, 仍是一个难度系数较高的问题。

2. 可视化

随着互联网技术的迅速发展, 计算机数据库的逐渐增多, 使大多数人们在处理和分析一些数据时面临的困难也越来越大, 操作者并不能从众多数据中迅速选出对自己有用的数据, 也没有办法将其最本质的特征以及变化规律找出来。如果将一些种类较多且相对比较繁琐的数据用计算机图形的方式将其进行归类表示, 这样人们在操作时对其本质特征以及发展趋势就能轻而易举的提取出来。在十九世纪时, 科学计算可视化在美国的科学基金会被相继提出, 就目前来说, 可视化在气象分析、流体力学以及医学中得以广泛利用, 其中发展空间最大的就是在医学领域, 对脑部进行远程手术时, 利用精密的得以实现的就是科学计算可视化。

3. 动画和艺术

随着计算机硬件以及图形学的逐步发展, 社会大众已经不再局限于满足一些静态的且质量较高的场景, 这就使计算机动画相继出现。在现代的商业美术工作人员都比较倾向于利用计算机进行艺术创作, 而用于艺术设计的软件也得以开发, 比如现代的对二维平面进行设计的画笔程序:Cordl Draw, Photoshop, Paint Shop;对三维动画渲染和建模的软件有3DMAX, Maya, 以及Alias, Softimage等直接生成动画的软件等等, 这些软件样数较多, 不仅能将各种各样的纹理贴图以及画壁画刷, 还能降图片进行变形或者雾化等一些列操作, 其许多功能都是一般的艺术家远不可达到的。

4. 用户接口

人们在使用计算机时, 第一印象或者感官就是用户接口, 能将软件的易用性提高的最简单办法就是将图形用户界面建立好。在上世纪八十年代末, 苹果公司突出图形化操作系统, 尤其是微软公司普及的Windows操作系统, 这就证明, 图形学在计算机的各个方面都渐渐融入。

四、区别和联系

计算机图形图像的区别在于其用途、理论基础、处理方法以及数据来源有很大的区别。计算机图像处理主要在航天航空、工业、医学以及军事上被广泛运用, 而计算机图形学则主要倾向于运用在CAD、CAM、CAE、CAI计算机动画、模拟和艺术中;在模糊数学、概率和统计以及信号处理等理论上, 图像处理被主要的利用在内, 而计算机图形学则是在分形、计算几何、透视与放射变换等理论中被广泛运用;其次就是数据来源, 图形数据一般来自人们的主观世界, 而图像数据则来自人们的客观世界。但在实际的运用操作中, 图形图像处理技术密不可分, 将两者相结合, 不仅能将视觉质量和效果得以完善, 也能将其变得更加精美。随着两者相关技术的发展, 它们之间的关系相互渗透、相互交叉。

五、结束语

综上所述, 计算机图形学与计算机图形图像处理技术已经在人们生活的各个领域被普遍运用, 它不仅能制造出一些比较唯美新奇的视觉效果, 也将人们的创造潜力得以充分发挥, 使人们的生活环境变得丰富多彩, 所以, 我们应熟练掌握计算机图形图像处理技术, 努力的创造出更多的精彩视觉生活。

摘要:在二十世纪八十年代末期, 计算机图形学以及图形图像处理技术相继产生, 并持续发展至今。在计算机图形学中, 图形图像处理技术备受关注, 能否将其得到合理的利用, 在现代化的学科应用领域中成为最重要的一个分支。文章将计算机图形学的发展历史以及研究的主要内容、图形图像系统处理技术的相关功能和组成部分、相对比较有真实感的图形画面以及在应用领域的技术实现进行综合分析, 并对计算机图形学的相关内容进行分类并概括总结, 对计算机图形图像处理技术和计算机图形学的相关知识能够得到更好的掌握。

关键词:计算机,图形学,图形图像,可视化,处理技术,探析

参考文献

[1]温玉春.计算机图像处理技术应用研究[J].现代商贸工业, 2011 (02)

[2]田亮.浅析计算机图形学的应用及其发展[J].民营科技, 2011 (12)

[3]慕乾华.计算机图形学在实践中的应用[J].价值工程, 2010 (09)

计算机图形学课程设计 篇8

关键词:计算机图形学 群众文化 应用

简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成。从处理技术上来看,图形主要分为两类,一类是基于线条信息表示的,如工程图、等高线地图、曲面的线框图等,另一类是明暗图,也就是通常所说的真实感图形。1963年,伊凡·苏泽兰(Ivan Sutherland)在麻省理工学院发表了名为《画板》的博士论文,它标志着计算机图形学的正式诞生。至今已有四十多年的历史。此前的计算机主要是符号处理系统,自从有了计算机图形学,计算机可以部分地表现人的右脑功能了,所以计算机图形学的建立具有重要的意义。

计算机图形学一个主要的目的就是要利用计算机产生令人赏心悦目的真实感图形。为此,必须创建图形所描述的场景的几何表示,再用某种光照模型,计算在假想的光源、纹理、材质属性下的光照明效果。所以计算机图形学与另一门学科计算机辅助几何设计有着密切的关系。事实上,图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其主要的研究内容。同时,真实感图形计算的结果是以数字图象的方式提供的,计算机图形学也就和图像处理有着密切的关系。

图形与图像两个概念间的区别越来越模糊,但还是有区别的:图像纯指计算机内以位图形式存在的灰度信息,而图形含有几何属性,或者说更强调场景的几何表示,是由场景的几何模型和景物的物理属性共同组成的。

计算机图形学的研究内容非常广泛,如图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法、非真实感绘制,以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等。

计算机图形学(Computer Graphics,简称CG)是研究怎样用计算机表示、生成、处理和显示图形的一门学科。简单地说,计算机图形学主要是研究怎样运用计算机进行图形的表示以及运用计算机实现图形的计算、处理和显示等相关原理与算法。随着数字化娱乐时代的到来,三维图形的生产与显示技术成为吸引群众眼球的产物,群众文化作为宣传的窗口,信息的交流和传播平台,多方面引入了计算机图形学相关的技术,借以来推动了群众文化工作的持续发展。在此,笔者粗略的谈一下计算机图形学在群众文化工作中的应用。

1 计算机图形学丰富了群众文化的表现内容

随着计算机技术的迅猛发展,目前计算机图形学成为各个领域中加强信息理解与传递的重要技术和工具。同时计算机图形无论是硬件还是软件的盛大生产,对人们的生活产生了一定的影响,使得人们的精神水平迅速提升,不再满足于一般的精神文化需求,更多的是需要高科技的文化产物。文化馆作为文化的宣传窗口、群众交流信息的平台,应科技发展的需求,开始广泛运用计算机图形学。如:运用CAD技术进行动画制作、仿真模拟;即:运用计算机图形学的CAD技术真实的模拟一些教育实践案例、法律小故事、交通故事、群众热点事情重现等,加强对群众经济、法律、教育等知识的渗透,同时还运用计算机图形学中的造型仿真技术再现原始动物、外星人等各种场景等等,还可以将群众配以实际的背景运用计算机图形技术大放异彩,制作出群众自己的电影巨片。此外,运用计算机图形学中的科学计算技术能够让人们直观的看到一些数据的发展规律,诸如:力学、气象科学、天体物理、分析生物学等等,充实了文化馆的文化内容,有效的丰富了群众文化的表现内容。

2 计算机图形学创新了群众文化的表现形式

近些年来我国市场经济发展迅猛,人民群众的生活水平也越来越高,连带着对文化娱乐的欣赏水平也越来越高。新兴剧场的多功能特色,即:舞台演出、会议、报告、影院等等成为了人民群众的最爱。多功能剧场的出现对群众文化馆的发展来说是机遇也是挑战。为了人民群众的需求,文化馆必须革新自己的文化娱乐表现形式,运用计算机图形学的相关技术。如:文化馆采取多媒体计算机的矩阵控制系统来控制整体的音响系统,这样一来,整个过程都可以以数码方式进行处理,使得他们无论在精度、信噪比、还是失真方面都高于传统的模拟设备。这样,运用媒体矩阵音响系统,就可以创新群众文化工作的表现形式,即:能够在礼堂、音乐厅、体育馆、体育场、公园一些大型的场地实现扩声。能够为群众文化活动的顺利开展提供有保障的后盾力量。同时,媒体矩阵还可以随时执行替换功能,文化馆工作人员可以根据实际需求随时修改或者添加诸如:调音台、眼分音器、自动音压控制器、信号分配器等设备。群众文化娱乐活动大都是通过声音来组织、引导群众开展的,运用计算机图形学中的技术能够将音频处理带到一个全新的网络境界,提升了文化工作人员的工作效率和质量。

在这种形式下,我们必须充分发挥现代传媒技术的优势,加强对传统文化精髓的提炼与传播,打造民族文化精品,这不仅可以对国民进行循序渐进的传统文化的精神洗礼,还可以充分利用媒介重新建构起更加符合现在形势的文化观。同时,避免传统艺术形式因内涵意义不易理解而从我们的视野中消失,也避免产生因为计算机形式轻内涵而导致主流艺术缺乏文化深度的社会现象,而要以媒体语言整合传统文化精神,让世界更清楚地认识中国的现在和过去,从而实现文化传承,打造民族艺术精品。

3 计算机图形学拓展了群众文化的宣传途径

群众文化工作是对外宣传的窗口,更是当地老百姓进行文化信息交流、传播的平台。现如今是数字化时代,网络成为人们生活的重要组成部分,群众文化运用网络的特性实现高速度、高质量的宣传,进而推动群众文化的繁荣发展。如:建设一个具有当地群众文化特色的网络,让全国各地的人通过互联网就能够浏览文化信息,通过留言板、email、QQ、MSN等工具进行文化信息的交流,拓展了传统群众文化的宣传途径。笔者所在的文化馆,结合安徽的相关文化状态、生活习俗等运用计算机图形学的相关知识建设了一个自己群文网络,有:本馆信息、非物质文化介绍、在线服务(联系我们)、艺术展厅、艺术图画展览、活动展示等等内容,同时,将各地市级、县级群文网站的链接也成立一个板块设置在网站的首页,形成网络群众文化联盟,为浏览文化信息的群众提供方便。这样运用计算机图形学技术将群众文化活动以影视、图片加以文字制作成群众文化的宣传材料上传至网站上,以互联网为传播路径,推动群众文化形成全球化的宣传、互动、交流新格局。

群众文化是人们生活娱乐所不可缺少的,而人们运用计算机生活娱乐、运用计算机进行数据处理等等成为发展的必然趋势。计算机图形以其科学性、技术性为群众文化的建设与发展提供了无限的帮助,有着“催化剂”的作用。可以说,计算机图形学在群众文化工作中的应用涉及甚广,是群众文化可持续发展的后盾力量。

参考文献:

[1]伏玉琛,周洞汝.计算机图形学——原理、方法与应用[M].华中科技大学出版社,2003.

[2]柳海兰.浅谈计算机图形学的发展及应用[J].电脑知识与技术,2010(33).

上一篇:例如近义词下一篇:过年祝酒词