计算机图形学实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《计算机图形学》
实验报告
学号:0908610211
姓名:宋雪英
班级:计算机0961
项目:
1.利用其它两种画直线方法实现放大10陪显示方法,交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。
2.利用方形、线性两种画刷来绘制圆和椭圆。
3.实现交互式二维图形的放缩,旋转和对称变换
2012年12月25日
基本图形的生成技术
一、实验目的
在一个图形系统中,基本图形(也称为图元、图素等)的生成技术是最基本的,任何复杂的图形都是由基本图形组成的,基本图形生成的质量直接影响该图形系统绘图的质量。所以,需要设计出精确的基本图形生成算法,以确保图形系统绘图的精确性。本次实验的目的就是利用Bresenham 算法和中心画线法两种画直线方法实现放大10陪显示方法,交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。利用方形、线性两种画刷来绘制圆和椭圆。实现交互式二维图形的放缩,旋转和对称变换。
二、实验任务
1.利用其它两种画直线方法实现放大10陪显示方法,交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。
2.利用方形、线性两种画刷来绘制圆和椭圆。
3.实现交互式二维图形的放缩,旋转和对称变换。
三、画直线的实验内容
任务一:利用其它两种画直线方法实现放大10陪显示方法交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。
1、设计思路
第一步:建立DDAMouseLine工程文件;
第二步:向视图类中添加自定义的成员变量
用鼠标右键单击视图类,选择“Add Member Variable…”,添加下面三个成员变量。
proctected :
CPoint m_p1; //起点
CPoint m_p2; //起点
CPoint m_p; //点击鼠标时点的取值
第三步:向视图类中添加自定义的成员函数原型:
public:
V oid DDAMouseLine(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color);
Line()函数以当前位置所在的点为直线的起点,另指定一个点为直线的终点,画出一段直线。
第四步:在视图类CPP文件的构造函数中初始化成员变量。
视图类的构造函数名与该视图类的名字相同。在视图类中选择构造函数,如:CDDAMouseLineView(),并赋值:m_p1.x=100; m_p1.y=100; //起点
m_p.x=100;m_p.y=100;
m_p2.x=600; m_p2.y=400; //终点
第五步:在视图类的OnDraw()函数中加入下列代码,画出网格,实现视图绘图。
//画网格
int gi,gj;
//画横线
pDC->TextOut(90,90,"(100,100)");
pDC->MoveTo(100,100);
for(gj=100;gj<=400;gj=gj+10)
{
pDC->MoveTo(100,gj);
pDC->LineTo(600,gj);
}
//画竖线
pDC->MoveTo(100,100);
for (gi=100;gi<=600;gi=gi+10)
{
pDC->MoveTo(gi,100);
pDC->LineTo(gi,400);
}
pDC->TextOut(590,410,"(600,400)");
pDC->SelectStockObject(NULL_BRUSH);
第六步:向视图类中添加鼠标OnLButtonDown()函数消息响应函数
OnLButtonDown(UINT nFlags, CPoint point);
在鼠标处理函数中,point参数代表鼠标热点处的坐标位置,point.x为横坐标,point.y为纵坐标。默认坐标原点(0,0)位于窗口的左上角。由于应用程序要求自动捕获鼠标事件,因此应当采用Windows事件处理函数,而不是成员函数。if (m_p.x<=m_p2.x && m_p.y <= m_p2.y)
{
pDC->SetPixel(m_p.x,m_p.y,RGB(255,0,0));
pDC->Ellipse(m_p.x-5,m_p.y-5,m_p.x+5,m_p.y+5);
}
m_p.x=m_p.x+10;
m_p.y=m_p.x*0.6+40;
m_p.y=(int)((m_p.y+5)/10)*10;
//将从(100,100)以10为单位,计算出直线上各个像素位置。
pDC->SetPixel(m_p.x,m_p.y,RGB(255,0,0));
pDC->Ellipse(m_p.x-5,m_p.y-5,m_p.x+5,m_p.y+5);
//调用自定义的成员函数,用鼠标画直线。
2、实验效果及分析
分析:先在OnDraw()函数中画出网格,再在鼠标OnLButtonDown()函数中获取像素值并放大10陪,用DDAMouseLine()函数用Bresenham算法和中心画线算法画出放大10陪的直线。
四、绘制圆和椭圆实验内容
任务二:利用方形、线性两种画刷来绘制圆和椭圆创建一个单文档应用程序DrawShapeTest创建一个单文档应用程序DrawShapeTest,单击“画图”菜单,选择“画椭圆”,客户区窗口显示出一个椭圆图案;选择“画圆”,客