计算机图形学实验报告
- 格式: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为四个顶点所在坐标
{
//定义旋转变换矩阵