计算机图形学实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机图形学
实习报告
姓名:
学号:
专业:
学院:
实习性质:
指导教师:
实习时间:
实习成绩:指导教师签名:
目录(一)基本图元绘制
(二)图形变换
(三)曲线曲面
(一)基本图元绘制
一、实验名称
《基本图元绘制》
二、实验目的
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菜单
所示:
在弹出的对话框中单击Next
在弹出的对话框中,按下图进行设置,设置完成后,单击Finish
生成的工程如下图所示:
打开*View.cpp文件,找到OnDraw函数
将对/*pDC*/的注释去掉
在OnDraw函数中设计算法,下图为其中的一种画线算法
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: 在此处为本机数据添加绘制代码