計算機二級C++實例:八個方向的畫直線代碼

字號:

void CcircleDlg::Line(int x0, int y0, int x1,int y1, int color)
    {
    CDC *dc=GetDC();
    int dx = abs(x1 -x0);
    int dy =abs(y1-y0);
    int ix0=x0,iy0=y0,ix1=x1,iy1=y1,jx0=x0,jy0=y0,jx1=x1,jy1=y1;
    int dx2 = dx << 1;
    int dy2 = dy << 1;
    int e = dy2 - dx; // 決策量
    int half = (dx+1) >> 1;
    if(y1    y1=2*y0-y1;//轉化到第三象限
    if(x1    x1=2*x0-x1;
    for (int i=0; i<=half; i++)
    {
    if(iy1    {
    jy0=2*iy0-y0;//再次轉化回來
    jy1=2*iy0-y1;
    }
    else
    {
    jy1=y1;
    jy0=y0;
    }
    if(ix1    {
    jx0=2*ix0-x0;//再次轉化回來
    jx1=2*ix0-x1;
    }
    else
    {
    jx0=x0;
    jx1=x1;
    }
    dc->SetPixel(jx0, jy0, color);
    dc->SetPixel(jx1, jy1, color);
    if (e > 0) // 當e>0時,始端y向加1,末端y向減1
    {
    y0++;
    y1--;
    e -= dx2;
    }
    //始端x向加1,末端x向減1
    x0++;
    x1--;
    e += dy2;
    }
    }