发 帖  
原厂入驻New
[问答] 谁能提供一个有效率的画斜线的算法?
177 算法
分享
今天看邱毅凌老师的书,提到一个有效率的画斜线的算法,在这分享一下。
该算法完全没有用到乘法和除法,效能相当好,而且画出的斜线不会用锯齿状,这个算法基本与机器无法,系统只要提供画点函数draw_pixel(int x,int y,int nColor)即可。
void draw_line(int x1, int y1, int x2, int y2,int nColor)
{
    int i, deltax, deltay, numpixels, d, dinc1, dinc2,
      x, xinc1, xinc2, y, yinc1, yinc2;
    // Calculate delta-x and delta-y for initialization
    IF(x2-x1 < 0)
                 deltax = x1-x2 ;
    else        deltax = x2-x1 ;
    if(y2-y1 < 0)
                 deltay = y1-y2 ;
    else        deltay = y2-y1 ;
        // Initialize all vars based on which is the independent variable
        //
        if(deltax >= deltay)
        {
            //x is independent variable
            //
            numpixels = deltax + 1;
            d = (2 * deltay) - deltax;
            dinc1 = deltay << 1;
            dinc2 = (deltay - deltax) << 1;
            xinc1 = 1;
            xinc2 = 1;
            yinc1 = 0;
            yinc2 = 1;
        }
       else
        {
            // y is independent variable
            //
            numpixels = deltay + 1;
            d = (2 * deltax) - deltay;
            dinc1 = deltax << 1;
            dinc2 = (deltax - deltay) << 1;
            xinc1 = 0;
            xinc2 = 1;
            yinc1 = 1;
            yinc2 = 1;
        }
        // Make sure x and y move in the right directions
        //
        if(x1 > x2)
        {
           xinc1 = - xinc1;
           xinc2 = - xinc2;
        }
        if(y1 > y2)
        {
           yinc1 = - yinc1;
           yinc2 = - yinc2;
        }
        // Start drawing at <x1, y1>
        //
        x = x1;
        y = y1;
        // Draw the pixels
       //
       for(i= 1; i< numpixels;i++)
        {
                 // 画点
                draw_pixel(x, y, nColor);
                if (d < 0)
                {
                    d = d + dinc1;
                    x = x + xinc1;
                    y = y + yinc1;
                }
                else
                {
                    d = d + dinc2;
                    x = x + xinc2;
                    y = y + yinc2;
                }
        }
}
0
2020-6-10 04:35:28   评论 分享淘帖 邀请回答
3个回答
我认为一般像这样画圆,画线,画椭圆,画曲线有没有锯齿主要和液晶分辨率有关。差别只是效率高低。现在大部分用的都是类似bresenham算法,我看楼主的也应该属于这一算法。并且板子上带的画圆函数在画小半径圆时太准确,在堪误贴里有改正方法。
2020-6-10 13:25:24 评论

举报

2020-6-10 13:45:23 评论

举报

2020-6-10 14:04:09 评论

举报

只有小组成员才能发言,加入小组>>

83个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /8 下一条

快速回复 返回顶部 返回列表