MFC实现直线生成算法(DDA与Bresenham)

编译环境VC++ 6.0

1、新建“MFC Project(.exe)”,工程名“MFCDrawLine”,选择“Single Doc”,其他默认,Finish。

2、编辑菜单资源

在项目资源管理器中选择“ResourceView”标签,点开里面的“Menu”目录,双击“IDR_MAINFRAME”打开之,其中包含菜单Banner,之后编辑菜单资源。点击右侧空白处,在弹出对话框中Caption处填写菜单项标题“Drawline”,ID处为不可编辑状态。编辑完成后,编辑Drawline的子菜单,分别填写:

ID Caption
ID_DDA DDA
ID_BRESENHAM Bresenham

编辑完后,结果如下图:

251608174209522

3、添加消息处理函数

在菜单中选择”View –> ClassWizard” 在“Class name”选单中选择“CMFCDrawLineView”,然后在左侧“Object IDs”中选择刚才创建的两个ID分别添加Function。“Messages”均选择“COMMAND”;

具体如下表:

ID Message Function
ID_DDA COMMAND onDda
ID_BRESENHAM COMMAND onBresenham

4、添加具体代码

在项目资源管理器中选择“FileView标签”,打开”MFCDrawLine.cpp”文件,在代码的最末端可以看到刚才添加的两个Function,完成这两个函数的具体代码,编译通过即可。代码如下:

void CMFCDrawLineView::OnDda()
{
    // TODO: Add your command handler code here
    CClientDC dc(this);
    int x0,y0,x1,y1;
    float x,y;
    double k;
    x0=10;
    y0=5;
    x1=100;
    y1=200;
    k=(y1-y0)*1.0/(x1-x0);
    y=y0;
    for(x=x0;x<x1;x++)
    {
      dc.SetPixel(int(x),int(y+0.5),RGB(255,0,0));
          y+=k;  
    }
 
}
 
void CMFCDrawLineView::OnBresenham()
{
    // TODO: Add your command handler code here
    CClientDC dc(this);
    int x0=10,y0=5,x1=300,y1=200,x=x0,y=y0;
        double e=-0.5;
    int dx=x1-x0;
    int dy=y1-y0;
    double k=dy*1.0/dx;
    for(int i=0;i<=dx;i++)
    {
        dc.SetPixel(int(x),int(y),RGB(0,0,255));
        x=x+1;
        e=e+k;
        if(e>=0)
        {
            y++;
            e=e-1;
        }
    }
 
}

5、运行结果

251624246396732

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注