搜档网
当前位置:搜档网 › 计算机图形学实验报告

计算机图形学实验报告

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

目录

实验一直线的DDA算法

一、【实验目的】

1.掌握DDA算法的基本原理。

2.掌握DDA直线扫描转换算法。

3.深入了解直线扫描转换的编程思想。

二、【实验内容】

1.利用DDA的算法原理,编程实现对直线的扫描转换。

2.加强对DDA算法的理解和掌握。

三、【测试数据及其结果】

四、【实验源代码】

GLsizei winWidth=500;

GLsizei winHeight=500;

void Initial(void)

{

glMatrixMode(GL_PROJECTION);

}

void DDALine(int x0,int y0,int x1,int y1)

{

int dx,dy,epsl,k;

float x,y,xIncre,yIncre;

dx=x1-x0; dy=y1-y0;

x=x0; y=y0;

if(abs(dx)>abs(dy)) epsl=abs(dx);

else epsl=abs(dy);

xIncre=(float)dx/(float)epsl;

yIncre=(float)dy/(float)epsl;

for(k=0;k<=epsl;k++)

{

glPointSize(3);

glBegin(GL_POINTS);

glEnd();

x+=xIncre;

y+=yIncre;

}

}

void Display(void)

{

glClear(GL_COLOR_BUFFER_BIT);

DDALine(100,100,200,180);

glFlush();

}

void winReshapeFcn(GLint newWidth, GLint newHeight) {

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glClear(GL_COLOR_BUFFER_BIT);

winWidth=newWidth;

winHeight=newHeight;

}

int main(int argc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(400,300); glutInitWindowPosition(100,120); glutCreateWindow("line");

Initial();

glutDisplayFunc(Display);

glutReshapeFunc(winReshapeFcn);

glutMainLoop();

return 0;

}

实验二Bresenham绘制直线和圆

一、【实验目的】

1.掌握Bresenham算法扫描转换圆和直线的基本原理。

二、【实验内容】

1.利用Bresenham算法扫描转换圆和直线的基本原理编程实现对圆和直线的扫描转换。

三、【测试数据及其结果】

四、【实验源代码】

绘制直线:

GLsizei winWidth=500;

GLsizei winHeight=500;

void lineBres(int x0, int y0, int xEnd, int yEnd)

{

int dx=fabs(xEnd-x0), dy=fabs(yEnd-y0);

int p=2*dy-dx;

int twoDy=2*dy, twoDyMinusDx=2*(dy-dx);

int x, y;

if (x0>xEnd)

{

x=xEnd;

y=yEnd;

xEnd=x0;

}

else{

x=x0;

y=y0;

}

glPointSize(6);

glBegin(GL_POINTS);

glVertex2i(x, y);

glEnd();

while (x

{

x++;

if (p<0)

p+=twoDy;

else{

y++;

p+=twoDyMinusDx;

}

glPointSize(2);

glBegin(GL_POINTS);

glVertex2i(x, y);

glEnd();

}

}

void init (void)

{

glShadeModel(GL_FLAT);

}

void display (void)

{

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); lineBres(10, 10, 400, 300);

glFlush();

}

void winReshapeFcn(GLint newWidth, GLint newHeight)

{

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glClear(GL_COLOR_BUFFER_BIT);

winWidth=newWidth;

winHeight=newHeight;

}

void main(int argc, char** argv)

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(10, 10);

glutInitWindowSize(winWidth, winHeight);

glutCreateWindow("lineBres");

init();

glutDisplayFunc(display);

glutReshapeFunc(winReshapeFcn);

glutMainLoop();

}

绘制圆:

void init()

{

glClearColor(0,0,0,0);

}

void MidBresenhamCircle(int r)

{

int x,y,d;

x=0;

y=r;

d=1-r;

glBegin(GL_LINE_STRIP);

while(x<=y){

glVertex2f(x,y);

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

else{

d+=2*(x-y)+5;

y--;

}

x++;

}

glEnd();

}

void display()

{

glClearColor(1,1,1,1);

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1,0,0);

MidBresenhamCircle(8);

glRotated(45,0,0,1);

MidBresenhamCircle(8);

glRotated(45,0,0,1);

MidBresenhamCircle(8);

glRotated(45,0,0,1);

MidBresenhamCircle(8);

glRotated(45,0,0,1);

MidBresenhamCircle(8);

glRotated(45,0,0,1);

MidBresenhamCircle(8);

glRotated(45,0,0,1);

MidBresenhamCircle(8);

glRotated(45,0,0,1);

MidBresenhamCircle(8);

glutSwapBuffers();

}

void reshape(int w,int h)

{

glViewport(0,0,w,h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(-10,10,-10,10);

}

int main(int argc,char**argv)

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);

glutInitWindowSize(400,400);

glutInitWindowPosition(100,100);

glutCreateWindow("扫描转换圆");

glutDisplayFunc(display);

glutReshapeFunc(reshape);

glutMainLoop();

return 0;

}

实验三反走样及五环的绘制

一、【实验目的】

1.了解走样和反走样的内容,熟练掌握用opengl实现图形的反走样。?

2.学会用反走样消除走样现象。

3.学会五环的绘制方法。

二、【实验内容】

1.通过学习反走样相关课程,用opengl实现光栅图形的反走样。

2.绘制五环。

三、【测试数据及其结果】

四、【实验源代码】

反走样:

#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"") GLuint lineList; //指定显示列表

void Initial()

{

glClearColor(,,,);

glLineWidth();

glColor4f

lineList=glGenLists(1); //获得一个显示列表标识

glNewList(lineList,GL_COMPILE); //定义显示列表

glBegin(GL_LINE_LOOP);

glVertex2f(,);

glVertex2f(,);

glVertex2f(,);

glEnd();

glEndList();

}

void ChangeSize(GLsizei w,GLsizei h)

{

if(h==0) h=1;

glViewport(0,0,w,h);

glMatrixMode(GL_PROJECTION); //指定设置投影参数

glLoadIdentity();

if(w<=h)

else

glMatrixMode(GL_MODELVIEW); //指定设置模型视图变换参数

glLoadIdentity();

}

void Displayt(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glCallList(lineList); //调用显示列表

glFlush();

}

void Displayw(void){

glClear(GL_COLOR_BUFFER_BIT);

glEnable(GL_LINE_SMOOTH); //使用反走样

glEnable(GL_BLEND); //启用混合函数

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); //指定混合函数glCallList(lineList); //调用显示列表

glFlush();

}

void main(void)

{

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

glutInitWindowSize(300,300);

glutCreateWindow("原始图形");

glutDisplayFunc(Displayt);

glutReshapeFunc(ChangeSize);

Initial();

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

glutInitWindowPosition(300,300);

glutInitWindowSize(300,300);

glutCreateWindow("反走样图形");

glutDisplayFunc(Displayw);

glutReshapeFunc(ChangeSize);

Initial();

glutMainLoop();

}

五环:

#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")

void DrawCircle(GLfloat radius)

{

GLfloat x,y,z;

glBegin(GL_LINE_LOOP);

for (int alpha=0;alpha<360;alpha++)

{

x=radius*cos(alpha*PI/180);

y=radius*sin(alpha*PI/180);

z=0;

glVertex3f(x,y,z);

}

glEnd();

}

void Display()

{

glClearColor(1,1,1,1);

glClear(GL_COLOR_BUFFER_BIT);

glLoadIdentity();

glTranslatef(0,0,-25);

glColor3f(0,1,0);

glLineWidth(3);

glPopMatrix();

glPushMatrix();

glTranslatef(7,0,0);

glColor3f(1,0,0);

glPopMatrix();

glPushMatrix();

glTranslatef(-7,0,0);

glColor3f(0,0,1);

glPopMatrix();

glPushMatrix();

glColor3f

glPopMatrix();

glPushMatrix();

glColor3f

glPopMatrix();

glutSwapBuffers();

}

void reshape(int w,int h)

{

glViewport(0,0,w,h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(45,GLdouble(w)/h,1,100);

glMatrixMode(GL_MODELVIEW);

}

void main(int argc,char **argv)

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);

glutInitWindowPosition(10,10);

glutInitWindowSize(500,500);

glutCreateWindow("Test");

glutDisplayFunc(Display);

glutReshapeFunc(reshape);

glutMainLoop();

}

实验四多视区

一、【实验目的】

1.熟练掌握各种裁剪算法和二维观察变换。?

2.学会在屏幕坐标系下创建多个视区、指定视区的宽度和高度,了解二维观察变换中包含窗口到视区的映射。

二、【实验内容】

1.在一个显示窗口内指定多个视区,分别显示具有相同坐标、不同颜色和不同显示模式的各种图形面。?

2.在书本给定程序基础上,对程序做一些改变并在视区中绘制各种图形。

三、【测试数据及其结果】

四、【实验源代码】

void initial(void)

{

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

}

void triangle(GLsizei mode)

{

if(mode==1)

glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);

else

glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);

glBegin(GL_TRIANGLES);

glVertex2f

glVertex2f

glVertex2f

glEnd();

}

void polygon(GLsizei mode)

{

if(mode==1)

glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);

else

glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);

glBegin(GL_POLYGON);

glVertex2f

glVertex2f

glVertex2f

glVertex2f

glVertex2f

glEnd();

}

void DrawCircle(GLfloat r)

{

GLfloat x,y,z;

glBegin(GL_LINE_LOOP);

for (int alpha=0;alpha<360;alpha++)

{

x=r*cos(alpha*PI/180);

y=r*sin(alpha*PI/180);

z=0;

glVertex3f(x,y,z);

}

glEnd();

}

void Display()

{

glClear(GL_COLOR_BUFFER_BIT);

glColor3f

glViewport(0,0,100,100);

triangle(1);

glColor3f

glViewport(100,0,100,100);

triangle(2);

glColor3f

glViewport(0,100,100,100);

polygon(2);

glViewport(100,100,100,100);

DrawCircle(5);

glFlush();

}

void main(void)

{

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

glutInitWindowPosition(10,10);

glutInitWindowSize(400,200);

glutCreateWindow("多视区");

initial();

glutDisplayFunc(Display);

glutMainLoop();

}

实验五分子模型

一、【实验目的】

1.熟练掌握二维、三维几何变换矩阵和透视投影的相关知识从而用opengl实现分子模型的运动。?

2.熟练掌握opengl中相关函数的调用和实现。

二、【实验内容】

1.显示分子模型:红色大球表示原子,三个黄色小球表示电子,分别绕原子旋转,采用透视投影变换显示电子旋转过程。

2.启用深度测试和模型视图矩阵完成分子动画。

三、【测试数据及其结果】

四、【实验源代码】

GLint angleSelf=0;

void Initial()

{

glEnable(GL_DEPTH_TEST);

glClearColor(,,,);

}

void ChangeSize(int w,int h)

{

if(h==0) h=1;

glViewport(0,0,w,h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

GLfloat fAspect;

fAspect=(float)w/(float)h;

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

void Display(void){

static float fElect1=;

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

glTranslatef(,,);

glColor3f(,,);

glutWireSphere(,15,15);

glColor3f(,,);

glPushMatrix();

glRotatef(fElect1,,,);

glTranslatef(,,);

glRotatef(angleSelf,0,1,0);

glutWireSphere(,15,15);

glPopMatrix();

glPushMatrix();

glRotatef(,,,);

glRotatef(fElect1,,,);

glTranslatef(,,);

glRotatef(angleSelf,0,1,0);

glutWireSphere(,15,15);

glPopMatrix();

glPushMatrix();

glRotatef(,,,);

glRotatef(fElect1,,

glTranslatef(,,);

glRotatef(angleSelf,0,1,0);

glutWireSphere(,15,15);

glPopMatrix();

fElect1 +=;

if(fElect1>) fElect1=;

glutSwapBuffers();

}

void RotateSelf(int value)

{

if(value==1)

{

angleSelf+=5;

angleSelf%=360;

glutPostRedisplay();

glutTimerFunc(100,RotateSelf,1);

}

}

void TimerFunc(int value)

{

glutPostRedisplay();

glutTimerFunc(100,TimerFunc,1);

}

int main(int argc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);

glutCreateWindow("分子动画示例");

glutReshapeFunc(ChangeSize);

glutDisplayFunc(Display);

glutTimerFunc(500,TimerFunc,1);

glutTimerFunc(100,RotateSelf,1);

Initial();

glutMainLoop();

return 0;

}

实验六Bezier曲线

一、【实验目的】

1.掌握Bezire曲线定义。?

2.掌握设计绘制一次、二次和三次Bezier曲线算法。

二、【实验内容】

1.绘制NURBS曲面。

2.基于Bezier定义根据控制多边形的阶次绘制?Bezier曲线。

三、【测试数据及其结果】

四、【实验源代码】

原实验代码:

class Pt3D{

public:

GLfloat x,y,z;

};

void GetCnk(GLint n,GLint *c)

{

GLint i,k;

for(k=0;k<=n;k++){

c[k]=1;

for(i=n;i>=k+1;i--)c[k]=c[k]*i;

for(i=n-k;i>=2;i--)c[k]=c[k]/i;

}

}

void GetPointPr(GLint *c,GLfloat t,Pt3D*Pt,int ControlN,Pt3D*ControlP)

{

GLint k,n=ControlN-1;

GLfloat Bernstein;

for(k=0;k

Bernstein=c[k]*pow(t,k)*pow(1-t,n-k);

Pt->x+=ControlP[k].x*Bernstein;

Pt->y+=ControlP[k].y*Bernstein;

Pt->z+=ControlP[k].z*Bernstein;

}

}

void BezierCurve(GLint m,GLint ControlN,Pt3D *ControlP)

{

GLint *C,i;

Pt3D CurvePt;

C=new GLint[ControlN];

GetCnk(ControlN-1,C);

glBegin(GL_POINTS);

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

GetPointPr(C,(GLfloat)i/(GLfloat)m,&CurvePt,ControlN,ControlP);

glVertex2f

}

glEnd();

delete [] C;

}

void initial(void)

{

}

void Display(void){

glClear(GL_COLOR_BUFFER_BIT);

GLint ControlN=4,m=500;

glPointSize(2);

glColor3f

BezierCurve(m,ControlN,ControlP);

glBegin(GL_LINE_STRIP);

for(GLint i=0;i<4;i++)glVertex3f(ControlP[i].x,ControlP[i].y,ControlP[i].z);

glEnd();

glFlush();

}

void reshape(GLint newWidth,GLint newHeight)

{

glViewport(0,0,newWidth,newHeight);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

}

void main(void)

{

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

glutInitWindowPosition(100,100);

glutInitWindowSize(400,400);

glutCreateWindow("Bezier曲线");

initial();

glutDisplayFunc(Display);

glutReshapeFunc(reshape);

glutMainLoop();

}

加改后的:

void initial(void)

{

glEnable(GL_MAP1_VERTEX_3);

}

void Display(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glEvalMesh1(GL_LINE,0,100);

glFlush();

}

void Reshape(GLint newWidth,GLint newHeight)

{

glViewport(0,0,newWidth,newHeight);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

}

void main(void)

{

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(100,100); glutInitWindowSize(400,400); glutCreateWindow("Bezier曲线");

initial();

glutDisplayFunc(Display);

glutReshapeFunc(Reshape);

glutMainLoop();

实验七NURBS曲面和Bezier曲面

一、【实验目的】

1.掌握NURBS曲线定义。?

2.掌握设计绘制一次、二次和三次NURBS曲面算法。

二、【实验内容】

1.在屏幕上单击鼠标左键绘制控制多边形,基于NURBS定义根据控制多边形的阶次绘制NURBS曲面。

2.绘制的曲面中,红色的点表示曲面的控制点,并增加了光标键控制旋转的交互式方式,以获得更好的显示效果。

三、【测试数据及其结果】

四、【实验源代码】

NURBS曲面:

GLUnurbsObj*pNurb=NULL;

GLint nNumPoints=4;

GLfloat ctrlPoints[4][4][3]={{{ ,,},

{,,},

{,,},

{,,}},

{{,,},

{,,},

{,,},

{,,}},

{{,,},

{,,},

{,,},

{,,}},

{{,,},

{,,},

{,,},

{,,}}};

GLfloat Knots[8]={,,,,,,,};

static GLfloat xRot=;

static GLfloat yRot=;

void DrawPoints(void)

{

int i,j;

glPointSize();

glColor3ub(255,0,0);

glBegin(GL_POINTS);

for(i=0;i<4;i++)

for(j=0;j<4;j++)

glVertex3fv(ctrlPoints[i][j]);

glEnd();

}

void Initial()

{

glClearColor(,,,);

pNurb=gluNewNurbsRenderer();

gluNurbsProperty(pNurb,GLU_SAMPLING_TOLERANCE,);

gluNurbsProperty(pNurb,GLU_DISPLAY_MODE,(GLfloat)GLU_OUTLINE_POLYGON); }

void ReDraw(void)

{

glColor3ub(0,0,220);

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);

glPushMatrix();

glRotatef(,,,);

glRotatef(xRot,,,);

glRotatef(yRot,,,);

gluBeginSurface(pNurb);

gluNurbsSurface(pNurb,

8,

Knots,

8,

Knots,

4*3,

3,

&ctrlPoints[0][0][0],

4,

4,

GL_MAP2_VERTEX_3);

gluEndSurface(pNurb);

DrawPoints();

glPopMatrix();

glutSwapBuffers();

}

void SpecialKeys(int key,int x,int y)

{

if(key==GLUT_KEY_UP) xRot-=;

if(key==GLUT_KEY_DOWN) xRot+=;

if(key==GLUT_KEY_LEFT) yRot-=;

if(key==GLUT_KEY_RIGHT) yRot+=;

if(xRot>) xRot=;

if(xRot<) xRot=;

;

if(yRot<) yRot=;

glutPostRedisplay();

}

void ChangeSize(int w,int h)

{

if(h==0) h=1;

glViewport(0,0,w,h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective();

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

glTranslatef(,,);

}

int main(int argc,char **argv)

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);

glutCreateWindow("NURBS曲面");

glutReshapeFunc(ChangeSize);

glutDisplayFunc(ReDraw);

glutSpecialFunc(SpecialKeys);

Initial();

glutMainLoop();

return 0;

}

计算机图形学实验内容汇总

计算机图形学实验 肖加清

实验一图形学实验基础 一、实验目的 (1)掌握VC++绘图的一般步骤; (2)掌握OpenGL软件包的安装方法; (3)掌握OpenGL绘图的一般步骤; (4)掌握OpenGL的主要功能与基本语法。 二、实验内容 1、VC++绘图实验 (1)实验内容:以下是绘制金刚石图案。已给出VC++参考程序,但里面有部分错误,请改正,实现以下图案。 N=3 N=4

N=5 N=10 N=30

N=50 (2)参考程序 //自定义的一个类 //此代码可以放在视图类的实现文件(.cpp) 里class CP2 { public: CP2(); 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 #include #include #include //定义输出窗口的大小 #define WINDOW_HEIGHT 300

计算机图形学基础期末考试试题

一、填空题 1.将多边形外部一点A与某一点B用线段连接,若此线段与多边形边界相交的次数为??????????,则点B在多边形外部。若此线段与多边形边界相交的次数为??????????,则点B在多边形内部。 2.生成直线的四点要求是_______________________,____________________________,____________________________________,速度要快。 3.由5个控制顶点Pi(i=0,1,…4)所决定的3次B样条曲线,由??????????段3次B样条曲线段光滑连接而成。 4.用于减少或克服在“光栅图形显示器上绘制直线、多边形等连续图形时,由离散量表示连续量引起的失真”的技术叫??????????。 5.图形的数学表示法一般有??????????,??????????,??????????。 1.一个交互性的计算机图形系统应具有、、、、 输入等五方面的功能。 2.阴极射线管从结构上可以分为、和。 3.常用的图形绘制设备有和,其中支持矢量格式。 4.PHIGS和GKS将各种图形输入设备从逻辑上分为六种:定位设备、笔划设 备、、、和。 5.通常可以采用和处理线宽。 6.齐次坐标表示就是用维向量表示n维向量。 7.平行投影根据可以分为投影和投影。 8.一个交互式计算机图形处理系统包括图形软件和_____________,图形软件又分为 _____________、_____________和三部分。 9.构成图形的要素包括和,在计算机中通常用采用两种方法来表示 图形,他们是和。 10.荫罩式彩色显像管的结构包括、、和。 11.目前常用的PC图形显示子系统主要由3个部件组成:、和一 个ROM BIOS芯片。 12.在交互输入过程中,图形系统中有_____________、、和其组 合形式等几种输入(控制)模式。 13.填充一个特定区域,其属性选择包括、和。 14.计算机中表示带有颜色及形状信息的图和形常用和参数法,其中用参数法描 述的图形称为,用描述的图形称为。 15.在显示技术中,我们常常采用提高总的光强等级。 16.常用的交互式绘图技术有、、和。

计算机图形学总结

第一章绪论 计算机图形学的基本概念 计算机图形学:是研究怎样用数字计算机生成、处理和显示图形的一门学科。 图形:计算机图形学的研究对象。 构成图形的要素:几何要素——几何属性(点、线、面、体) 非几何要素——视觉属性(明暗、灰度、色彩、纹理、透明性、线型、线宽) 表示图形的方法:点阵表示;参数表示 研究内容 计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法,构成了计算机图形学的主要研究内容。 图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法,以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等。 计算机图形学的应用 图形用户界面;计算机辅助设计与制造(CAD/CAM);4 科学计算的可视化:CT; 真实感图形实时绘制与自然景物仿真;地理信息系统(GIS);Virtual Reality(虚拟现实、灵境);事务和商务数据的图形显示;地形地貌和自然资源的图形显示 过程控制及系统环境模拟;电子出版及办公自动化;计算机动画及广

告 计算机艺术;科学计算的可视化;工业模拟;计算机辅助教学 当前研究热点: 1.真实感图形实时绘制 2.野外自然景物的模拟3 与计算机网络技术的紧密结合 4 计算机动画 5 用户接口 6 计算机艺术 7 并行图形处理 所熟悉的图形软件包 图形软件的标准 GKS (Graphics Kernel System) (第一个官方标准,1977) PHIGS(Programmer’s Herarchical Iuteractive Graphics system) 一些非官方图形软件,广泛应用于工业界,成为事实上的标准 DirectX (MS) Xlib(X-Window系统) OpenGL(SGI) Adobe公司Postscript CAGD(Computer Aided Geometric Design) 图形系统的功能1.计算功能2.存储功能3.对话功能4.输入功能5.输出功能 图形输入设备 1 键盘和鼠标 2 跟踪球和空间球 3 光笔 4 数字化仪 5 触摸板 6 扫描仪

计算机图形学实验一

实验一二维基本图元的生成与填充 实验目的 1.了解并掌握二维基本图元的生成算法与填充算法。 2.实现直线生成的DDA算法、中点算法和Bresenham算法。 3.实现圆和椭圆生成的DDA和中点算法, 对几种算法的优缺点有感性认识。 二.实验内容和要求 1.选择自己熟悉的任何编程语言, 建议使用VC++6.0。 2.创建良好的用户界面,包括菜单,参数输入区域和图形显示区域。 3.实现生成直线的DDA算法、中点算法和Bresenham算法。 4.实现圆弧生成的中点算法。 5.实现多边形生成的常用算法, 如扫描线算法,边缘填充算法。 6.实现一般连通区域的基于扫描线的种子填充算法。 7.将生成算法以菜单或按钮形式集成到用户界面上。 8.直线与圆的坐标参数可以用鼠标或键盘输入。 6. 可以实现任何情形的直线和圆的生成。 实验报告 1.用户界面的设计思想和框图。 2.各种实现算法的算法思想。 3.算法验证例子。 4.上交源程序。 直线生成程序设计的步骤如下: 为编程实现上述算法,本程序利用最基本的绘制元素(如点、直线等),绘制图形。如图1-1所示,为程序运行主界面,通过选择菜单及下拉菜单的各功能项分别完成各种对应算法的图形绘制。 图1-1 基本图形生成的程序运行界面 2.创建工程名称为“基本图形的生成”单文档应用程序框架

(1)启动VC,选择“文件”|“新建”菜单命令,并在弹出的新建对话框中单击“工程”标签。 (2)选择MFC AppWizard(exe),在“工程名称”编辑框中输入“基本图形的生成”作为工程名称,单击“确定”按钮,出现Step 1对话框。 (3)选择“单个文档”选项,单击“下一个”按钮,出现Step 2对话框。 (4)接受默认选项,单击“下一个”按钮,在出现的Step 3~Step 5对话框中,接受默认选项,单击“下一个”按钮。 (5)在Step 6对话框中单击“完成”按钮,即完成“基本图形的生成”应用程序的所有选项,随后出现工程信息对话框(记录以上步骤各选项选择情况),如图1-2所示,单击“确定”按钮,完成应用程序框架的创建。 图1-2 信息程序基本 3.编辑菜单资源 设计如图1-1所示的菜单项。在工作区的ResourceView标签中,单击Menu项左边“+”,然后双击其子项IDR_MAINFRAME,并根据表1-1中的定义编辑菜单资源。此时VC已自动建好程序框架,如图1-2所示。 表1-1菜单资源表 菜单标题菜单项标题标示符ID 直线DDA算法生成直线ID_DDALINE Bresenham算法生成直线ID_BRESENHAMLINE 中点算法生成直线ID_MIDPOINTLINE 4.添加消息处理函数 利用ClassWizard(建立类向导)为应用程序添加与菜单项相关的消息处理函数,ClassName栏中选择CMyView,根据表1-2建立如下的消息映射函数,ClassWizard会自动完成有关的函数声明。 表1-2菜单项的消息处理函数 菜单项ID消息消息处理函数ID_DDALINE CONMMAN OnDdaline

计算机图形学期末考试试卷D卷

计算机图形学期末考试 试卷D卷 文稿归稿存档编号:[KKUY-KKIO69-OTM243-OLUI129-G00I-FDQS58-

计算机图形学期末考试试卷(D 卷 ) 一、 填空题(每空1分,共10分) 1. 图形的表示方法有两种: 和 。 2. 目前常用的两个事实图形软件标准是OpenGL 和 。 3. 多边形有两种表示方法: 和点阵表示法。 4. 二维图形基本几何变换包括平移、 、 等变换。 5. 投影可以分为 投影和 投影。 6. 描述一个物体需要描述其几何信息和 。 7. 在Z 缓冲器消隐算法中Z 缓冲器每个单元存储的信息是每一个像素点 的 。 二、 判断题(每小题1分,共10分,对的画√,错的画×) 1. 由三个顶点可以决定一段二次B 样条曲线,若三顶点共线时则所得到的 曲线褪化为一条直线段。( ) 2. DDA (微分方程法)是Bresenham 算法的改进。( ) 3. 插值得到的函数严格经过所给定的数据点,逼近是在某种意义上的最佳 近似。( ) 4. 齐次坐标提供了坐标系变换的有效方法,但仍然无法表示无穷远的点。 ( ) 5. 若相对于某点进行比例、旋转变换,首先需要将坐标原点平移至该点, 在新的坐标系下做比例或者旋转变换,然后将原点平移回去。( ) 6. Phong 算法的计算量要比Gouraud 算法小得多。 ( ) 7. 将某二维图形整体放大2倍,其变换矩阵可写为?? ?? ? ?????200010001。( ) 8. 在种子填充算法中所提到的八连通区域算法同时可填充四连通区域。 ( ) 9. 边缘填充算法中是将扫描线与多边形交点左方的所有像素取补。( )

西安电子科技大学计算机图形学重点总结,缩印必备!

反走样:在光栅显示器上显示图形时,直线段或图形边界或多或少会呈锯齿状。原因是图形信号是连续的,而在光栅显示系统中,用来表示图形的却是一个个离散的象素。这种用离散量表示连续量引起的失真现象称之为走样;用于减少或消除这种效果的技术称为反走样 反走样方法主要有:提高分辨率、区域采样和加权区域采样 提高分辨率:把显示器分辨率提高一倍,锯齿宽度也减小了一倍,所以显示出的直线段看起来就平直光滑了一些。这种反走样方法是以4倍的存储器代价和扫描转换时间获得的。因此,增加分辨率虽然简单,但是不经济的方法,而且它也只能减轻而不能消除锯齿问题。 区域采样方法:假定每个象素是一个具有一定面积的小区域,将直线段看作具有一定宽度的狭长矩形。当直线段与象素有交时,求出两者相交区域的面积,然后根据相交区域面积的大小确定该象素的亮度值。 加权区域采样:相交区域对象素亮度的贡献依赖于该区域与象素中心的距离。当直线经过该象素时,该象素的亮度F是在两者相交区域A′上对滤波器进行积分的积分值 刚体:平移和旋转的组合,保持线段的长度,保持角的大小,图形不变形,为刚体变化 仿射:旋转、平移、缩放的组合为仿射变换,平行边仍然平行,错切变换也为仿射变换 较高次数逼近的三种方法:1将y和z直接表示成x的显函数即y=f(x) z=g(x)2用一个形如f(x,y,z)=0的隐式方程的解来表示曲线3曲线的参数表示 前两方法缺点:1由一个x值不能得到多个y值;这一定义不是旋转不变的;描述具有与坐标轴垂直的切线的曲线是困难的2给定方程的解可能更多;曲线段做链接时,很难确定他们的切线方向在连接点上是否相等 参数表示为什么要选择三做参数:1低于三次的函数控制曲线形状时不够灵活,高于三次的曲线会增加不必要的摆动其增加计算量2三次参数曲线是三维空间中次数最低的非平面曲线3定义高次曲线需要更多条件,这样在交互生成时会造成曲线的摆动而难以控制 G0连续:两条曲线段拼接成一条曲线 G1连续:两条曲线段拼接点处切向量方向相同。若相等(方向、大小)-C1 Gn连续:两条曲线段拼接点处切向量的阶导数方向相同。n阶导数相等-Cn B样条曲线优势:1四点加权求和,调和函数非负且和为1,具有凸壳特性2可证明Qi和Qi+1在连接点处连续3曲线段三次函数,所以整个曲线具有连续4凸壳的对曲线裁剪有用 中点生成算法: TBRL中点生成算法:

计算机图形学实验

实验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 # include

void DDALine(int x0,int y0,int x1,int y1,int color) { int dx,dy,epsl,k; float x,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; x=x0; y=y0; if(abs(dx)>abs(dy)) epsl=abs(dx); else epsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { putpixel((int)(x+0.5),(int)(y+0.5),4); x+=xIncre; y+=yIncre; } } main(){ int gdriver ,gmode ;

计算机图形学期末考试题库

一、单项选择题 1. 计算机图形显示器一般使用什么颜色模型?(B) A)RGB;B) CMY;C) H SV ;D) HLS 2. 哪一个不是国际标准化组织( ISO)批准的图形标准?(D) A)GKS;B) PHIGS;C) C GM ;D) DXF 3.下述用数值微分法(DDA画斜率的绝对值小于1的直线的C语言子程序中哪一行有错? (A) Void drawLineWithDDA(int x1, int y1, int x2, int y2, int color) { A) int x, y; B ) float k = (float)(y2-y1)(x2-x1); C ) for(x=x1,y=y1;x<=x2;x++) { drawPixel(x,y,color); } D ) y+=k; } } 4. 下述绕坐标原点旋转a 角的坐标变换矩阵中哪一项是错误的?(B) | A B | | C D | A) cos a; B)sin a; C)sin a; D)cos a 5. 下述哪一条边不是非均匀有理B样条(NURBS的优点?(D) B)对于间距不等的数据点,用NURBS以合的曲线比用均匀B样条拟合的曲线更光滑 C)NURB醍供的权控制方法比用控制点更能有效的控制曲线的形状 D)使用NURB呦以提高对曲面的显示效率 A) NURBSL均匀B样条能表示更多的曲面

6. 透视投影中主灭点最多可以有几个?(D) A)0; B)1; C)2; D)3 7. 在用扫描线法进行点与多边形之间的包含性检测时,下述哪一个操作不正确?(D) A)当射线与多边形交于某顶点时且该点的两个邻边在射线的一侧时,计数0次 B)当射线与多边形交于某顶点时且该点的两个邻边在射线的一侧时,计数2次 C)当射线与多边形交于某顶点时且该点的两个邻边在射线的两侧时,计数1次 D)当射线与多边形的某边重合时,计数1次 &在简单光反射模型中,由物体表面上点反射到视点的光强下述哪几项之和?(C)(1)环境光的反射光强;(2)理想漫反射光强;(3)镜面反射光强;(4)物体间的反射光强。 A(1)和(2) B)(1)和(3) C)(1)(2)和(3) D)(1)(2 )(3 )和(4 ) 9. 下面关于NURBS的论述,哪个是错误的? ( B) A. 可通过控制顶点和权因子来改变形状; B. 仅具有仿射不变性,但不具有透射不变性; C. 非有理B样条、有理及非有理Bezier曲线、曲面是NURBS的特例; D. 可表示标准解析形状和自由曲线、曲面; 10. 下述关于Bezier 曲线P1(t), P2(t)t [0,1]的论述,哪个是错误的?() A. P1(1)= P2(0) = P,在P处P1(1), P2(0)的切矢量方向相同,大小相等, 则 P1(t), P2(t)在P处具有G1连续;

计算机图形学心得体会

计算机图形学心得体会 姓名: 学号: 201203284 班级: 计科11202 序号: 31 院系: 计算机科学学院

通过一个学期的学习,经过老师细心的讲解,我对图形学这门课有了基础的认识,从您的课上我学到了不少知识,基本上对图形学有了一个大体的认识。上课的时候,您的PPT做的栩栩如生,创意新颖的FLASH就吸引了我的眼球,再加上您那详细生动的讲解,就让我对这门课产生了浓厚的兴趣,随着一节一节课的教学,您的讲课更加深深地吸引了我,并且随着对这门课越来越深入的了解更促使我产生了学好这门的欲望。您教会了我们怎们做基本知识,还教了我们不少的算法。听您的课可以说是听得津津有味。以下就是我对计算机图形学这门课的认识。 一、图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成。从处理技术上来看图形主要分为两类一类是基于线条信息表示的如工程图、等高线地图、曲面的线框图等另一类是明暗图也就是通常所说的真实感图形。计算机图形学一个主要的目的就是要利用计算机产生令人赏心悦目的真实感图形。为此必须建立图形所描述的场景的几何表示再用某种光照模型计算在假想的光源、纹理、材质属性下的光照明效果。所以计算机图形学与另一门学科计算机辅助几何设计有着密切的关系。事实上图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其主要的研究内容。同时真实感图形计算的结果是以数字图像的方式提供的计算机图形学也就和图像处理有着密切的关系。 二、计算机图形学的研究内容非常广泛如图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法、非真实感绘制以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等。1990年的第11届亚洲运动会上首次采用了计算机三维动画技术来制作有关的电视节目片头。继而以3D Studio 为代表的三维动画微机软什和以Photostyler、Photoshop等为代表的微机二维平面设计软件的普及对我国计算机动画技术的应用起到了推波助谰的作用。计算机动画的应用领域十分宽广除了用来制作影视作品外在科学研究、视觉模拟、电子游戏、工业设计、教学训练、写真仿真、过程控制、平面绘画、机械设计等许多方面都有重要应用如军事战术模拟。 三、科学计算可视化它将科学计算过程中及计算结果的数据转换为几何

计算机图形学实验报告

《计算机图形学》实验报告姓名:郭子玉 学号:2012211632 班级:计算机12-2班 实验地点:逸夫楼507 实验时间:15.04.10 15.04.17

实验一 1 实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力; 编程实现DDA 算法、Bresenham 中点算法;对于给定起点和终点的直线,分别调用DDA 算法和Bresenham 中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel 等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。 2 实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One (自制平台) 3 实验结果 3.1 程序流程图 (1)DDA 算法 是 否 否 是 是 开始 计算k ,b K<=1 x=x+1;y=y+k; 绘点 x<=X1 y<=Y1 绘点 y=y+1;x=x+1/k; 结束

(2)Mid_Bresenham 算法 是 否 否 是 是 是 否 是 否 开始 计算dx,dy dx>dy D=dx-2*dy 绘点 D<0 y=y+1;D = D + 2*dx - 2*dy; x=x+1; D = D - 2*dy; x=x+1; x

3.2程序代码 //-------------------------算法实现------------------------------// //绘制像素的函数DrawPixel(x, y); (1)DDA算法 void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) { //----------请实现DDA算法------------// float k, b; float d; k = float(Y1 - Y0)/float(X1 - X0); b = float(X1*Y0 - X0*Y1)/float(X1 - X0); if(fabs(k)<= 1) { if(X0 > X1) { int temp = X0; X0 = X1; X1 = temp; }

最新计算机图形学期末考试试卷

最新计算机图形学期末考试试卷 一、判断题(本大题共 10 小题,每小题 1 分,共 10 分) 1. 计算机图形生成的基本单位是线段. ( F ) 2. 构成图形的要素除了点、线、面、体等几何要素外,还应该包括灰度、色彩、线型、 线宽等非几何要素. ( N ) 3. 在齐次坐标系中,若用矩阵来表示各种运算,则比例和旋转变换是矩阵F 乘法运算, 而平移变换是矩阵加法运算. ( F ) 4. Z-Buffer 消隐算法有利于硬件实现,并且不需要排序. ( N ) 5. 二次Bezier 曲线和二次B 样条曲线都通过控制多边形的首末端点. ( F ) 6. 一个向量的齐次坐标的表示形式是唯一的. ( F ) 7. 计算机图形技术是随着图形硬件设备的发展而发展起来的. ( N ) 8. Phong 算法的计算量要比Gouraud 算法小得多. ( F ) 9. 将某二维图形整体放大2倍,其变换矩阵可写为. ( F ) 10. 图形软件标准是为提高图形软件的易用性而提出的. ( F ) 二、填空题(本大题共 10 空,每空 1 分,共 10 分) 1. 在多边形填充过程中,常采用、 左闭右开 和 下闭上开 的原则 对边界像素进行处理. 2. 基本几何变换指 平移 、 比例 和 旋转 三种变换. 3. 屏幕上最小的发光单元叫作 像素 ,它的多少叫做 分辨率 . 4. ISO 批准的第一个图形软件标准是 GKS ,进入20世纪90年代后,存 在的事实上的图形软件标准主要是 OpenGL 和 Direct x . ?? ?? ? ?????200010001

5.图形的表示方法有两种:参数法和点阵法. 6.多边形的表示方法有顶点表示法和点阵表示法两种. 7.计算机三维模型的描述有线框模型、表面模型和实体 模型. 8.颜色包含3个要素:色调、饱和度和亮度 . 三、简答题(本大题共5 小题,每小题5 分,共25 分) 1.计算机图形学研究的主要内容是什么? 2.什么是齐次坐标?齐次空间点 P(X、Y、W) 对应的笛卡尔坐标是什么? 3.帧缓存的容量与什么有关?假定一个光栅扫描系统,分辨率800×600,要求可显示颜色256种,请问帧缓存的容量需要多少字节? 4.什么是走样?什么是反走样?常用的反走样技术有哪些? 5.简单光照模型的反射光由哪几部分组成,光照计算时有哪两种明暗处理技术?

计算机图形学必考知识点

Phong Lighting 该模型计算效率高、与物理事实足够接近。Phong模型利用4个向量计算表面任一点的颜色值,考虑了光线和材质之间的三种相互作用:环境光反射、漫反射和镜面反射。Phong模型使用公式:I s=K s L s cosαΦα:高光系数。计算方面的优势:把r和v归一化为单位向量,利用点积计算镜面反射分量:I s=K s L s max((r,v)α,0),还可增加距离衰减因子。 在Gouraud着色这种明暗绘制方法中,对公用一个顶点的多边形的法向量取平均值,把归一化的平均值定义为该顶点的法向量,Gouraud着色对顶点的明暗值进行插值。Phong着色是在多边形内对法向量进行插值。Phong着色要求把光照模型应用到每个片元上,也被称为片元的着色。 颜色模型RGB XYZ HSV RGB:RGB颜色模式已经成为现代图形系统的标准,使用RGB加色模型的RGB三原色系统中,红绿蓝图像在概念上有各自的缓存,每个像素都分别有三个分量。任意色光F都可表示为F=r [ R ] + g [ G ] + b [ B ]。RGB颜色立方体中沿着一个坐标轴方向的距离代表了颜色中相应原色的分量,原点(黑)到体对角线顶点(白)为不同亮度的灰色 XYZ:在RGB 系统基础上,改用三个假想的原色X、Y、Z建立了一个新的色度系统, 将它匹配等能光谱的三刺激值,该系统称为视场XYZ色度系统,在XYZ空间中不能直观地评价颜色。 HSV是一种将RGB中的点在圆柱坐标系中的表示法,H色相S饱和度V明度,中心轴为灰色底黑顶白,绕轴角度为H,到该轴距离为S,沿轴高度为S。 RGB优点:笛卡尔坐标系,线性,基于硬件(易转换),基于三刺激值,缺点:难以指定命名颜色,不能覆盖所有颜色范围,不一致。 HSV优点:易于转换成RGB,直观指定颜色,’缺点:非线性,不能覆盖所有颜色范围,不一致 XYZ:覆盖所有颜色范围,基于人眼的三刺激值,线性,包含所有空间,缺点:不一致 交互式计算机程序员模型 (应用模型<->应用程序<->图形库)->(图形系统<->显示屏).应用程序和图形系统之间的接口可以通过图形库的一组函数来指定,这和接口的规范称为应用程序编程人员接口(API),软件驱动程序负责解释API的输出并把这些数据转换为能被特定硬件识别的形式。API提供的功能应该同程序员用来确定图像的概念模型相匹配。建立复杂的交互式模型,首先要从基本对象开始。良好的交互式程序需包含下述特性:平滑的显示效果。使用交互设备控制屏幕上图像的显示。能使用各种方法输入信息和显示信息。界面友好易于使用和学习。对用户的操作具有反馈功能。对用户的误操作具有容忍性。Opengl并不直接支持交互,窗口和输入函数并没有包含在API中。 简单光线跟踪、迭代光线跟踪 光线跟踪是一种真实感地显示物体的方法,该方法由Appel在1968年提出。光线跟踪方法沿着到达视点的光线的相反方向跟踪,经过屏幕上每一象素,找出与视线所交的物体表面点P0,并继续跟踪,找出影响P0点光强的所有的光源,从而算出P0点上精确的光照强度。光线跟踪器最适合于绘制具有高反射属性表面的场景。优缺点:原理简单,便于实现,能生成各种逼真的视觉效果,但计算量开销大,终止条件:光线与光源相交光线超出视线范围,达到最大递归层次。一般有三种:1)相交表面为理想漫射面,跟踪结束。2)相交表面为理想镜面,光线沿镜面反射方向继续跟踪。3)相交表面为规则透射面,光线沿规则透射方向继续跟踪。 描述光线跟踪简单方法是递归,即通过一个递归函数跟踪一条光线,其反射光想和折射光线再调用此函数本身,递归函数用来跟踪一条光线,该光线由一个点和一个方向确定,函数返回与光线相交的第一个对象表面的明暗值。递归函数会调用函数计算指定的光线与最近对象表面的交点位置。 图形学算法加速技术BVH, GRID, BSP, OCTree 加速技术:判定光线与场景中景物表面的相对位置关系,避免光线与实际不相交的景物表面的求交运算。加速器技术分为以下两种:Bounding Volume Hierarchy 简写BVH,即包围盒层次技术,是一种基于“物体”的场景管理技术,广泛应用于碰撞检测、射线相交测试之类的场合。BVH的数据结构其实就是一棵二叉树(Binary Tree)。它有两种节点(Node)类型:Interior Node 和Leaf Node。前者也是非叶子节点,即如果一个Node不是Leaf Node,它必定是Interior Node。Leaf Node 是最终存放物体/们的地方,而Interior Node存放着代表该划分(Partition)的包围盒信息,下面还有两个子树有待遍历。使用BVH需要考虑两个阶段的工作:构建(Build)和遍历(Traversal)。另一种是景物空间分割技术,包括BSP tree,KD tree Octree Grid BSP:二叉空间区分树 OCTree:划分二维平面空间无限四等分 Z-buffer算法 算法描述:1、帧缓冲器中的颜色设置为背景颜色2、z缓冲器中的z值设置成最小值(离视点最远)3、以任意顺序扫描各多边形a) 对于多边形中的每一个采样点,计算其深度值z(x,y) b) 比较z(x, y)与z缓冲器中已有的值zbuffer(x,y)如果z(x, y) >zbuffer(x, y),那么计算该像素(x, y)的光亮值属性并写入帧缓冲器更新z缓冲器zbuffer(x, y)=z(x, y) Z-buffer算法是使用广泛的隐藏面消除算法思想为保留每条投影线从COP到已绘制最近点距离,在投影后绘制多边形时更新这个信息。存储必要的深度信息放在Z缓存中,深度大于Z缓存中已有的深度值,对应投影线上已绘制的多边形距离观察者更近,故忽略该当前多边形颜色,深度小于Z缓存中的已有深度值,用这个多边形的颜色替换缓存中的颜色,并更新Z缓存的深度值。 void zBuffer() {int x, y; for (y = 0; y < YMAX; y++) for (x = 0; x < XMAX; x++) { WritePixel (x, y, BACKGROUND_VALUE); WriteZ (x, y, 1);} for each polygon { for each pixel in polygon’s projection { //plane equation doubl pz = Z-value at pixel (x, y); if (pz < ReadZ (x, y)) { // New point is closer to front of view WritePixel (x, y, color at pixel (x, y)) WriteZ (x, y, pz);}}}} 优点:算法复杂度只会随着场景的复杂度线性增加、无须排序、适合于并行实现 缺点:z缓冲器需要占用大量存储单元、深度采样与量化带来走样现象、难以处理透明物体 着色器编程方法vert. frag 着色器初始化:1、将着色器读入内存2、创建一个程序对象3、创建着色器对象4、把着色器对象绑定到程序对象5、编译着色器6、将所有的程序连接起来7、选择当前的程序对象8、把应用程序和着色器之间的uniform变量及attribute变量关联起来。 Vertex Shader:实现了一种通用的可编程方法操作顶点,输入主要有:1、属性、2、使用的常量数据3、被Uniforms使用的特殊类型4、顶点着色器编程源码。输入叫做varying变量。被使用在传统的基于顶点的操作,例如位移矩阵、计算光照方程、产生贴图坐标等。Fragment shader:计算每个像素的颜色和其他属性,实现了一种作用于片段的通用可编程方法,对光栅化阶段产生的每个片段进行操作。输入:Varying 变量、Uniforms-用于片元着色器的常量,Samples-用于呈现纹理、编程代码。输出:内建变量。 观察变换 建模变换是把对象从对象标架变换到世界标架 观察变换把世界坐标变换成照相机坐标。VC是与物理设备无关的,用于设置观察窗口观察和描述用户感兴趣的区域内部分对象,观察坐标系采用左手直角坐标系,可在用户坐标系中的任何位置、任何方向定义。其中有一坐标轴与观察方向重合同向并与观察平面垂直。观察变换是指将对象描述从世界坐标系变换到观察坐标系的过程。(1):平移观察坐标系的坐标原点,与世界坐标系的原点重合,(2):将x e,y e轴分别旋转(-θ)角与x w、y w轴重合。 规范化设备坐标系 规范化设备坐标系是与具体的物理设备无关的一种坐标系,用于定义视区,描述来自世界坐标系窗口内对象的图形。 光线与隐式表面求交 将一个对象表面定义为f(x,y,z)=f(p)=0,来自P0,方向为d的光线用参数的形式表示为P(t)=P0+td. 交点位置处参数t的值满足:f(P0+td)=0,若f是一个代数曲面,则f是形式为X i Y j Z k的多项式之和,求交就转化为寻求多项式所有根的问题,满足的情况一:二次曲面,情况二:品面求交,将光线方程带入平面方程:p*n+c=0可得到一个只需做一次除法的标量方程p=p0+td。可通过计算得到交点的参数t的值:t=(p0*n+c)/(n*d). 几何变换T R S矩阵表示 三维平移T 三维缩放S旋转绕z轴Rz( ) 100dx 010dy 001dz 0001 Sx000 0Sy00 00Sz0 0001 cos-sin00 sin cos00 0010 0001 θθ θθ 旋转绕x轴Rx(θ) 旋转绕y轴Ry(θ) 1000 0cos-sin0 0sin cos0 0001 θθ θθ cos0sin0 0100 -sin0cos0 0001 θθ θθ 曲线曲面 Bezier曲线性质:Bezier曲线的起点和终点分别是特征多边形的第一个顶点和最后一个顶点。曲线在起点和终点处的切线分别是特征多边形的第一条边和最后一条边,且切矢的模长分别为相应边长的n倍;(2)凸包性;(3)几何不变性(4)变差缩减性。端点插值。 均匀B样条曲线的性质包括:凸包性、局部性、B样条混合函数的权性、连续性、B样条多项式的次数不取决于控制函数。 G连续C连续 C0连续满足:C1连续满足: (1)(0) p(1)=(1)(0)(0) (1)(0) px qx py q qy pz qz == ???? ???? ???? ???? (1)(0) p'(1)=(1)'(0)(0) (1)(0) p x q x p y q q y p z q z == ???? ???? ???? ???? C0(G0)连续:曲线的三个分量在连接点必须对应相等 C1连续:参数方程和一阶导数都对应相等 G1连续:两曲线的切线向量成比例 三维空间中,曲线上某点的导数即是该点的切线,只要求两个曲线段连接点的导数成比例,不需要导 数相等,即p’(1)=aq’(0) 称为G1几何连续性。将该思想推广到高阶导数,就可得到C n和G n连续性。

计算机图形学实验报告 (2)

中南大学信息科学与工程学院 实验报告实验名称 实验地点科技楼四楼 实验日期2014年6月 指导教师 学生班级 学生姓名 学生学号 提交日期2014年6月

实验一Window图形编程基础 一、实验类型:验证型实验 二、实验目的 1、熟练使用实验主要开发平台VC6.0; 2、掌握如何在编译平台下编辑、编译、连接和运行一个简单的Windows图形应用程序; 3、掌握Window图形编程的基本方法; 4、学会使用基本绘图函数和Window GDI对象; 三、实验内容 创建基于MFC的Single 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))

2015年计算机图形学期末复习题(学生版)

期末复习题 一.填空题 1.X扫描线算法中,每次用一条扫描线进行填充,对一条扫描线填充的过程可分为4个步骤:求交、排序、交点配对、区域填色。 2.一组型值点来指定曲线曲面的形状时,形状完全通过给定的型值点列,用该方法得到的曲线曲面称为曲线曲面的拟和,而用控制点列来指定曲线曲面 的形状时,得到的曲线曲面不一定通过控制点列,该方法称为曲线曲面 的逼近。 3.在中点画线算法中(假设直线的斜率00,下一个点取_____________,d的增量表达式为_____________;若d<0,下一个点取_____________,d的增量表达式为_____________。 4.种子填充算法的填充区域可以分为_________连通区域和____________连通区域。 5、在生成圆弧的正负法中,设圆的方程为 F(x,y)=X2+Y2-R2=0;假设求得 Pi 的 坐标为(xi,yi);则若F(xi,yi)<0,下一个点取_____________;若 F(xi,yi)>0, 下一个点取_____________。 6、在Cohen-Sutherland线段裁剪算法中,假设线段P1P2的编码分别为 CODE1、 CODE2,则若_____________成立,表示线段 P1P2 是显然可见线段;若 _____________成立,表示线段P1P2是显然不可见线段。 7.常用的直线扫描转换算法有:_____________,_______________, _______________。 8.曲线和曲面的基本表示方法有两种:______________,______________。参数表 示,非参数表示。 9.反走样的目的是_______________________________________________。

计算机图形学复习课总结

绪论 1点阵法和参数法的概念。图形、图像的概念。 点阵法是用具有颜色信息的点阵来表示图形的一种方法,它强调图形由哪些点组成,并具有什么灰度或色彩。 参数法是以计算机中所记录图形的形状参数与属性参数来表示图形的一种方法。 通常把参数法描述的图形叫做图形(Graphics) 把点阵法描述的图形叫做图象(Image) 2 计算机图形学的概念? 计算机图形学是研究怎样用计算机表示、生成、处理和显示图形的一门学科。 3图形包括哪两方面的要素,试举例说明。 图形包括两方面的要素,其中有几何要素和非几何要素 1. 几何要素:点,线,面,体等; 2. 非几何要素:明暗,灰度,色彩等 4一个交互性的图形系统具有哪些功能? 5个功能:输入功能、存储功能、计算功能、输出功能和交互功能 5图形输出设备包括什么?常用的图形绘制设备有哪两种? 图形输出设备包括图形显示设备和图形绘制设备,常用的图形绘制设备有打印机和绘图仪。 6与计算机图形学相关的学科有哪些?各自研究的内容是什么?

计算机视觉:研究用计算机来模拟生物外显或宏观视觉功能的科学和技术图像处理:对图象进行各种加工以改善图象的视觉效果 C语言程序基础(课件中p17, p55-59,常用画图函数) 1已知画“王”的C语言程序(如下),要求改编一个画“田”字的程序,该字的字高和字宽均为50,字的左上角点坐标为(60, 80)。 #include "graphics.h" #include "conio.h" main() { int gdriver=DETECT,gmode; int x,y; initgraph(&gdriver,&gmode,“”); /*初始化图形系统*/ cleardevice(); /*清除图形屏幕*/ moveto(100,40); /*绝对移动光标*/ linerel(40,0); /*从当前位置按增量方式画线*/ x=getx(); y=gety(); moveto(x,y+20); linerel(-40,0); moverel(0,20); /* 以增量方式移动当前光标*/ linerel(40,0); moverel(-20,0); linerel(0,-40); getch(); closegraph(); /*关闭图形系统,返回文本模式*/ } 2画一个填充颜色的圆(画一个填充颜色的矩形,已知矩形的左下角(0,20),右上角坐标为(100,120)),圆心坐标(60,60),半径100,要求背景色为1号色(blue),圆的边界色为红色,填充色为Green,(函数:circle floodfill) #include "graphics.h"

相关主题