美文网首页
002计算机图形学之直线画线算法

002计算机图形学之直线画线算法

作者: 夏大王2019 | 来源:发表于2016-12-06 11:40 被阅读184次

002计算机图形学之直线画线算法

我们知道直线方程的斜截式是如下的样子:

y = kx +b

在显示器上显示直线的话,如果使用如上的方程,每描一个点

  1. 需要进行一次浮点乘法,一次浮点加法,和取整操作。

DDA算法 digital differential analyzer

对斜截式进行转换成如下:

$y_{k+1}=y_{k}+m$

由此我们可以根据起点依次推算到最后一个点,实现如下:

    inline int round(const float a) { return int(a + 0.5); }

    void lineDDA(int x0, int y0, int xEnd, int yEnd)
    {

        int dx = xEnd - x0, dy = yEnd - y0, steps, k;
        float xIncrement, yIncrement, x = x0, y = y0;

        if (fabs(dx) > fabs(dy))
          steps = fabs(dx);
        else
          steps = fabs(dy);

        xIncrement = float(dx) / float(steps);
        yIncrement = float(dy) / float(steps);

        //SetPixel(round(x), round(y));
        for (k = 0; k < steps; k++) {
          x += xIncrement;
          y += yIncrement;
          //SetPixel(round(x), round(y));
        }
    }

优点

取消了乘法,计算速度更快。

缺点

  1. 浮点增量连续增加,取证误差会积累
  2. 取整操作和浮点运算仍然十分耗时

Bresenham画线算法

主要思想是,由于我们在缓存区上画点,全部是整数。那么在画线的时候,当斜率k小于1的时候,下一个点是取(x+1,y+1)还是(x+1,y)取决于点(x+1,y+0.5)是在该直线的上方或者下方,从而将可以通过判断一个参数的的符号来得到下一个点的位置,提高了代码的效率。

算法可以表达为如下:

|m|<1 时的Bresenham画线算法

  1. 输入线段的两个端点,并将左端点存储在(x0,y0)中;

  2. 将(x0,y0)装入帧缓存,绘制第一个点;

  3. 计算常量△x, △y 2△y 和2△y-2△x,并得到决策参数的第一个值:

    $p_0 = 2△y - △x$

  4. 从k=0开始,如果pk<0,则下一个点是(/x_k+1,yk),并且

    $p_{k+1} = p_k + 2△y$

    否则,下一个绘制点是(xk+1,yk+1),并且

    $p_{k+1} = p_k+2△y-2△x$

  5. 重复步骤4,共△x-1次。

考虑到xy平面各种八分和四分区域的对称性,此算法对任意斜率的线段具有通用性。

相关文章

  • 002计算机图形学之直线画线算法

    002计算机图形学之直线画线算法 我们知道直线方程的斜截式是如下的样子: 在显示器上显示直线的话,如果使用如上的方...

  • OpenGL DDA画线算法

    要求:构造完整的DDA画线算法程序 DDA算法:计算机图形学中基于直线的微分方程来生成直线的算法。 具体步骤:输入...

  • 图形学1:图形生成算法

    这是图形学期末复习攻略噢 一、图形生成算法 直线段扫描转换:(DDA算法、Bresenham画线算法、中点画线法)...

  • 计算机图形学的一些基本算法-JavaScript实现

    computer-graphics 图形学的一些基本算法,实现的算法如下 DDA算法画直线 中点算法画直线 Bre...

  • OpenGL:三维数学基础坐标系、向量、矩阵

    一、计算机图形学 计算机图形学(Computer Graphics)是一种使用数学算法将二维或三维图形转化为计算机...

  • C基础:画直线+源码

    VC++ 图形学例子: 画直线源码,画两点一线,简单的画线示例源码,觉得没有什么好介绍的了,了解一些VC画线的基础...

  • LCD直线(线段)画线算法

    尝试了多个版本,最好用的还是正点原子LCD驱动提供的版本。 x轴扫描法image.png 没有进行任何优化,扫描也...

  • 计算机图形学基础重点

    计算机图形学基础重点 计算机图形学的定义:  计算机图形学(CG)是研究怎样利用计算机来显示、生成和处理图形的原理...

  • 计算机图形学

    计算机图形学

    介绍 计算机图形学(Computer Graphics,...

  • 计算机图形学——001概论

    001.概论 内容:计算机图形学的概念、发展历程和应用 001.1 计算机图形学的研究内容 什么是计算机图形学(C...

网友评论

      本文标题:002计算机图形学之直线画线算法

      本文链接:https://www.haomeiwen.com/subject/etqrmttx.html