计算机图形学实验报告

  • 格式:pdf
  • 大小:1.29 MB
  • 文档页数:17

计算机图形学

实习报告

姓 名:

学 号:

专 业:

学 院:

实习性质:

指导教师:

实习时间:

实习成绩: 指导教师签名:

目 录

(一)基本图元绘制

(二)图形变换

(三)曲线曲面

(一)基本图元绘制

一、实验名称

《基本图元绘制》

二、实验目的

1.学会在Visual Studio 2010中新建MFC工程;

2.掌握在MFC工程中编写计算机图形学算法的方法;

3.至少掌握一种直线画线算法(DDA画线法、中点画线法、Bresenham画线

法)的实现;

4.至少掌握一种画圆算法(中点画圆法、Bresenham画圆法)的实现;

三、实验内容

1. 直线画线算法(DDA画线法、中点画线法、Bresenham画线法)的实现;

2. 画圆算法(中点画圆法、Bresenham画圆法)的实现;

四、实验步骤

1 打开Visual Studio 2010软件

在开始菜单找到Microsoft Visual Studio 2010,单击Microsoft Visual

Studio 2010打开。

2 新建MFC工程

单击File->New->Project菜单

选择MFC以及MFC Application,输入工程名,选择文件存放位置,如下图

所示:

在弹出的对话框中单击

Next

在弹出的对话框中,按下图进行设置,设置完成后,单击Finish

生成的工程如下图所示:

3 算法设计

打开*View.cpp文件,找到OnDraw函数

将对/*pDC*/的注释去掉

在OnDraw函数中设计算法,下图为其中的一种画线算法

算法写完后,对程序进行调试,修正算法中可能存在的错误(请百度Visual

Studio 2010 C++ 调试学习更多技巧)

确认程序没有错误后,对程序进行编译:

编译完成后,可执行程序

上述示例代码的执行效果如下图所示。

4 画线算法设计

选择DDA画线算法、中点画线算法或者Bresenham画线算法的一种,绘制从

(200,200)到(1600,1000)的直线。

DDA绘制代码如下:

void DDA(int x1, int y1, int x2, int y2, CDC* pDC)

{

double dx, dy, e, x, y;

dx = x2 - x1;

dy = y2 - y1;

x = x1;

y = y1;

e = (dx > dy) ? dx : dy;

dx /= e;

dy /= e;

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

{

pDC->SetPixel(int(x + 0.5), int(y + 0.5), RGB(255, 0, 0));

x += dx;

y += dy;

}

}

// Cwujiafeng02View 绘图

void Cwujiafeng02View::OnDraw(CDC* pDC)

{

Cwujiafeng02Doc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if (!pDoc)

return

; DDA(200, 200, 1600, 1000, pDC);

// TODO: 在此处为本机数据添加绘制代码

}

绘制结果如下:

5 画圆算法设计

选择中点画圆法或Bresenham画圆法,绘制中点在(200,200)、半径为100

的圆。

绘制代码如下:

//中点画圆算法

void MidpointCircle(int R,CDC* pDC)

{

int x, y;

int d;//判别结果

x = 0; y = R; d = 1 - R;

while (x < y)

{

if (d < 0)

{

d += 2 * x + 3;

x++;

}

else

{

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

x++;

y--;

}

int

x1 = x + 200; int y1 = y + 200;

pDC->SetPixel(x1, y1, RGB(255, 0, 0));

x1 = -x + 200;

y1 = y + 200;

pDC->SetPixel(x1, y1, RGB(255, 0, 0));

x1 = x + 200;

y1 = -y + 200;

pDC->SetPixel(x1, y1, RGB(255, 0, 0));

x1 = -x + 200;

y1 = -y + 200;

pDC->SetPixel(x1, y1, RGB(255, 0, 0));

//另外半个圆

x1 = x + 200;

y1 = y + 200;

pDC->SetPixel(y1, x1, RGB(255, 0, 0));

x1 = -x + 200;

y1 = y + 200;

pDC->SetPixel(y1, x1, RGB(255, 0, 0));

x1 = x + 200;

y1 = -y + 200;

pDC->SetPixel(y1, x1, RGB(255, 0, 0));

x1 = -x + 200;

y1 = -y + 200;

pDC->SetPixel(y1, x1, RGB(255, 0, 0));

}

}

// CMidpointCircleView 绘图

void CMidpointCircleView::OnDraw(CDC* pDC)

{

CMidpointCircleDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if (!pDoc)

return;

MidpointCircle(100, pDC);

// TODO: 在此处为本机数据添加绘制代码 }绘制结果如下:

(二)图形变换

一、实验名称

《图形变换》

二、实验目的

1.巩固在MFC工程中编写计算机图形学算法的方法;

2.掌握对图形进行平移变换;

3.掌握对图形进行旋转变换;

三、实验内容

将顶点为(100,100)、(200,100)、(200,150)、(100,150)的矩形绕矩形中心旋转

45°,绘制出旋转前和旋转后的图形,旋转前图形用红色表示,旋转后图形用绿

色表示。

四、实验过程与结果

绘制代码如下:

const double pi = acos(-1.0);//利用反三角函数定义常量pi

//定义矩阵乘法

double* matMultiply(double p[], double tran1[][3], double rotate[][3], double tran2[][3])

{

//平移变换

double a = p[0] * tran1[0][0] + p[1] * tran1[1][0] + p[2] * tran1[2][0];

double b = p[0] * tran1[0][1] + p[1] * tran1[1][1] + p[2] * tran1[2][1];

double c = p[0] * tran1[0][2] + p[1] * tran1[1][2] + p[2] * tran1[2][2];

p[0] = a; p[1] = b; p[2] = c;

//旋转变换

a = p[0] * rotate[0][0] + p[1] * rotate[1][0] + p[2] * rotate[2][0];

b = p[0] * rotate[0][1] + p[1] * rotate[1][1] + p[2] * rotate[2][1];

c = p[0] * rotate[0][2] + p[1] * rotate[1][2] + p[2] * rotate[2][2];

p[0] = a; p[1] = b; p[2] = c;

//平移变换

a = p[0] * tran2[0][0] + p[1] * tran2[1][0] + p[2] * tran2[2][0];

b = p[0] * tran2[0][1] + p[1] * tran2[1][1] + p[2] * tran2[2][1];

c = p[0] * tran2[0][2] + p[1] * tran2[1][2] + p[2] * tran2[2][2];

p[0] = a; p[1] = b; p[2] = c;

return p;

}

//图形旋转

void Rotate(double alpha, double x1, double x2, double y1, double y2, CDC* pDC)//旋转alpha

角 x1、x2、y1、y2为四个顶点所在坐标

{

//定义旋转变换矩阵