画图板--用DDA算法和Bresenham算法画直线

简介:
上一篇文章中为了简单起见,直接用了CDC的画直线功能,这几天认真研读了图形学的课本,发现书上的算法都是假定直线斜率-1<m<1的情况下适用的,参考了网上的一些资料,将在任意斜率下画直线的两种算法实现如下:
void Line::Draw_DDA(CDC *pDC)
{//用DDA算法画直线
        int i;

    if(pStart.x==pEnd.x)
    {
        //为竖线
        if(pStart.y<=pEnd.y)
        {
            for(i=pStart.y;i<=pEnd.y;i++)
                pDC->SetPixel(pStart.x,i,m_lPenColor);
        }
        else
        {
            for(i=pEnd.y;i<=pStart.y;i++)
                pDC->SetPixel(pStart.x,i,m_lPenColor);
        }

        return;
    }

    //为横线
    if(pStart.y==pEnd.y)
    {
        if(pStart.x<=pEnd.x)
        {
            for(i=pStart.x;i<=pEnd.x;i++)
                pDC->SetPixel(i,pStart.y,m_lPenColor);
        }
        else
        {
            for(i=pEnd.x;i<=pStart.x;i++)
                pDC->SetPixel(i,pStart.y,m_lPenColor);
        }

        return;
    }

    //为斜线
    double m=(pEnd.y-pStart.y)*1.0/(pEnd.x-pStart.x);
    float fTemp;

    if(abs(m)<=1)
    {
        if(pStart.x<pEnd.x)
        {
            fTemp=pStart.y-m;
            for(i=pStart.x;i<=pEnd.x;i++)
                pDC->SetPixel(i,fTemp+=m,m_lPenColor);
        }
        else
        {
            fTemp=pEnd.y-m;
            for(i=pEnd.x;i<=pStart.x;i++)
                pDC->SetPixel(i,fTemp+=m,m_lPenColor);
        }
        return;
    }

    if(pStart.y<pEnd.y)
    {
        fTemp=pStart.x-1/m;
        for(i=pStart.y;i<=pEnd.y;i++)
            pDC->SetPixel(fTemp+=1/m,i,m_lPenColor);
    }
    else
    {
        fTemp=pEnd.x-1/m;
        for(i=pEnd.y;i<=pStart.y;i++)
            pDC->SetPixel(fTemp+=1/m,i,m_lPenColor);
    }
}


void Line::Draw_Bresenham(CDC *pDC)
{//用Bresenham算法画直线
    int i;

    if(pStart.x==pEnd.x)
    {
        //为竖线
        if(pStart.y<=pEnd.y)
        {
            for(i=pStart.y;i<=pEnd.y;i++)
                pDC->SetPixel(pStart.x,i,m_lPenColor);
        }
        else
        {
            for(i=pEnd.y;i<=pStart.y;i++)
                pDC->SetPixel(pStart.x,i,m_lPenColor);
        }

        return;
    }

    //为横线
    if(pStart.y==pEnd.y)
    {
        if(pStart.x<=pEnd.x)
        {
            for(i=pStart.x;i<=pEnd.x;i++)
                pDC->SetPixel(i,pStart.y,m_lPenColor);
        }
        else
        {
            for(i=pEnd.x;i<=pStart.x;i++)
                pDC->SetPixel(i,pStart.y,m_lPenColor);
        }

        return;
    }

    //为斜线
    float m=(pEnd.y-pStart.y)*1.0/(pEnd.x-pStart.x);
    float p;

    p=2*m-1;
    if(m>0 && m<=1)
    {
        if(pStart.x<pEnd.x)
        {
            while(pStart.x<=pEnd.x)
            {
                pDC->SetPixel(pStart.x++,pStart.y,m_lPenColor);
                if(p>=0)
                {
                    p+=2*m-2;
                    pStart.y++;
                }
                else
                    p+=2*m;
            }
        }
        else
        {
            while(pEnd.x<=pStart.x)
            {
                pDC->SetPixel(pEnd.x++,pEnd.y,m_lPenColor);
                if(p>=0)
                {
                    p+=2*m-2;
                    pEnd.y++;
                }
                else
                    p+=2*m;
            }
        }

        return;
    }

    p=-2*m-1;
    if(m<0 && m>=-1)
    {
        if(pStart.x<pEnd.x)
        {
            while(pStart.x<=pEnd.x)
            {
                pDC->SetPixel(pStart.x++,pStart.y,m_lPenColor);
                if(p>=0)
                {
                    p+=-2*m-2;
                    pStart.y--;
                }
                else
                    p+=-2*m;
            }
        }
        else
        {
            while(pEnd.x<=pStart.x)
            {
                pDC->SetPixel(pEnd.x++,pEnd.y,m_lPenColor);
                if(p>=0)
                {
                    p+=-2*m-2;
                    pEnd.y--;
                }
                else
                    p+=-2*m;
            }
        }

        return;
    }

    p=2/m-1;
    if(m>1)
    {
        if(pStart.y<pEnd.y)
        {
            while(pStart.y<=pEnd.y)
            {
                pDC->SetPixel(pStart.x,pStart.y++,m_lPenColor);
                if(p>=0)
                {
                    p+=2/m-2;
                    pStart.x++;
                }
                else
                    p+=2/m;
            }
        }
        else
        {
            while(pEnd.y<=pStart.y)
            {
                pDC->SetPixel(pEnd.x,pEnd.y++,m_lPenColor);
                if(p>=0)
                {
                    p+=2/m-2;
                    pEnd.x++;
                }
                else
                    p+=2/m;
            }
        }

        return;
    }

    p=-2/m-1;
    if(pStart.y<pEnd.y)
    {
        while(pStart.y<=pEnd.y)
        {
            pDC->SetPixel(pStart.x,pStart.y++,m_lPenColor);
            if(p>=0)
            {
                p+=-2/m-2;
                pStart.x--;
            }
            else
                p+=-2/m;
        }
    }
    else
    {
        while(pEnd.y<=pStart.y)
        {
            pDC->SetPixel(pEnd.x,pEnd.y++,m_lPenColor);
            if(p>=0)
            {
                p+=-2/m-2;
                pEnd.x--;
            }
            else
                p+=-2/m;
        }
    }
}




源代码下载

    窗口重绘还是有问题,郁闷。。。


本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2007/07/27/833871.html,如需转载请自行联系原作者

目录
相关文章
|
2月前
|
算法 数据可视化 vr&ar
【图形学】探秘图形学奥秘:DDA与Bresenham算法的解密与实战
【图形学】探秘图形学奥秘:DDA与Bresenham算法的解密与实战
43 0
|
4月前
|
算法 vr&ar 图形学
☆打卡算法☆LeetCode 149. 直线上最多的点数 算法解析
☆打卡算法☆LeetCode 149. 直线上最多的点数 算法解析
|
7月前
|
算法
小车PID算法跑直线
小车PID算法跑直线
60 0
|
8月前
|
算法 图形学
计算机图形学 之 DDA直线算法(数值微分法)
计算机图形学 之 DDA直线算法(数值微分法)
207 0
|
编解码 算法 编译器
计算机图形学直线段的生成算法
计算机图形学直线段的生成算法
计算机图形学直线段的生成算法
|
机器学习/深度学习 算法 C语言
|
算法 计算机视觉
【OpenCV学习】Bresenham算法opencv实现
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ /* * ===================================================================================== * * Filename: linebresenham.
1038 0
|
算法 计算机视觉
【OpenCV学习】Bresenham算法
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ /* * ===================================================================================== * * Filename: linebresenham2.
841 0