MFC Bresesnham算法

Bresesnham算法绘制直线段

Bresenham算法的意义:高效的将图形光栅化。其计算过程中均采用加法运算,故大大减少了程序的开销。

  • 绘制直线段(MFC中)
//传入参数:起点、终点,颜色
void CMy3_4View::Bresenham(CPoint p0, CPoint p1, COLORREF CLR)
{
        //自定义二维坐标系
    CDC *pDC = GetDC();
    CRect rect;
    GetClientRect(&rect);
    pDC->SetMapMode(MM_ANISOTROPIC);
    pDC->SetWindowExt(rect.Width(), rect.Height());
    pDC->SetViewportExt(rect.Width(), -rect.Height());
    pDC->SetViewportOrg(rect.Width()/2, rect.Height()/2);
    rect.OffsetRect(-rect.Width()/2, -rect.Height()/2);

        //开始绘制
    CPoint temp, p;
    int dx=p1.x-p0.x;
    int dy=p1.y-p0.y;
    double k=dy*1.00/dx*1.00;//斜率
    COLORREF clr=CLR;//直线颜色

        //不同斜率分别讨论
    if(dx==0)//垂线
    {
        if(dy<0)//七点在上方,调换
        {
            temp=p0;
            p0=p1;
            p1=temp;
        }
        for(p=p0; p.y<p1.y; p.y++)//主移动方向->y,不包括p1
        {
            pDC->SetPixelV(p.x, p.y, clr);
        }
    }

    else//非垂线,斜率k,中点误差项d
    {
        double d;
        if(k>1.0)                               // k > 1.0
        {
            if(dy<0)
            {
                temp=p0;
                p0=p1;
                p1=temp;
            }//p0在左下
            d=1-0.5*k;
            for(p=p0; p.y<p1.y; p.y++)//主移动方向->y,不包括p1
            {
                pDC->SetPixelV(p.x, p.y, clr);
                if(d>=0)
                {
                    d+=1-k;
                    p.x+=1;
                }
                else
                {
                    d+=1;
                }
            }
        }

        else if(k>=0 && k<=1)                   // 0 = < k < = 1
        {
            if(dx<0)
            {
                temp=p0;
                p0=p1;
                p1=temp;
            }//p0在左下
            d=0.5-k;
            for(p=p0; p.x<p1.x; p.x++)//主移动方向->x,不包括p1
            {
                pDC->SetPixelV(p.x, p.y, clr);
                if(d>=0)
                {
                    d=d-k;
                }
                else
                {
                    d+=1-k;
                    p.y+=1;
                }
            }
        }

        else if(k>=-1 && k<0)                   //-1 = < k < 0
        {
            if(dx<0)
            {
                temp=p0;
                p0=p1;
                p1=temp;
            }//p0在左上
            d=-0.5-k;
            for(p=p0; p.x<p1.x; p.x++)//主移动方向->x,不包括p1
            {
                pDC->SetPixelV(p.x, p.y, clr);
                if(d>0)
                {
                    d-=1+k;
                    p.y--;
                }
                else
                {
                    d-=k;
                }
            }
        }

        else if(k<-1)                               // k < -1.0
        {
            if(dy>0)
            {
                temp=p0;
                p0=p1;
                p1=temp;
            }//p0在左上
            d=-1-0.5*k;
            for(p=p0; p.y>p1.y; p.y--)//主移动方向->y,不包括p1
            {
                pDC->SetPixelV(p.x, p.y, clr);
                if(d<0)
                {
                    p.x+=1;
                    d-=1+k;
                }
                else
                {
                    d-=1;
                }
            }
        }

        else
        {pDC->TextOut(0, 0, "ERROR in draw!");}

    }
    pDC->DeleteDC();
}
VC++ 6.0编译通过!

原文地址:https://www.cnblogs.com/yocichen/p/9716701.html

时间: 2024-10-20 13:38:15

MFC Bresesnham算法的相关文章

【20160924】GOCVHelper MFC增强算法(5)

CString ExportListToExcel(CString  sExcelFile,CListCtrl* pList, CString strTitle) { CString warningStr; if (pList->GetItemCount ()>0) { CDatabase database; CString sSql; CString tableName = strTitle; // 检索是否安装有Excel驱动 "Microsoft Excel Driver (*

【20160924】GOCVHelper MFC增强算法(4)

//string替换 void string_replace(string & strBig, const string & strsrc, const string &strdst) { string::size_type pos=0; string::size_type srclen=strsrc.size(); string::size_type dstlen=strdst.size(); while( (pos=strBig.find(strsrc, pos)) != st

基于Opencv和Mfc的图像处理增强库GOCVHelper(索引)

GOCVHelper(GreenOpen Computer Version Helper )是我在这几年编写图像处理程序的过程中积累下来的函数库.主要是对Opencv的适当扩展和在实现Mfc程序时候的功能增强. 这里将算法库开放源代码,并且编写一系列blog对函数实现进行说明.目的是在于“取之于互联网,用之于互联网”.并且也希望该库能够继续发展下去. 由于算法库基于Opencv和Mfc进行编写,所以要求阅读使用者具备一定基础. 最终提交的是GOCVHelper.h 和GOCVHelper版本号.

CSDN回帖得分大全(近两年)

CSDN回帖得分大全(近两年) √ vs2005调用dll的时候Initialize()函数返回错误[VC/MFC 基础类] √ 为什么我创建登陆框之后,然后获取登陆框的数据时候总是出现非法操作![VC/MFC 界面] √ CFileFind::FindFile   支持通配符么?[VC/MFC 基础类] √ vc++   浮动窗口联动的实现[VC/MFC 界面] √ VC   从数据库中读出数据流后怎么判断文件格式[VC/MFC 数据库] √ windows   7接硬體,不會自動刷新   請

工作总结:MFC自写排序算法(升序)

最近一个需求里面需要实IP升序排序,用了qsort,结果是内部排序,甚至感觉排序结果不可预测性,于是自己写了一个外部排序. 需求如下:一个指针里面有N条记录,每条记录包含:IP,偏移地址,保留位,均占4个字节,且这N条记录需要按照升序排序. 算法如下: for (int i = 1; i < m_nCount; i++ )//sort { DWORD dwPre = NULL;//pCurAddr.GetIP()+i DWORD dwNex = NULL; char cTemp[12] = {0

GDI+学习笔记(九)带插件的排序算法演示器(MFC中的GDI+实例)

带插件的排序算法演示器 本节将通过一个实例来说明GDI+在MFC中的应用.这个算法演示器其实是本人算法系列的一个开端,由于csdn没有树状的目录结构,咱也只好使用链表了不是?好了,废话不多说,开始今天的文章. (一)功能说明 我们初步制定功能如下: (1). 能够通过柱状图,自动展示排序算法的交换比较过程 (2). 能够使用插件的形式进行开发.即,当新完成一个算法后,只需要完成一个插件文件(我们这里使用动态库dll),由主程序加载插件,即可进行执行,而不再需要重新编译主程序. (3). 保证主程

mfc动态演示排序算法

实现的排序算法 冒泡排序.选择排序.快速排序 具体实现 选用mfc中的单文档框架 ①SetTimer函数的用法. ②使用画笔画直线. ③使用FillSolidRect()函数覆盖某一矩形区域内的内容:使用TextOutW()函数在某坐标位置输出字符串. 效果截图 生成随机数 选择一种排序算法 加速减速暂停继续 排序完成 可到我的Github获取源代码:https://github.com/Hahallo/SortAlgorithmDisplay 原文地址:https://www.cnblogs.

MFC界面开发(QQ透明皮肤:多层算法,一键适配各种背景 )

http://blog.csdn.net/kent19900125/article/category/1368203/3 QQ透明皮肤:多层算法,一键适配各种背景 . http://blog.csdn.net/liu__ke/article/details/8889171

使用MFC实现图形学课程中中点圆算法

1.进入资源视图,新建对话框,编辑修改Caption或者ID属性 右击该对话框添加类 基类为 CDialog 命名为:MyCircleDialog 使用类向导,选择MyCircleDialog类,选 择成员变量 添加变量 value类型 int型 m_radius  设置 变量取值范围 m_circlex m_circlex 2.添加菜单,设置ID 为 ID_MyCircleMenu 并通过类向导添加消息映射函数 选择类名 C***View 查找ID  ID_MyCircleMenu,映射 ON