文档库 最新最全的文档下载
当前位置:文档库 › 计算机图形学实验报告2

计算机图形学实验报告2

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

计算机图形学实验报告

实验二、三维网格模型光顺

一、实验目的与基本要求:

(1)掌握Obj 文件的读入;

(2)利用给定的数据结构类,建立读入网格模型数据结构;

(3)利用OpenGL 类库,对三维模型进行绘制;

(4)利用OpenGL 类库,增加采用鼠标交互方式对三维模型进行旋转、放缩、平移等操作;

(5)实现Laplacian 方法的三维模型光顺操作,并观察三维模型光顺过程;

二、实验设备(环境)及要求

1.操作系统:Windows XP 或Windows 7

2.编程环境:Microsoft Visual Studio 2010 ,OpenGL 库函数

3.界面框架:Win32,MFC,QT选择其中一种

三、实验内容与步骤实验分为以下几个步骤:

(1)掌握Obj 文件的读入顶点和面的个数;

(2)建立数组存储点的坐标及面上的点数;

(3)存储顶点的邻接面数,并记录每个顶点周围的邻接点

(4)计算每个面的法向利用OpenGL 类库,增加采用鼠标交互方式对三维模型进行旋转、放缩、平移等操作;

(5)利用面法向及顶点坐标进行绘制几何体

(6)实现鼠标对物体旋转、平移、缩放的算法

(7)实现Laplacian 方法的三维模型光顺操作,并观察三维模型光顺过程;

四、实现过程说明及成果展示:

(1)掌握Obj 文件的读入顶点和面的个数;由于obj 文件的存储形式是

v x1 x2 x3;

f v1 v2 v3;

这种形式,所以在记录点和面的数量时,只需按行读取,然后再判断首字母是v/f 即可实现代码如下:

(2)建立数组存储点的坐标及面上的点数;

数组的大小由点数和面数决定,点数组和面数组均由0 开始记录,故后面再用面对应点的时候,由于面上点是从1 开始记录,故需要减1 然后使用,代码如下:

(3)存储顶点的邻接面数,并记录每个顶点周围的邻接点记录点邻接面的是新建一个数组,

在读面的时候,将该面的序号存入对应点的数组中,然后再在每个面上取一点,记录到点的邻接点数组中,在每个面上取得的点为向外右手方向的下一个点,实现代码如下:

(4)计算每个面的法向

计算面的法向方式为面上右手方向上的两向量的叉乘得到,即所用代码为:

(8) 利用面法向及顶点坐标进行绘制几何体 用法向绘制的方式是

先用 glNormal3fv(v) 指出面的法向 ;再用 glVertex3f 传入面上点的坐标; 由于我将

glNormal3fv(v ) 中写在算法向所以我直接对此直接调用即可,代码如下:

(9)实现鼠标对物体旋转、平移、缩放的算法

平移:利用 Transform 函数和键盘事件来改变参数, w,s,a,d 分别控制绘制的 kitty 猫的上下左 右的移动:实现代码如下:

旋转:利用gllookat(); 函数设定了观察角度,并用鼠标事件改变参数,用实现观察视角的变化实现物体的旋转,代码如下:

缩放:运用glScalef 方法和键盘事件改变参数,实现物体的放大和缩小,代码如下:(10)实现Laplacian 方法的三维模型光顺操作,并观察三维模型光顺过程;

Laplacian 方法的原理是利用目标点与其所有邻接点平均后的点的差向量,对目标点的坐标进行变换的过程,具体方法是:

①建立每个点的邻接顶点数组,存储每个点的邻接点

②对每个顶点的邻接点进行求平均,即将邻接点的坐标求和后除以邻接点个数,从而得到邻接平均点

③得到优化向量

优化向量= 邻接平均点- 目标点

④设定优化度参数λ,得到优化后的新坐标新坐标= 目标点+ λ* 优化

向量

在程序中,对于第num 个顶点,我设定的变量为

目标点vArr

邻接平均点v0

优化向量l

新坐标数组vNewArr

具体代码如下:

I

for (int i

0; i < m; i 卄){

v0[0] + VArr [ne∑tVArι?num] l][0];

vθ[l] + vArr[nextVArr[num][i]- -1]⑴;

vθ[2] +

VArr [nextVArr[num][il - ?1]⑵:

}

E

if (In != O) {

for (int i = 0; i < 3; i 十+)

vθ[i] /= m;

}

l[0] = vθEθ] - VArr[num][0]; 1[1] = vθ[l] - VArr[num]11]: 1[2] = vθ[2] - vArr[num] [2];

VXeWArr[nuπj [0] VXeWArr[nuιrl LIl

VXeWArr[num][2]

}

for (Lnt i = 0: i <

vArr[i][0] = VNeWArr[i]10]; vArr[i][1] = VNeWArr[i][1]:

VArrLil[2] = VNeWArr[i][2]: }

=VArr [num] [θ] + l[0] * 0. 3; =vArr [num] [1] ÷ 1[1] * 0. 3; =VArr [num] [2] + 1 [2] * 0.3;

v_IIUln: i 十+) {

五、结果展示及说明计算面法向后直接绘制(未光顺):

光顺进行一次

光顺多次

利用点绘制结果为

旋转后

缩放后

平移后

六、心得体会

(1)计算面法向时法向量的方向没有运用右手方向,导致有的面法向向里,从而出现雪花

(2)在运用Laplacian 算法进行求邻接平均点时未初始化邻接平均点数组,导致平均点的累加

从而出现越光顺越粗糙的现象

(3)在obj 文件中面对应顶点数和顶点数组的标号相差 1.在运用的时候需减1,面

从1 开始记顶点,顶点数组从0 开始记顶点

七、实验代码

#define GLUT_DISABLE_ATEXIT_HACK

#include

#include

#include

#include

#include

#include

#include

#include

#include

usingnamespace std;

int v_num = 0; // 记录点的数量

int f_num = 0; // 记录面的数量

int vn_num = 0; // 记录法向量的数量

int vt_num = 0;

GLfloat **vArr; // 存放点的二维数组

GLfloat **vNewArr; // 存放点的二维数组int **fvArr; // 存放面顶点的二维数组GLfloat **fnArr; // 存放面法向量的二维数组int **ftArr;

int **vfArr; // 存放顶点临接的面数的数组

int **nextVArr; // 存放下一个临界顶点的数组

GLfloat **vnArr; // 存放点法向量的二维数组string s1, s2, s3, s4;

GLfloat f2, f3, f4; int num1, num2, num3;

typedef GLfloatpoint3 [3];

point3 x, y,l; // 平面上的两个向量x,y 和拉普拉斯向量l

static GLfloat theta[] = { 0.0,0.0,0.0 };

static GLint axis = 2;

static GLdouble viewer[] = { 0.0, 0.0, 5.0 }; /* initial viewer location */

static GLdouble Tran[] = { 0.0,0.0,0.0 };

static GLdouble sca = 1.0;

void getLineNum( string addrstr ) // 获取点和面的数量

{

ifstream infile( addrstr .c_str()); // 打开指定文件if ( ! infile) {

cout <<"open error!" << endl; exit(1);

}

string sline; // 每一行

int i = 0, j = 0;

while (getline(infile, sline)) // 从指定文件逐行读取

{

if (sline [0] == 'v' )

{ v_num++;

}

if (sline [0] == 'f' )

{ f_num++;

}

}

}

int readfile( string addrstr ) // 将文件内容读到数组中去

//getLineNum(addrstr);

//new 二维数组

vArr = newGLfloat *[v_num];

for ( int i = 0; i < v_num; i++) {

vArr[i] = newGLfloat [3];

}

vNewArr = newGLfloat *[v_num]; for ( int i = 0; i < v_num; i++) {

vNewArr[i] = newGLfloat [3]; }

vnArr = newGLfloat *[vn_num]; for ( int i = 0; i < vn_num; i++) {

vnArr[i] = newGLfloat [3];

}

vfArr = newint *[v_num];

for ( int i = 0; i < v_num; i++) {

vfArr[i] = newint [10];

for ( int j = 0; j < 10; j++) { vfArr[i][j] = -1;

}

}

nextVArr = newint *[v_num]; for ( int i = 0; i < v_num; i++) {

nextVArr[i] = newint [10];

for ( int j = 0; j < 10; j++) { nextVArr[i][j] = -1;

}

}

fvArr = newint *[f_num]; fnArr = newGLfloat *[f_num]; ftArr = newint *[f_num]; for ( int i = 0; i < f_num; i++) {

fvArr[i] = newint [3];

fnArr[i] = newGLfloat [3];

ftArr[i] = newint [10];

}

ifstream infile( addrstr .c_str()); if ( ! infile) {

TO ro o n 0

?u --s )u - IUe

①」

ω6u ?s -

)

IH

型?二(

5-H O 」①U=S)

+^

±

3H Ξ-=,EJ

<>

S2U

三==」」<>

ZJ

H

≡-=

,EJ <>

S A A C A A A A L S

A A U -S

?u =s )u ωIUe

①」

ω

6u ?s -

<

型?

->H o j

①U=S)

(φu =s φ=μ

ηφU =φ6) φ

=f O H E E -O H Ψ∣O O H

=IU

?——<=φu =

s 6u ?s

^)七X

)(+±°L V

二0 上 I--)」OJ

Hgq

QEnU

H 曰

〔L &E n

u r o l x ① U

jz >l H ≡

L 7L u n u ,Ej

L-H

≡L

7e n u ,Ej <>

七 二+

+

「o L V ZEnU

H 曰

〔V L E

FlUKUOlXeU

jz d H

曰(τ7L E n u ,Ej

τ7H ≡τ7L E n u ,Ej <>七

二+±O L V 一O 上 IU

二」

OJ

QE N UH

CM =

Ψ

I ,EJ V

>J ZIUnU

if (vfArr[num3-1][i] == -1)

{ vfArr[num3-1][i] = kk;

nextVArr[num3-1][i] =

num1; break ;

}

}

kk++;

}

}

return 0;

}

// 计算面法向

void nomal( point3 p) { /* 矢量的归一化*/ //double sqrt();

float d = 0.0; int i;

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

d += p[i] * p[i];

d = sqrt(d);

if (d > 0.0)

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

p[i] /= d;

}

void getFaceNormal( point3 A, point3 B, point3 C) {

x[0] = C[0] - A[0];

x[1] = C[1] - A[1];

x[2] = C[2] - A[2];

y[0] = A[0] - B[0];

y[1] = A[1] - B[1];

y[2] = A[2] - B[2];

point3 v;

v[0] = x[1] * y[2] - x[2] * y[1]; v[1] = x[2] * y[0] - x[0] * y[2]; v[2] = x[0] * y[1] - x[1] * y[0]; nomal(v);

glNormal3fv(v);

}

void Laplacian() {

for ( int num = 0; num < v_num; num++) { int m = 0;

// 求得点的邻接面数

for ( int i = 0; i < 10; i++) {

if (nextVArr[num][i] != -1) {

m++;

} else {

break ; }

}

point3 v0;

for ( int i = 0; i < 3; i++) {

v0[i] = 0;

}

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

v0[0] += vArr[nextVArr[num][i] - 1][0];

v0[1] += vArr[nextVArr[num][i] - 1][1]; v0[2] += vArr[nextVArr[num][i] -

1][2];

}

if (m != 0) {

for ( int i = 0; i < 3; i++)

v0[i] /= m;

}

l[0] = v0[0] - vArr[num][0];

l[1] = v0[1] - vArr[num][1];

l[2] = v0[2] - vArr[num][2];

vNewArr[num][0] = vArr[num][0] + l[0] * 0.3;

vNewArr[num][1] = vArr[num][1] + l[1] * 0.3; vNewArr[num][2] = vArr[num][2] + l[2]

* 0.3;

}

for ( int i = 0; i < v_num; i++) {

vArr[i][0] = vNewArr[i][0];

vArr[i][1] = vNewArr[i][1];

vArr[i][2] = vNewArr[i][2];

}

}

void init( void )

{

getLineNum( "H:\\kitten_noisy.obj" readfile( "H:\\kitten_noisy.obj" double viewer[] = { 0.0, 0.0, 8.0 };

GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };

GLfloat mat_shininess[] = { 50.0 }; // 材料的镜面指数,其值越大越精细 GLfloat light_position[] = { 1.0, 1.0f, 1.0, 0.0 }; GLfloat white_light[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat lmodel_ambient[] = { 0.1, 0.1, 0.1, 1.0 }; glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel( GL_SMOO)T; H

glMaterialfv( GL_FRON, T GL_SPECULA, mRat_specular); glMaterialfv( GL_FRON, T GL_SHININES,S mat_shininess);

glLightfv( GL_LIGHT0, GL_POSITIO,N light_position); // 光源位置 glLightfv( GL_LIGHT0, GL_DIFFUS,E white_light); // 漫反射光源 glLightfv( GL_LIGHT0, GL_SPECULA, wRhite_light); // 镜面反射光源 glLightModelfv( GL_LIGHT_MODEL_AMBIE, lNmTodel_ambient); // 环境光源 // glEnable(glMaterialf);

glEnable( GL_LIGHTING); // 启动光照 glEnable( GL_LIGHT0); // 启用 0 度光源 glEnable( GL_DEPTH_TES);T// 启动深度测试

/*

glShadeModel(GL_SMOOTH); //

Enable Smooth Shading

glClearColor(0.0f, 0.0f, 0.0f, 0.5f); //

黑色背景

glClearDepth(1.0f);

// 深度缓冲区设置

glEnable(GL_DEPTH_TEST); //

允许深度测试

glDepthFunc(GL_LEQUAL);

// 定义深度测试类型

glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); //

Really Nice Perspective Calculation

*/

); );

/* initial viewer

location */

void display( void )

{

glClear( GL_COLOR_BUFFER_ B| ITGL_DEPTH_BUFFER_)B; IT glLoadIdentity();

gluLookAt(viewer[0], viewer[1], viewer[2], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 的位置 glRotatef(theta[0], 1.0, 0.0, 0.0); glRotatef(theta[1], 0.0, 1.0, 0.0);

//glRotatef(theta[2], 0.0, 0.0, 1.0); glTranslatef(Tran[0], Tran[1], Tran[2]); glScalef(sca, sca, sca);

//glPolygonMode(GL_FRONT_AND_BACK, GLU_FILL); glBegin( GL_TRIANGLE)S; //getFaceNormals();

for ( int i = 0; i

{

getFaceNormal(vArr[fvArr[i][0] - 1], vArr[fvArr[i][1]

- 1]);

glVertex3f(vArr[fvArr[i][0] - 1][0], vArr[fvArr[i][0] -

1][1], vArr[fvArr[i][0] - 1][2]);

glVertex3f(vArr[fvArr[i][1] - 1][0], vArr[fvArr[i][1] -

1][1], vArr[fvArr[i][1] - 1][2]);

glVertex3f(vArr[fvArr[i][2] - 1][0], vArr[fvArr[i][2] - 1][1], vArr[fvArr[i][2] -

1][2]);

}

glEnd();

/* glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glBegin(GL_POINTS); glColor3f(1.0, 1.0, 1.0); for (int i = 0; i < v_num; i++) {

glVertex3fv(vArr[i]); glNormal3fv(fnArr[i]);

}

glEnd(); */

glFlush(); // 强制绘图 glutSwapBuffers();

}

void reshape( int w, int h)

{

glViewport(0, 0, ( GLsizei )w, ( GLsizei )h); // 视口设置

// 设置观察

- 1], vArr[fvArr[i][2]

计算机图形学作业

计算机图形学第一次作业 计算机X班XXX 1XXX010XXX 1.你是否想用图形学的有关知识去解决一两个实际问题?你想解决的问题是什么?考虑如何解决? 答:我希望可以解决的有设计汽车外壳和制作动画。 解决方法:(1)汽车外壳 使用3D MAX/AutoCAD软件进行设计。 (2)制作动画 利用动画制作软件(3D MAX)在计算机上制作动画 2.某彩色图形显示系统,CRT显示器的分辨率为1024×1024,它可以从2^17次方种颜色中选择出2^15次方来显示,其帧缓冲器的容量应该如何计算?查色表的长度和宽度应为多少? 解:16b==2B 因为分辨率为1024x1024 所以1024*1024*2B=2MB 3.采用Bresenham画线算法,绘出起点(1,3),终点为(9,18)的直线段。 解: void DrawBresenhamline(int x0, int y0, int x1, int y1) { int dx = x1 - x0;//x偏移量 int dy = y1 - y0;//y偏移量 int ux = dx >0 ?1:-1;//x伸展方向 int uy = dx >0 ?1:-1;//y伸展方向 int dx2 = dx <<1;//x偏移量乘2 int dy2 = dy <<1;//y偏移量乘2 if(abs(dx)>abs(dy)) {//以x为增量方向计算 int e = -dx; //e = -0.5 * 2 * dx,把e 用2 * dx* e替换 int x = x0;//起点x坐标 int y = y0;//起点y坐标 for (x = x0; x < x1;x+=ux) { printf ("%d,%d\n",x, y); e=e + dy2;//来自2*e*dx= 2*e*dx + 2dy (原来是e = e + k) if (e > 0)//e是整数且大于0时表示要取右上的点(否则是右下的点) { y += uy; e= e - dx2;//2*e*dx = 2*e*dx - 2*dx (原来是e = e -1) } } } else {//以y为增量方向计算

计算机图形学实验报告

《计算机图形学》实验报告姓名:郭子玉 学号: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; }

北语 20春《计算机图形学》作业_1234

20春《计算机图形学》作业_1 一、单选题 ( 每题4分, 共10道小题, 总分值40分 ) 1. A. (A) B. (B) C. (C) D. (D) 答:A V:131·9666·2906 2.最小最大判定法是一种快速拒绝判定方法,是利用多边形的___来替代,从而可以粗略判定两个多边形之间的关系。 A. 外接矩形 B. 最小外接凸包 C. 最小外接圆 D. 最小外接矩形 答:D 3.由空间的n+1个控制点生成的k次准均匀B样条曲线是由若干段B样条曲线逼近而成的, () A. 每个曲线段的形状仅由点列中的k个顺序排列的点所控制 B. 每个曲线段的形状仅由点列中的k+1个顺序排列的点所控制 C. 每个曲线段的形状仅由点列中的k+2个顺序排列的点所控制 D. 每个曲线段的形状仅由点列中的k+3个顺序排列的点所控制 答:B 4. 答:C 5. 答:C 6.如果不采用齐次坐标表示法,则___不能使用变换矩阵来实现。

A. 平移变换 B. 对称变换 C. 旋转变换 D. 比例变换 答:A 7.使用Bresenham直线生成算法画一条直线:起点和终点分别为A(15,12)和B(30,18),则起点的下一个点的坐标(x,y)和误差p分别为()。 A. (x,y) = (16,13),p = 9 B. (x,y) = (16,12),p = 9 C. (x,y) = (16,13),p = -21 D. (x,y) = (16,12),p = -21 答:B 8.由空间的n+1个控制点生成的k次准均匀B样条曲线() A. 是由n-k-1段B样条曲线逼近而成的 B. 是由n-k段B样条曲线逼近而成的 C. 是由n-k+1段B样条曲线逼近而成的 D. 是由n-k+2段B样条曲线逼近而成的 答:C 9.按照所构造的图形对象来分,点、曲线、平面、曲面或实体属于___,而山、水、云、烟等自然界丰富多彩的对象属于___。 A. 规则对象、不规则对象 B. 规则对象、属性对象 C. 不规则对象、几何对象 D. 不规则对象、属性对象 答:A 10.光线跟踪算法的主要计算量在于() A. 基于Phong模型的明暗度计算 B. 反射方向计算 C. 折射方向计算 D. 求交计算 答:D 二、多选题 ( 每题4分, 共5道小题, 总分值20分 ) 1.在几何造型中,下列论述中哪些是正确的___。 A. 在形体定义中,允许存在孤立的点 B. 面是形体上一个有限、非零的区域,一般由一个外环和若干个内环组成,但也可以没有任何环 C. 环是有序、有向边组成的面的封闭边界,环中的边不能相交,相邻的两条边可以共享一个端点 D. 形体上任意一点的足够小的邻域在拓扑上应该是一个等价的封闭圆

计算机图形学作业-Display-答案分析

计算机图形学作业I 一.判断题 1.齐次坐标提供了坐标系变换的有效方法,但仍然无法表示无穷远的点;(×) 2.若要对某点进行比例、旋转变换,首先需要将坐标原点平移至该点,在新的坐标系下做比例或旋转变换,然后在将原点平移回去;(√) 3. 相似变换是刚体变换加上等比缩放变换;(√) 4. 保距变换是刚体变换加上镜面反射;(√) 5. 射影变换保持直线性,但不保持平行性。(√) 二、填空题 1.透视投影的视见体为截头四棱锥形状;平行投影的视见体为长方体形状。 2.字符的图形表示可以分为矢量表示和点阵表示两种形式。 3.仿射变换保持直线的平行性 4.刚体变换保持长度 5.保角变换保持向量的角度 三、单项选择题 1. 分辨率为1024×1024的显示器各需要多少字节位平面数为24的帧缓存?( D) A. 512KB; B. 1MB; C. 2MB; D. 3MB ; 2. 在透视投影中,主灭点的最多个数是( C ) A 1; B 2; C 3; D 4 3. 以下关于图形变换的论述不正确的是( B ) A. 平移变换不改变图形大小和形状,只改变图形位置; B. 拓扑关系不变的几何变换不改变图形的连接关系和平行关系; C.旋转变换后各图形部分间的线性关系和角度关系不变,变换后直线的长度不变 D.错切变换虽然可引起图形角度的改变,但不会发生图形畸变; 4. 使用下列二维图形变换矩阵:将产生变换的结果为( D ) A. 图形放大2倍; B. 图形放大2倍,同时沿X、Y1个绘图单位; C.沿X坐标轴方向各移动2个绘图单位; D.沿X坐标轴方向放大2倍,同时沿X、Y坐标轴方向各平移1个绘图单位。 5. 下列有关投影的叙述语句中,正确的论述为(B ) A. 透视投影具有近小远大的特点; B. 平行投影的投影中心到投影面距离是无限的; C. 透视投影变换中,一组平行于投影面的线的投影产生一个灭点; T =

计算机图形学实验报告 (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))

计算机图形学实验一

实验一二维基本图元的生成与填充 实验目的 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

计算机图形学作业-Display-答案

计算机图形学作业 I 一.判断题 1.齐次坐标提供了坐标系变换的有效方法,但仍然无法表示无穷远的点;(×) 2.若要对某点进行比例、旋转变换,首先需要将坐标原点平移至该点,在新的坐标系下做比例或旋转变换,然后在将原点平移回去;(√) 3. 相似变换是刚体变换加上等比缩放变换;(√) 4. 保距变换是刚体变换加上镜面反射;(√) 5. 射影变换保持直线性,但不保持平行性。(√) 二、填空题 1.透视投影的视见体为截头四棱锥形状;平行投影的视见体为长方体形状。 2.字符的图形表示可以分为矢量表示和点阵表示两种形式。 3.仿射变换保持直线的平行性 4.刚体变换保持长度 5.保角变换保持向量的角度 三、单项选择题 1. 分辨率为1024×1024的显示器各需要多少字节位平面数为24的帧缓存?( D) A. 512KB; B. 1MB; C. 2MB; D. 3MB ; 2. 在透视投影中,主灭点的最多个数是( C ) A 1; B 2; C 3; D 4 3. 以下关于图形变换的论述不正确的是( B ) A. 平移变换不改变图形大小和形状,只改变图形位置; B. 拓扑关系不变的几何变换不改变图形的连接关系和平行关系; C.旋转变换后各图形部分间的线性关系和角度关系不变,变换后直线的长度不变 D.错切变换虽然可引起图形角度的改变,但不会发生图形畸变; 4. 使用下列二维图形变换矩阵:将产生变换的结果为( D ) A. 图形放大2倍; B. 图形放大2倍,同时沿X、Y1个绘图单位; C.沿X坐标轴方向各移动2个绘图单位; D.沿X坐标轴方向放大2倍,同时沿X、Y坐标轴方向各平移1个绘图单位。 5. 下列有关投影的叙述语句中,正确的论述为(B ) A. 透视投影具有近小远大的特点; B. 平行投影的投影中心到投影面距离是无限的; C. 透视投影变换中,一组平行于投影面的线的投影产生一个灭点; T =

计算机图形学实验报告

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握DDA直线扫描转换算法。 3.深入了解直线扫描转换的编程思想。 二、【实验内容】 1.利用DDA的算法原理,编程实现对直线的扫描转换。 2.加强对DDA算法的理解和掌握。 三、【测试数据及其结果】 四、【实验源代码】 #include

#include #include #include GLsizei winWidth=500; GLsizei winHeight=500; void Initial(void) { glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0); } void DDALine(int x0,int y0,int x1,int y1) { glColor3f(1.0,0.0,0.0); 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); glV ertex2i(int(x+0.5),(int)(y+0.5)); glEnd(); x+=xIncre; y+=yIncre; } } void Display(void) { glClear(GL_COLOR_BUFFER_BIT); DDALine(100,100,200,180); glFlush(); }

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

大学实验报告 学院: 计算机科学与信息专业:计算机科学与技术班级:计科101 喻志华学号1008060024 实验组实验时间2013/3/30 指导教师吴云成绩实验项目名称圆和椭圆的生成算法 实 验目的 根据圆的Brensenham算法、中点算法和中点改进算法,以及椭圆的中点算法,编写程序,实现圆与椭圆的绘制。 实 验要求1.圆、椭圆的中点算法 2.圆的优化后的算法:二次差分法 3.编制源程序; 4.对于一些较为重要的算法,可以摘抄在报告中; 实验原理 1.中点算法 A.构造函数 F(X,Y)=X2+Y2-R2,则可知 F(M)< 0:M在圆,取T F(M)≥ 0:M在圆外,取 B B.第一个M点的值有: (一)DM0 = F(M0)= F(1,R-0.5)= 12+(R-0.5)2-R2=1.25-R 若 D=d-0.25 则判别式d<0等价于D<-0.25。即DM0=1-R与DM0=1.25-R等价。 (二)如果dM<0,表示下一中点M在圆,选择T点,且: dMT= F(MT)= F(xp+2,yp-0.5) 则: ?dMT= dMT - dM=2xp+3 (三)如果dM>0,表示下一中点M在圆外,选择B点,且: dMB= F(xMB,yMB)= F(xp+2,yp-1.5)则: ?dMB= dMB - dM=2xp-2yp +5 2.中点改进算法——增量算法

设圆上某点I(xi,yi);则下一点为J点,坐标为(xi+1,yj)dT=2xp+3; dB=2(xp-yp)+5; d1=d2=0; 因为x每次加1,所以 dj点 A.将增量?dMT=2(xi+1)+3=dT+2=dT+d1; (d1=d1+2) B.将增量?dMB=2(xi+1)-2yj+5=dB+d1+d2; dj较之于di,x部分增量增加相同的量,y部分两种情况 1.取T点,yj不减1,y部分增量的增量无变化 2.取B点,yj减1,y部分增量的增量加 2. 所以当y—时,d2=d2+2 因此,d<0, d=d+dT+d1; d>0, d=d+dB+d1+d2; 3.Brensenham算法 1.基本思想: 当|D(Ti)|≥|D(Bi)|,则Bi更接近于圆周,选择Bi; 当|D(Ti)|<|D(Bi)|,则Ti更接近于圆周,选择Ti; 若令D=|D(Ti)|-|D(Bi)| 则D≥0,取Bi; D<0,取Ti; 2.三种情况 A.设x0=0,y0=R;则T1为(1,R),B1为(1,R-1), d1=(12+R2-R2)+[(12+(R-1)2-R2]=3-2R B.若di<0,则取Ti作为下一点,即Pi(xi-1+1,yi-1); d(i+1)=di+4xi-1+6 C.若di≥0,则取Bi作为下一点,即Pi(xi-1+1,yi-1-1), d(i+1)=di+4(xi-1-yi-1)+10 4.椭圆的中点算法

北交20春《计算机图形学》在线作业二答案

(单选题)1: 在下列有关曲线和曲面概念的叙述语句中,错误的论述为( ) A: 实体模型和曲面造型是CAD系统中常用的主要造型方法,曲面造型是用参数曲面描述来表示一个复杂的物体 B: 在曲线和曲面定义时,使用的基函数应有两个重要性质:凸包性和仿射不变性 C: 从描述复杂性和形状灵活性考虑,最常用的参数曲面是3次有理多项式的曲面 D: 参数形式和隐含形式都是精确的解析表示法,在计算机图形学中,它们一样好用 正确答案: D (单选题)2: 触摸屏是( )设备 A: 只是输入 B: 只是输出 C: 输入输出 D: 既不是输入也不是输出 正确答案: C (单选题)3: 要将一个“Symbol”保存下来在其它软件中使用,必须选中“Symbol”后对文档进行什么操作( ) A: “File-Save”存储文档 B: “File-Close”关闭文档 C: “File-Print”打印文档 D: “File-Export”导出文档 正确答案: D (单选题)4: 分别用编码裁剪算法和中点分割裁剪算法对一条等长的直线段裁剪,下面那一个说法是正确的( ) A: 编码裁剪算法的速度快于中点分割裁剪算法的裁剪速度 B: 编码裁剪算法的速度慢于中点分割裁剪算法的裁剪速度 C: 编码裁剪算法的速度和中点分割裁剪算法的裁剪速度一样 D: 编码裁剪算法的速度和中点分割裁剪算法的裁剪速度哪一个快,无法确定 正确答案: D (单选题)5: 在光亮度插值算法中,下列论述哪个是错误的( ) A: Gouraud明暗模型计算中,多边形与扫描平面相交区段上每一采样点的光亮度值是由扫描平面与多边形边界交点的光亮度插值得到的 B: Phong明暗处理模型中,采用了双线性插值和构造法向量函数的方法模拟高光 C: Gouraud明暗模型和Phong明暗处理模型主要是为了处理由多个平面片近似表示曲面物体的绘制问题 D: Phong明暗模型处理的物体表面光亮度呈现不连续跃变 正确答案: D (单选题)6: 在多边形的逐边裁剪算法中,对于某条多边形的边(方向为从端点S到端点P)与某条裁剪线(窗口的某一边)的比较结果共有以下4种情况,分别须输出一些顶点。请问哪种情况下输出的顶点是错误的( ) A: S和P均在可见的一侧,则输出S和P

计算机图形学作业题

计算机图形学作业题 1. 计算机中由图形的形状参数(方程或分析表达式的系数,线段的端点坐标等)加属性参数(颜色、线型等)来表示图形称图形的参数表示;枚举出图形中所有的点称图形的点阵表示,简称为图像(数字图像) 2. 什么是计算机图形学?计算机图形学有哪些研究内容? 3. 计算机图形学有哪些应用领域? 4. 计算机图形学有哪些相关学科分支?它们的相互关系是怎样的? 5. 图形系统的软件系统由哪些软件组成?举例说明。 6. 了解计算机图形系统的硬件。 7. 什么是显示器的分辨率、纵横比、刷新率? 8. 什么是像素、分辨率、颜色数?分辨率、颜色数与显存的关系? 分辨率M ?N 、颜色个数K 与显存大小V 的关系: 例:分辨率为1024像素/行?768行/ 帧,每像素24位(bit )颜色(224种颜色)的显示器,所需的显存为:1024?768?24位(bit )=1024?768?24/8=2359296字节(byte )。或:每像素16777216种颜色(24位真彩色),1024?768的分辨率,所需显存为:1024?768?log 216777216位显存=2359296字节显存。 9. 什么是图元的生成?分别列举两种直线和圆扫描转换算法。 10. OpenGL 由核心库GL(Graphics Library)和实用函数库GLU(Graphics Library Utilities)两个库组成。 11. 区域填充算法要求区域是连通的,因为只有在连通区域中,才可能将种子点的颜色扩展到区域内的其它点。 区域可分为 向连通区域和 向连通区域。区域填充算法有 填充算法和 填充算法。 12. 字符生成有哪两种方式? 点阵式(bitmap fonts 点阵字——raster 光栅方法):采用逐位映射的方式得到字符的点阵和编码——字模位点阵。 笔画式(outline fonts 笔画字——stroke 方法):将字符笔画分解为线段,以线段端点坐标为字符字模的编码。 13. 图形信息包含图形的 和 。 14. 什么是图形变换?图形变换只改变图形的 不改变图形的 。图形变换包括 和 ( )。 15. 熟练掌握二维图形的齐次坐标表示、平移、比例、旋转、对称变换以及复合变换的方法和原则。 16. 图形的几何变换包括 、 、 、 、 ;图形连续作一次以上的几何变换称 变换。 17. 试写出图示多边形绕点A(xo,yo)旋转的变换矩阵。要求写出求解过程及结果。 18. 试写出针对固定参考点、任意方向的比例变换矩阵。 19. 试写出对任意直线y=mx+b 的对称变换矩阵。 20. 什么是窗口?什么是视区?什么是观察变换? 21. 简述二维观察变换的流程。 22. 试述窗口到视区的变换步骤,并推出变换矩阵。 ??—(位) —K N M V 2log ??≥

计算机图形学实验

实验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、已知一直线段起点(0,0),终点(8,6),利用Bresenham算法生成此直线段,写出 生成过程中坐标点及决策变量d的变化情况,并在二维坐标系中,标出直线上各点。 2、试用中点画圆算法原理推导第一象限中y=0到x=y半径为R的圆弧段的扫描转换算法。(要求写清原理、误差函数和递推公式,并进行优化) 3、如下图所示多边形,若采用扫描线算法进行填充,试写出该多边形的ET表和当扫描线Y=3时的有效边表(AET表)。 4、试按左下右上顺序用四向算法,分析当S1为种子时,下图区域的填充过程。 5、将下图中的多边形ABCD先关于点C(3,4)整体放大2倍,再绕点D(5,3)顺时针旋转90 ,试推导其变换矩阵、计算变换后的图形各顶点的坐标,并画出变换后的图形。

6、已知三角形ABC 各顶点的坐标A(3,2)、B(5,5)、C(4,5),相对直线P 1P 2(线段的坐标分别为:P 1 (-3,-2) 、P 2 (8,3) )做对称变换后到达A ’、B ’、C ’。 试计算A ’、B ’、C ’的坐标值。(要求用齐次坐标进行变换,列出变换矩阵,列出计算式子,不要求计算结果) 7、试作出下图中三维形体ABCDE 的三视图。要求写清变换过程,并画出生成的三视图。 x 8、试采用Sutherland –Cohen 裁剪算法,叙述裁剪如下图所示的直线AB 和CD 的步骤: ① 写出端点A 、B 、C 、D 的编码; ② 写出裁剪原理和直线AB 、CD 的裁剪过程。 A B C D 9 、用梁友栋算法裁减如下图线段AB ,A 、B 点的坐标分别为(3,3)、(-2,-1) 裁剪窗口为wxl=0,wxr=2,wyb=0,wyt=2。

计算机图形学实验报告

计算机图形学 实验报告 姓名:谢云飞 学号:20112497 班级:计算机科学与技术11-2班实验地点:逸夫楼507 实验时间:2014.03

实验1直线的生成 1实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析 实验数据的能力; 编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的 直线,分别调用DDA算法和Bresenham中点算法进行批量绘制,并记 录两种算法的绘制时间;利用excel等数据分析软件,将试验结果编 制成表格,并绘制折线图比较两种算法的性能。 2实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One(自制平台)。 本实验提供名为 Experiment_Frame_One的平台,该平台提供基本 绘制、设置、输入功能,学生在此基础上实现DDA算法和Mid_Bresenham 算法,并进行分析。 ?平台界面:如错误!未找到引用源。所示 ?设置:通过view->setting菜单进入,如错误!未找到引 用源。所示 ?输入:通过view->input…菜单进入.如错误!未找到引用 源。所示 ?实现算法: ◆DDA算法:void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) Mid_Bresenham法:void CExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1)

3实验结果 3.1程序流程图 1)DDA算法流程图:开始 定义两点坐标差dx,dy,以及epsl,计数k=0,描绘点坐标x,y,x增 量xIncre,y增量yIncre ↓ 输入两点坐标x1,y1,x0,y0 ↓ dx=x1-x0,dy=y1-y0; _________↓_________ ↓↓ 若|dx|>|dy| 反之 epsl=|dx| epsl=|dy| ↓________...________↓ ↓ xIncre=dx/epsl; yIncre=dy/epsl ↓ 填充(强制整形)(x+0.5,y+0.5); ↓←←←← 横坐标x+xIncre; 纵坐标y+yIncre; ↓↑ 若k<=epsl →→→k++ ↓ 结束 2)Mid_Bresenham算法流程图开始 ↓ 定义整形dx,dy,判断值d,以及UpIncre,DownIncre,填充点x,y ↓ 输入x0,y0,x1,y1 ______↓______ ↓↓ 若x0>x1 反之 x=x1;x1=x0;x0=x; x=x0;

16秋西交《计算机图形学》在线作业

奥鹏17春16秋西交《计算机图形学》在线作业 一、单选(共30 道,共60 分。) 1. 在三维造型中,不可以使用垂直扫掠造型方法构造的有( )。 A. 园柱 B. 长方体 C. 三棱锥 D. 正十二面体 标准解: 2. 在直线段的参数方程表示方法中,参数t的取值范围为( )。 A. 【0,1】 B. 【0,∞】 C. 【-1,1】 D. 【-1,0】 标准解: 3. 如果希望在CorelDRAW中创建的多个页面具有相同的图形元素,可以执行下面的哪一项操作( ) A. 先创建多个页面,然后分别在各个页面中绘制相同的图形元素 B. 创建一个页面并在此页面绘制需要的图形元素,然后再将此页面复制多个 C. 选择“Layout-Page Setup”命令,在弹出的对话框中进行设置 D. 在Master Page中创建一个图层,在此图层中绘制希望出现在各个页面中的图形元素,则此各个页面将具有相同的图形元素 标准解: 4. 下列有关平面几何投影的叙述,错误的是( )。 A. 透视投影又可分为一点透视、二点透视、三点透视 B. 斜投影又可分为等轴测、斜二测 C. 正轴测又可分为等轴测、正二测、正三测 D. 正视图又可分为主视图、侧视图、俯视图 标准解: 5. 要快速以递增的方式增大字体大小,可以利用“文本”工具选择特定的字符后,执行以下哪步操作( ) A. 按CTRL + "+"键 B. 双击“缩放”工具 C. 按CTRL + 数字小键盘上的"8" D. 按CTRL + 数字小键盘上的"2" 标准解: 6. 有M个控制顶点Pi(i=1,…k)所决定的n次B样曲线,由()段n次B样曲线段光滑连接而成。

《计算机图形学》2020年秋季学期在线作业(二)

《计算机图形学》2020年秋季学期在线作业(二)下列算法用于裁剪二维线段的有()。 A:字符裁剪 B:中点分割裁剪法 C:逐边裁剪 D:双边裁剪法 答案:B 多边形填充时,下述论述错误的是()。 A:多边形被两条扫描线分割成许多梯形,梯形的底边在扫描线上,腰在多边形的边上,并且相间排列 B:多边形与某扫描线相交得到偶数个交点,这些交点间构成的线 段分别在多边形内、外,并且相间排列 C:在判断点是否在多边形内时,一般通过在多边形外找一点,然 后根据该线段与多边形的交点数目为偶数即可认为在多边形内部,若 为奇数则在多边形外部,而且不需考虑任何特殊情况 D:边的连贯性告诉我们,多边形的某条边与当前扫描线相交时, 很可能与下一条扫描线相交 答案:C

在光亮度插值算法中,下列论述错误是()。 A:Gouraud明暗模型计算中,多边形与扫描平面相交区段上每一采样点的光亮度值是由扫描平面与多边形边界交点的光亮度插值得到的 B:Phong明暗处理模型中,采用了双线性插值和构造法向量函数的方法模拟高光 C:Gouraud明暗模型和Phong明暗处理模型主要是为了处理由多个平面片近似表示曲面物体的绘制问题 D:Phong明暗模型处理的物体表面光亮度呈现不连续跃变 答案:A 下列有关平面几何投影的叙述语句中,正确的论述为()。 A:在平面几何投影中,若投影中心移到距离投影面无穷远处,则成为平行投影 B:透视投影与平行投影相比,视觉效果更有真实感,而且能真实地反应物体的精确的尺寸和形状 C:透视投影变换中,一组平行线投影在投影面上一定产生灭点 D:在三维空间中的物体进行透视投影变换,可能产生三个或者更多的主灭点 答案:A

计算机图形学作业

1?什么是图形?在计算机中,图形是如何表示的?计算机图形学的主要研究内容是什么? 答:从广义上说,能够在人的视觉系统中形成的视觉印象的客观对象都称为图形。在计算机图形学中,图形是对客观对象的一种抽象表示,它带有形状和颜色信息。在计算机中,图形通过用点陈法和参数法来表示图形。计算机图形学的主要研究内容是图形的输入,图形的处理,图形的生成和输出。 2?试举例说明计算机图形学的应用。 答:图形用户界面,计算机辅助设计,科学计算可视化,科技、教育、商业领域中的交互式绘图,计算机艺术,地理信息系统,计算机动画、广告及娱乐,多媒体系统,虚拟现实系统。 3.试列举出你所知道的图形输入与输出设备。 答:图形输入设备:鼠标,图形输入板,跟踪球,光笔,触摸屏,操纵杆,空间球,数据手套。 图形输出设备:阴极射线管显示器,液晶显示器,等离子显示器,绘图仪。 4.你用过哪些图形软件包?把它们列举出来。 答:OpenGL DirectX。 5.阴极射线管有哪几个部分组成?它们的功能分别是什么? 答:阴极射线管有五部分组成:电子枪,聚焦系统,加速电极,偏转系统,荧光屏。 电子枪的功能:电流通过灯丝产生热量,对阴极加热使其发出电子束,控制电子束的强弱和数量。 聚焦系统的功能:聚焦系统通过电场或磁场控制电子束,使电子束“变细”,保证轰击荧光屏时产生的亮点足够小,提高显示系统的分辨率。 加速电极的功能:加速电极加有正的高电压,使经过聚焦的电子束高速运动。 偏转系统的功能:控制电子束的水平方向上和竖直方向上的偏转。 荧光屏的功能:显示图形。 6.什么叫刷新?刷新频率与荧光物质的持续发光时间的关系如何? 答:在画线显示器中,电子束在荧光屏上产生的亮点只能持续极短的时间,为了产生静态的不闪烁的图形,电子束必须周期性地反复扫描所要绘制的图形,这种扫描

计算机图形学实验二

太原工业学院

实验拓展:绘制颜色渐变的三角形和四边形。 void CTriangle::Draw(CDC* pDC)//画出来一个三角形 { pDC->MoveTo(point0.x,point0.y); pDC->LineTo(point1.x,point1.y); pDC->LineTo(point2.x,point2.y); pDC->LineTo(point0.x,point0.y); } void CTriangle::GouraudShader(CDC* pDC) { SortVertex();//point0点为y坐标最小的点,point1点为y坐标最大的点,point2点的y坐标位于二者之间。如果y值相同,取x最小的点//定义三角形覆盖的扫描线条数 int nTotalScanLine = point1.y - point0.y + 1; //定义span的起点与终点数组 SpanLeft = new CPoint2[nTotalScanLine];//跨度左边数组 SpanRight = new CPoint2[nTotalScanLine];//跨度右边数组 //判断三角形与P0P1边的位置关系,0-1-2为右手系 int nDeltz = (point1.x - point0.x) * (point2.y - point1.y) - (point1.y - point0.y) * (point2.x - point1.x);//点矢量叉积的z坐标 if(nDeltz > 0)//三角形位于P0P1边的左侧 { nIndex = 0; DDA(point0, point2, TRUE); DDA(point2, point1, TRUE); nIndex = 0; DDA(point0, point1, FALSE); }

2016年春《计算机图形学》作业 (答案)

2016年北京大学现代远程教育《计算机图形学》作业题 注意事项: 1.本作业题中所标注的章节均以学习指导和课件为准; 2.作业请独立自主完成,不要抄袭。 一、填空题 1.(第1章)图形是由点、线、面、体等几何要素和明暗、灰度(亮度)、色彩等非几何要素构成的,从现实世界中抽象出来的带有灰度、色彩及形状的图或形。 2.(第2章)一个计算机图形系统至少应具有计算、存储、输入、输出、交互等基本功能; 3.(第2章)光栅扫描图形显示器是画点设备,显示一幅图像所需要的时间等于显示整个光栅所需的时间,而与图像的复杂程度无(填“有”或“无”)关; 4.(第3章)在计算机图形学中,多边形有两种重要的表示方法:顶点表示和点阵表示。 5.(第3章)多边形填充的扫描线算法先求出扫描线与多边形边的交点,利用____扫描线的连续性求出多边形与扫描线相交的连续区域,然后利用多边形边的连续性,求出下一条扫描线与多边形的交点,对所有扫描线由下到上依次处理。 6.(第3章)将区域内的一点(种子)赋予给定的颜色,然后将这种颜色扩展到整个区域内的过程叫区域填充;区域的表示方法有内点表示和 边界表示两种。 7.(第4章)常用坐标系一般可以分为世界坐标系、局部坐标系、观察坐标系、设备坐标系、标准化设备坐标系。

8.(第4章)对于基本几何变换,一般有平移、旋转、反射和错切等。这些基本几何变换都是相对于 坐标原点 和 坐标轴 进行的几何变换。 9.(第4章)在三维空间中的物体进行透视投影变换,最多可能产生 3 个主灭点。 10.(第6章)根据输入数据的不同性质,图形核心系统(GKS)和三维图形系统 (PHIGS)把输入设备在逻辑上分成以下几类: 定位___设备、 笔画__设备、 定值 设备、 选择 设备、 拾取 设备、 字符串 设备。 11.(第7章)隐藏面和隐藏线的消除有两种基本的算法,一种是基于 图像空间 的方法,一种是基于 物体空间 的方法。 12.(第7章)扫描线z 缓冲器算法所用到的数据结构包括一个 多边形y 筒 、一个 边y 筒 、一个 多边形活化表__、一个 边活化表___; 13.(第8章)通常,人们把反射光考虑成3个分量的组合,这3个分量分别是_ 环境光 反射、 漫 反射和 镜面 反射。 14.(第8章)为了解决由多个平面片近似表示曲面物体的绘制问题,人们提出了各种的简单算法,其中最具代表性的两种方法: Gouraud 光亮度插值技术 和 Phong 法向量插值技术 。 15.(第9章)对于三次多项式曲线,常用四个几何条件进行描述:两端点的位置P 0=P (0)和P 1=P (1);两端点的切矢量和;那么参数曲线的多项式表示为,其中,F 0(t )=___13223+-t t __,F 1(t )=__2332t t +-___,G 0(t )=__t t t +-232___, G 1(t )=____23t t -___。 二、选择题 1.(第2章)下列不属于图形输入设备的是____D____; A .键盘 B. 鼠标 C. 扫描仪 D. 打印机

相关文档
相关文档 最新文档