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

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

y = kx +b

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

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

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));

}

}

优点

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

缺点

浮点增量连续增加,取证误差会积累

取整操作和浮点运算仍然十分耗时

Bresenham画线算法

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

算法可以表达为如下:

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

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

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

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

$p_0 = 2△y - △x$

从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$

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

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

图形学画直线c语言,002计算机图形学之直线画线算法相关推荐

  1. java bresenham画直线_图形学笔记: Bresenham画线算法

    图形学课本, 按规矩介绍完矩阵行列式, 第一个算法肯定就是Bresenham画线算法了. 來我们來看看算法 Bresenham是用来画一些不反走样的线段的. 都说了线段肯定有起点和终点, 假设我们: ...

  2. 计算机图形学第一次上机——中点线算法和中点圆算法

    计算机图形学第一次上机实验 课程实验报告 目录 计算机图形学第一次上机实验 课程实验报告 一.实验目的 二.实验环境 三.实验内容 1.中点线算法 2.中点圆算法 四.实验心得 附录:程序源代码 一. ...

  3. 计算机图形学05:中点BH算法对任意斜率的直线扫描转换方法

    作者:非妃是公主 专栏:<计算机图形学> 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成.--曾国藩 文章目录 专栏推 ...

  4. 计算机图形学c语言实践,计算机图形学及其实践教程

    图书简介 本教材全面论述计算机图形学的基本原理.方法及其应用.本书首先对计算机图形学的应用.计算图形系统作了介绍,然后对计算机图形学系统原理.基本图元的生成技术.图形变换.交互技术.三维图形表示及真实 ...

  5. 计算机图形学直线裁剪原理,计算机图形学-3.2用Liang-Barsky算法实现直线段裁剪...

    计算机图形学-3.2用Liang-Barsky算法实现直线段裁剪 计算机图形学-3.2用Liang-Barsky算法实现直线段裁剪 (1)算法设计原理 依次处理(p1,q1)(p2,q2)(p3,q3 ...

  6. 【计算机图形学】中点画线法实现任意斜率直线的绘制

    [计算机图形学]中点画线法实现任意斜率直线的绘制 一.中点画线法原理简介 1.建立基础 中点画线法的建立基础是数值微分画线法(DDA),其作为改进算法,沿用了DDA算法的增量思想,针对影响DDA算法效 ...

  7. 计算机图形学---DDA直线画法c#实现

    计算机图形学-DDA直线画法c#实现 DDA直线画法,即数值微分法,是计算机图形学中直线段扫描转换的经典算法之一,本篇文章将简单介绍DDA算法,并给出c#实现的代码. 一.DDA直线画法 设直线的斜截 ...

  8. c语言 连通域算法 递归,VC++ 6.0编写计算机图形学中的种子填充算法,想用递归的八向连通域,求助!...

    VC++ 6.0编写计算机图形学中的种子填充算法,想用递归的八向连通域,求助!0 填充函数代码如下: void CComputerGraphicsView::PolygonFill2()//区域填充函 ...

  9. 计算机图形学学习笔记(4.1)画线算法

    前言 现在的显示器都是像素点阵.但是图形在计算机中都用连续的线段或多边形等存储.因此在显示出来之前,要进行光栅化处理. 图形的光栅化(图形的扫描转换)分成两步: 1)根据图形的定义 在点阵单元上确定最 ...

最新文章

  1. Perforce 使用说明
  2. 【PC工具】开源绿色windows右键管理工具软件
  3. simulink仿真设置
  4. 前端学习(305):bootstrap4之工具方法
  5. 北斗三号b1c频点带宽_重磅北斗星通新一代22nm北斗高精度定位芯片正式发布
  6. 文字生成视频,只需一步
  7. Illustrator中文版教程,如何在 Illustrator 中创建几何图案?
  8. 心跳包、乒乓包、SO_KEEPLIVE
  9. 谷歌浏览器安装插件教程步骤,开发用这2个插件工作效率倍增
  10. java后台数据传到前台的流程_java serlve后台数据传到前台
  11. IntelliJ IDEA pycharm webstorm 激活
  12. BAT用户画像数据浅析
  13. golang 实现数据结构-顺序栈
  14. java系列之redis基础
  15. 理解RemoteViews——RemoteViews的内部机制
  16. 内网安全-arp欺骗,dns劫持钓鱼
  17. 《日语综合教程》第七册 第五課 読み物 雄弁な寡黙
  18. DRV8301/8303代码讲解
  19. 计算机更改用户名修改注册表出问题,改注册表没权限?无论什么账户这么做就好...
  20. CPU频率被限制在0.8GHz

热门文章

  1. 音乐编辑 java_音乐制作软件怎么用?教你编辑音频文件的方法
  2. 股票学习知识:一股行业全球领先 大跌后主力逾8亿大买附股
  3. adb 查看磁盘占用_如何使用adb 指令查看机器序列号
  4. 评测三款最流行的epub阅读器(ios手机适用)
  5. 基于MFC的五子棋(详细介绍,适合初学者)
  6. Java23种设计模式——模板模式
  7. 解决部分app调用摄像头失败(只有一个usbcamera)这里只是一部分(参考)
  8. 18V降压5V,15V降压5V的芯片方案选型问题
  9. 系统自适应,Ctrl+滚轮缩放界面等比例放大(页面不乱)
  10. SpringDataJpa系列三之QBE(按照实例对象查询)