图形学实验二.docx
《图形学实验二.docx》由会员分享,可在线阅读,更多相关《图形学实验二.docx(7页珍藏版)》请在冰豆网上搜索。
图形学实验二
图形学实验二
实验二用DDA算法、中点画线法和Bresenham算法绘制直线
[实验目的]:
掌握DDA算法、中点画线法和Bresenham算法的原理,在VC++6.0下设计实现DDA算法、中点算法和Bresenham算法绘制直线;
[实验内容]:
1.利用SetPixel函数编程实现DDA画线法
SetPixel是CDC类的成员函数,用来绘制像素点颜色
类属:
CDC:
:
SetPixel
原型:
COLORREFSetPixel(inx,inty,COLORREFcrColor)
参数说明:
SetPixel函数中,COLORREF是32位颜色数据类型;第1和第2个参数x,y是像素点位置的逻辑坐标值,第三个参数crColor是像素点的颜色值,COLORREF型变量可以用RGB(bRed,bGreen,bBlue)来指定相应的颜色值,每种颜色用1B长度表示,可以被设定为0~255.
DDA画线法
步骤一:
建立MFCAppWizard(exe)工程,命名为DDALine
步骤二:
选择SingleDocment按钮,其余保持默认值,单击Finish按钮结束。
步骤三:
设计一个对话框类,用于输入直线起点终点坐标
1.在资源视图ResourceView中选择Dialog,右击选择InsertDialog,在对话框中添加静态文本StaticText和编辑框EditBox控件并修改属性。
2.双击对话框弹出AddingaClass,保持默认值添加一个新类Creatanewclass,单击OK。
在弹出的对话框类中填写对话框类名InputDlg,单击确定。
3.对对话框类进行设计,在View菜单下选择MFCClassWizard菜单项,选中MemberVariables标签页。
修改成员变量的名称和类型。
添加IDC_EDIT1的成员变量名m_1,类型为double,代表起点坐标中的x0;类似地依次添加m_2,m_3,m_4。
步骤三:
添加工具条按钮,修改其ID号为ID_MENUDDALine。
步骤四:
为工具条按钮ID_MENUDDALine增加对应的功能。
从主菜单View中打开类向导ClassWizard。
在Classname中选择CDDALineView,在ObjectIDs中选择ID_MENUDDALine,在Messages中选择Command,点击AddFunction,自动生成对应函数OnMENUDDALine
步骤五:
在DDALineView.h和DDALineView.cpp中添加相应代码
1.在DDALineView.h中添加以下代码
添加对话框头文件:
#include"InputDlg.h"
在类CDDALineView中声明无参公有成员函数DDALine()
public:
voidDDALine();
和保护数据成员x0,y0,x1,y1,用于传递直线的起点和终点坐标
protected:
doublex0,y0,x1,y1;
2.在DDALineView.cpp中添加成员函数DDALine()
voidCDDALineView:
:
DDALine()
{
CClientDCdc(this);//显示器客户区设备上下文类
COLORREFrgb=RGB(0,0,255);//定义直线颜色为蓝色
//DDA算法
doublex,y,k;
x=x0;y=y0,k=(y1-y0)/(x1-x0);
for(x=x0;x<=x1;x++)
{
dc.SetPixel(int(x+0.5),int(y+0.5),rgb);
y=y+k;
}
}
说明:
CClientDC类:
显示器客户区设备上下文类。
它是设备上下文基类CDC的派生类,其构造函数调用GetDC函数,析构函数调用ReleaseDC函数。
构造函数的作用是创建对象时对数据成员进行初始化,析构函数的作用是撤销对象时清理对象占用的内存空间。
3.在DDALineView.cpp中为成员函数OnMENUDDALine()添加以下代码
voidCDDALineView:
:
OnMENUDDALine()
{
//TODO:
Addyourcommandhandlercodehere
InputDlgdlg;
if(dlg.DoModal()==IDOK)
{
x0=dlg.m_1;
y0=dlg.m_2;
x1=dlg.m_3;
y1=dlg.m_4;
}
AfxGetMainWnd()->SetWindowText("案例:
直线DDA算法");
RedrawWindow();
DDALine();
}
2.中点算法和bresenham算法可以类似实现