计算机图形学——光栅图形学直线算法简介

本文是对 赵明老师 《计算机图形学》MOOC课程 部分章节的小总结。

直线是组成图形的基础,其算法往往被多次调用,其好坏直接影响图形的显示效果和速度。以下是一些画直线的常用算法。

1、DDA算法:

  此算法基于增量思想。

  对于直线的斜截式:y=kx+b,考虑每次 x 递增 1, 都有 y[i+1] = y[i] + k,这样就将 kx 部分的乘法转换成递推的加法。

  由于像素点都是整数坐标,所以每次求得的 y 都要取整操作,采用加 0.5 取整数部分的方法:(int)(y[i]+0.5)。

  但是,当 |k| > 1 时,由于 x 每次递增 1,会导致取的光栅采样点过稀,可能不足以近似趋近 理想的数学意义上的直线。

  该算法的效率是:浮点数加法级别的。

2、中点画线法:

  此算法依然基于增量思想。

  对于直线的一般式:Ax+By+C=0,当|k|<1时,考虑每次 x 递增 1,y[i+1] 都只可能等于 y[i] 或者 y[i]+1,它取决于对于中点误差项的判断。

  

  

  如何判断Q在M的上方还是下方?把 M 点代入直线一般式:

  所以中点画线法的基本原理是:

  

  接下来的关键在于推导出 d 的递推式以将乘法运算转换为加法运算。

  当 d0<0,也就是取 Pu 时,对于下一个点:

  

  当 d0>0,也就是取 Pd 时,对于下一个点:

  

  

  

  (d只需要判断其符号,故可以用2d放大消除浮点运算)。

3、Bresenham 算法:

  

  

  

  

  

  并且算法不依赖于直线方程的类型。

  

  

  这样就将效率提高到了整数加法级别。

  

  

  且不依赖于直线方程的形式。

时间: 2024-10-05 05:02:49

计算机图形学——光栅图形学直线算法简介的相关文章

图形学_画线算法(DDA、Bresenham)

1. DDA算法实现直线绘制(需先安装easyx,百度下载即可) 1 #include "easyx.h" 2 #include "math.h" 3 #include "windows.h" 4 #include "stdio.h" 5 #include "stdlib.h" 6 #include "conio.h" 7 #include "graphics.h"

Bresenham快速画直线算法

现在的计算机的图像的都是用像素表示的,无论是点.直线.圆或其他图形最终都会以点的形式显示.人们看到屏幕的直线只不过是模拟出来的,人眼不能分辨出来而已.那么计算机是如何画直线的呢,其实有比较多的算法,这里讲的是Bresenham的算法,是光栅化的画直线算法.直线光栅化是指用像素点来模拟直线,比如下图用蓝色的像素点来模拟红色的直线 给定两个点起点P1(x1, y1), P2(x2, y2),如何画它们直连的直线呢,即是如何得到上图所示的蓝色的点.假设直线的斜率0<k>0,直线在第一象限,Brese

算法简介及算法分析

算法简介及算法分析 算法简介 算法的定义: 算法是对特定问题求解步骤的一种描述,是指令的有限序列.(所以说只要满足上述条件,即使很简单的一个循环也是算法) 算法具备5个特征: 输入 输出 有穷性 确定性 可行性 什么是好算法: 正确性 鲁棒性 简单性 抽象分级 高效性 算法分析: 高效性是评价一个算法是否是好算法的重要标准,那么我们怎么判断算法是否高效呢?有的人说,把算法用程序语言实现一下,再输入多个测试数据实际检测运行速度(时间频度)和空间开销就好了呗!这种事后统计的方法并不能准确检测,它牵扯

双目视觉算法简介

http://blog.csdn.net/u010784534/article/details/50437612 转载自:http://blog.sina.com.cn/s/blog_4a540be60102v44s.html 1. 双目视觉算法简介 1.1. 双目视觉简介 双目视觉广泛应用在机器人导航,精密工业测量.物体识别.虚拟现实.场景重建,勘测领域. 什么是双目视觉? 双目视觉是模拟人类视觉原理,使用计算机被动感知距离的方法.从两个或者多个点观察一个物体,获取在不同视角下的图像,根据图像

机器学习算法简介

欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:吴懿伦 导语: 本文是对机器学习算法的一个概览,以及个人的学习小结.通过阅读本文,可以快速地对机器学习算法有一个比较清晰的了解.本文承诺不会出现任何数学公式及推导,适合茶余饭后轻松阅读,希望能让读者比较舒适地获取到一点有用的东西. 引言 本文是对机器学习算法的一个概览,以及个人的学习小结.通过阅读本文,可以快速地对机器学习算法有一个比较清晰的了解.本文承诺不会出现任何数学公式及推导,适合茶余饭后轻松阅读,希望能让读者比较舒适地获取到

[AlgorithmStaff] Bresenham快速直线算法

操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Unity2017.3 | NativeC 最近在学习 Unity tilemap Brush 自定义笔刷功能时候,看到其直线笔刷 LineBrush 是采用 Bresenham 算法实现,故借此机会在这里记录下学习过程,并在最后给出完整实现. Introduction Bresenham 是光栅化的直线算法,或者说是通过像素来模拟直线.比如下图所示像素点来模拟红色的直线. 给定两个起点 P1(x1, y1) | P2

SM2算法和RSA算法简介

SM2算法和RSA算法都是公钥密码算法,SM2算法是一种更先进安全的算法,在安全性能.速度性能等方面都优于RSA算法,在我国商用密码体系中被用来替换RSA算法.国家密码管理局于2010年12月17日发布了SM2算法,并要求现有的基于RSA算法的电子认证系统.密钥管理系统.应用系统进升级改造,使用SM2算法. SM2算法和RSA算法简介 RSA公钥加密算法是美国计算机学家Ron Rivest.Adi Shamir和Leonard Adleman于1977年提出,是最早的公钥加密算法之一,在全球范围

TF-IDF算法简介

TF-IDF算法全称为term frequency–inverse document frequency.TF就是term frequency的缩写,意为词频.IDF则是inverse document frequency的缩写,意为逆文档频率. 该算法在信息处理中通常用来抽取关键词.比如,对一个文章提取关键词作为搜索词,就可以采用TF-IDF算法. 要找出一篇文章中的关键词,通常的思路就是,就是找到出现次数最多的词.如果某个词很重要,它应该在这篇文章中多次出现.于是,我们进行"词频"

最小生成树 kruskal算法简介

生成树--在一个图中的一个联通子图  使得所有的节点都被(访问) 最小生成树 (MST) 即联通子图的总代价(路程)最小 已知的一个图 有n个点 m条边 kruskal的算法如下 先对边从小到大排序 从最小的边起,不停的合并这条边的两个节点到一个集合,如果这条边的两个节点已经在一个集合里,则无视,否则形成回路(显然错误)直到所有的节点并到一个集合里 这里需要用到并查集来合并节点 1 int cmp(const int i,const int j) { 2 return w[i] < w[j];