VisualStudio實現任意情況bresenham畫直線算法


  bresenham算法在計算機繪圖時十分常用,其原理在網上都能找到,這里就不做贅述啦,很多小伙伴在網上找能在Visual Sudio MFC環境下實現的代碼,總是遇到各種問題,不能正常運行,這里直接上能在VS上實現代碼(親測有效)。

   CDC * pDC = this->GetDC();
    int  dx, dy, x, y;
    int increment;
    bool if_xy_swap = false;
    if (abs(x1 - x0) < abs(y1 - y0))
    {   
        if_xy_swap = true;               
        swap(&x0, &y0);
        swap(&x1, &y1);
    }
    if (x0 > x1) {               
        swap(&x0, &x1);           
        swap(&y0, &y1);
    }
    increment = y0 < y1 ? 1 : -1;
    dx = x1 - x0;   
    dy = y1 - y0;
    int h = abs(2 * dy) - dx;
    if (if_xy_swap)
        pDC->SetPixel(y0, x0, RGB(255, 0, 0));
    else
        pDC->SetPixel(x0, y0, RGB(255, 0, 0));
    x = x0;     
    y = y0;
    while (x < x1)
    {
        
        if (h > 0) {
            h += abs(2 * dy) - 2 * dx;
            y += increment;
            if_xy_swap ? pDC->SetPixel(y, x, RGB(255, 0, 0)) : pDC->SetPixel(x, y, RGB(255, 0, 0));
        }
        else {
            h += abs(2 * dy);
            if_xy_swap ? pDC->SetPixel(y, x, RGB(255, 0, 0)) : pDC->SetPixel(x, y, RGB(255, 0, 0));

        }
        x++;
    }

 

大家可以去執行下,應該是能成功實現(除了垂直的直線——代碼較簡單,沒寫在里面了)。

注意:x0,y0,x1,y1分別是所畫的直線兩點的坐標,值在MFC對話框中傳入。

 

 

------------------------------------------------------------------------

(在下寫博客,是記下平時學習程中常遇到的問題,代碼中若有不合理之處,還望各位大佬指正)

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM