bresenham算法

原理

以各行、各列像素中心构造虚拟网格线,求直线从起点到终点的直线与网格线的交点,然后确定该列像素中与此交点最近的像素点。
该算法的优点在于使用增量计算,使得只需要检查误差项的符号,就可以确定需要绘制的点。

代码

void BresenhamLine(int x0,int y0,int x1,int y1)
{
    HWND myconsole = GetConsoleWindow();
    HDC mydc = GetDC(myconsole);
    COLORREF COLOR= RGB(255,0,0);
    int dx,dy,e=0,k,q,p;
    dx=x1-x0;
    dy=y1-y0;

    if(x0>x1) {int tmp; tmp=x0; x0=x1;x1=tmp;t=y0; y0=y1;y1=tmp;}
    dx=x0;
    dy=y0;
    if(x0==x1)
    {
        if(y1>=y0){
        for(int n=0;n<(y1-y0);n++)
        {
            SetPixel(mydc,x0,y0+n,COLOR);
        }
        }else   for(int n=0;n<(y0-y1);n++)
        {
            SetPixel(mydc,x0,y1+n,COLOR);
        }
    }
    else
    {
        k=(y1-y0)/(x1-x0);
        p=k;
        q=k-p;
        if(k>=0)
        {
            SetPixel(mydc,x0,y0,COLOR);
            for(int i=0;i<(x1-x0);i++) 
            {
                dx=dx+1;
                e=e+q;
                if(e>=1)  e=e-1;
                if(e<=0.5) dy=dy+p;
                if(e>0.5) {dy=dy+p+1;e=e-1;}
                SetPixel(mydc,dx,dy,COLOR);
            }
        }
        else if(k<0)
        {
            SetPixel(mydc,x0,y0,COLOR);
            for(int i=0;i<(x1-x0);i++) 
            {
                dx=dx+1;
                e=e+q;
                if(e<=-1)  e=e+1;
                if(e>=-0.5) dy=dy+p;
                if(e<-0.5) {dy=dy+p-1;e=e+1;}
                SetPixel(mydc,dx,dy,COLOR);
            }
        }
    }

    ReleaseDC(myconsole, mydc);
    cin.ignore();
}

你可能感兴趣的:(计算机图形学)