二級考試C++輔導(dǎo):關(guān)于畫圖底層算法

字號:

平時(shí), 用慣了API、CDC和封裝好的內(nèi)部函數(shù),關(guān)于畫線,畫圓這些東西都是信手拈來...
    最近學(xué)習(xí)計(jì)算機(jī)圖形學(xué),不得不深入內(nèi)部研究一下底層算法...
    在這里貼幾個(gè)代碼分享一下!
    (這里只給出MFC的OnDraw函數(shù))
    一、畫線的三個(gè)算法:
    1。DDA(數(shù)值微分)法:
    void CDDALineView::OnDraw(CDC* pDC)
    {
    CDDALineDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    int x,x0(200),y0(200),x1(500),y1(500);
    float dx,dy,y,k;
    dx=x1-x0;
    dy=y1-y0;
    k=dy/dx;
    y=y0;
    for(x=x0;x<=x1;x++)
    {
    pDC->SetPixel(x,(int)(y+0.5),RGB(255,0,0));
    y+=k;
    }
    }
    2.中點(diǎn)畫線算法
    void CMidpointLineView::OnDraw(CDC* pDC)
    {
    CMidpointLineDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    int a,b,d1,d2,d,x,y;
    int x0(200),x1(500),y0(200),y1(500);
    a=y0-y1;
    b=x1-x0;
    d=2*a+b;
    d1=2*a;
    d2=2*(a+b);
    x=x0;
    y=y0;
    pDC->SetPixel(x,y,RGB(0,255,0));
    while(x    {
    if(d<0)
    {
    x++;
    y++;
    d+=d2;
    }
    else
    {
    x++;
    d+=d1;
    }
    pDC->SetPixel(x,y,RGB(0,255,0));
    }
    }
    3。Bresenham算法:
    void CBresenhamline2View::OnDraw(CDC* pDC)
    {
    CBresenhamline2Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    int x0(200),y0(200),x1(500),y1(500);
    int x,y,dx,dy;
    dx=x1-x0;
    dy=y1-y0;
    int e=-dx;
    x=x0;
    y=y0;
    for(int i=0;i<=dx;i++)
    {
    pDC->SetPixel(x,y,RGB(0,0,255));
    x=x+1;
    e=e+2*dy;
    if(e>=0)
    {
    y++;
    e=e-2*dx;
    }
    }
    }
    二、中點(diǎn)畫圓算法:
    void CMidPointCircleView::OnDraw(CDC* pDC)
    {
    CMidPointCircleDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    int r=100;//半徑
    int m(300),n(250);//圓心坐標(biāo)
    int x,y;
    float d;
    x=0;
    y=0+r;
    d=1.25-r;
    //中點(diǎn)畫圓算法
    pDC->SetPixel(m+x,n+y,RGB(255,0,0));
    pDC->SetPixel(m+y,n+x,RGB(255,0,0));
    pDC->SetPixel(m-x,n+y,RGB(255,0,0));
    pDC->SetPixel(m+y,n-x,RGB(255,0,0));
    pDC->SetPixel(m+x,n-y,RGB(255,0,0));
    pDC->SetPixel(m-y,n+x,RGB(255,0,0));
    pDC->SetPixel(m-x,n-y,RGB(255,0,0));
    pDC->SetPixel(m-y,n-x,RGB(255,0,0));
    while(x<=y)
    {
    if(d<0)
    d+=2*x+3;
    else
    {
    d+=2*(x-y)+5;
    y--;
    }
    x++;
    pDC->SetPixel(m+x,n+y,RGB(255,0,0));
    pDC->SetPixel(m+y,n+x,RGB(255,0,0));
    pDC->SetPixel(m-x,n+y,RGB(255,0,0));
    pDC->SetPixel(m+y,n-x,RGB(255,0,0));
    pDC->SetPixel(m+x,n-y,RGB(255,0,0));
    pDC->SetPixel(m-y,n+x,RGB(255,0,0));
    pDC->SetPixel(m-x,n-y,RGB(255,0,0));
    pDC->SetPixel(m-y,n-x,RGB(255,0,0));
    }
    }