直线扫描转换-DDA算法
直线扫描转换-DDA算法
直线段的扫描转换算法
已知两个点,求直线。
为了在光栅显示器上用这些离散的像素点逼近这条直线,需要知道这些像素点的x,y坐标。
求出过P0,P1的直线段方程:
y=kx+b
k=(y1-y0)/(x1-x0)
假设x已知,即从x的起点x0开始,沿x方向前进一个像素(步长= 1),可以计算出相应的y值。
因为像素的坐标是整数,所以y值还要进行取整处理。
如何把数学上的一个点扫描转换一个屏幕像素点?
p(1.7,0.8) ->(1,0)
p(1.7,0.8) +0.5->(2.2,1.3)
p(2.2,1.3) ->(2,1)
直线是最基本的图形,一个动画或真实感图形往往需要调用成千上万次画线程序,因此直线算法的好坏与效率将直接影响图形的质量和显示速度。
为了提高效率,把计算量减下来,关键问题就是如何把乘法取消.
1、数值微分法(DDA)
2、中点画线法
3、Bresenham算法
数值微分DDA(Digital Differential Analyzer)法
引进图形学中一个很重要的思想---增量思想
yi=kxi+b
yi+1=kxi+1+b
=k(xi+1)+b
=kxi+k+b
=kxi+b+k
=yi+k
yi+1=yi+k
这个式子的含义是:当前步的y值等于前一步的y值加上斜率k
这样就把原来一个乘法和加法变成了一个加法
用DDA扫描转换连接两点P0(0,0)和P1(5,3)的直线段。
k=(3-0)/(5-0)=0.6<1
yi+1=yi+k
x | y | int(y+0.5) |
0 | 0 | 0 |
1 | 0+0.6 | 1 |
2 | 0.6+0.6 | 1 |
3 | 1.2+0.6 | 2 |
4 | 1.8+0.6 | 2 |
5 | 2.4+0.6 | 3 |
问题:DDA画直线算法:x每递增1,y递增斜率k。是否适合任意斜率的直线?
答案:不适合
当|k|>1时,如果还适用这种方法会导致点太少。
如直线点从(0,0)到(2,100),也只用3个点来表示,这样明显不合适。
因此当|k|>1时,交换x和y的位置。也就是以单位y间隔(δy=1)取样,顺序计算每个x值。
xi+1=xi+1/k
如从点0.0到点2,5
1/k=2/5=0.4
y | x | int(x+0.5) |
0 | 0 | 0 |
1 | 0+0.4 | 0 |
2 | 0.4+0.4 | 1 |
3 | 0.8+0.4 | 1 |
4 | 1.2+0.4 | 2 |
5 | 1.6+0.4 | 2 |
直线扫描转换-DDA算法的更多相关文章
- 【十天自制软渲染器】DAY 02:画一条直线(DDA 算法 & Bresenham’s 算法)
推荐关注公众号「卤蛋实验室」或访问博客原文,更新更及时,阅读体验更佳 第一天我们搭建了 C++ 的运行环境并画了一个点,根据 点 → 线 → 面 的顺序,今天我们讲讲如何画一条直线. 本文主要讲解直线 ...
- 《图形学》实验三:DDA算法画直线
开发环境: VC++6.0,OpenGL 实验内容: 使用DDA算法画直线. 实验结果: 代码: #include <gl/glut.h> #include <math.h> ...
- opencv利用hough概率变换拟合得到直线后,利用DDA算法得到直线上的像素点坐标
图片霍夫变换拟合得到直线后,怎样获得直线上的像素点坐标? 这是我今天在图像处理学习中遇到的问题,霍夫变换采用的概率霍夫变换,所以拟合得到的直线信息其实是直线的两个端点的坐标,这样一个比较直接的思路就是 ...
- Python使用DDA算法和中点Bresenham算法画直线
title: "Python使用DDA算法和中点Bresenham算法画直线" date: 2018-06-11T19:28:02+08:00 tags: ["图形学&q ...
- 基于Bresenham和DDA算法画线段
直线:y=kx+b 为了将他在显示屏上显示出来,我们需要为相应的点赋值,那么考虑到计算机的乘法执行效率,我们肯定不会选择用Y=kx+b这个表达式求值,然后进行画线段. 我们应当是将它转化为加法运算. ...
- DDA算法
[DDA算法] Digital Differential Analyzer,DDA算法是一种线段扫描转换算法.(线段光栅化算法) DDA算法优缺点: 1.消除了直线方程中的乘法计算,而在x.y方向使用 ...
- Liang-Barsky直线段裁剪算法
Liang-Barsky直线段裁剪算法 梁友栋与Barsky提出的裁剪算法以直线的参数方程为基础,把判断直线段与窗口边界求交的 二维裁剪问题转化为求解一组不等式,确定直线段参数的一维裁剪问题.设起点为 ...
- 画直线的算法之DDA算法+代码实现(法一)
DDA(数值微分法)基于直线微分方程生成直线. 点xi,yi满足直线方程yi=kxi+b, 若xi增加一个单位,则下一步点的位置(xi + 1,yi+1)满足yi+1=k(xi + 1)+ b. 即y ...
- 直线的Bresenham算法
在实验课上用自己的算法画直线被diss效率低 花了半天时间看了下Bresenham算法真
随机推荐
- 每天学会一点点(重写equals一定要重写hashcode)
package com.example.demo.javaError; import java.util.HashMap; /** * Created by yyy on 2019/01/24. */ ...
- 实验吧CTF练习题---WEB---因缺思汀的绕过解析
实验吧web之因缺思汀的绕过 地址:http://www.shiyanbar.com/ctf/1940 flag值: 解题步骤: 1.点开题目,观察题意 2.通过观察题目要求,判断此道题还有代码审 ...
- Android Q 正式命名为 Android 10
根据官方博文,谷歌已经公布了 Android Q 的名称,它并不是想以前一样,以甜食命名,也不是以任何以字母 Q 开头来命名,而是简单称它为 Android 10. 该公司表示,它正在改变其发布版本的 ...
- Hive中的数据库(Database)和表(Table)
在前面的文章中,介绍了可以把Hive当成一个"数据库",它也具备传统数据库的数据单元,数据库(Database/Schema)和表(Table). 本文介绍一下Hive中的数据库( ...
- 垃圾佬的旅游III(Hash + 暴力)
题目链接:http://120.78.128.11/Problem.jsp?pid=3445 最开始的思路就是直接暴力求解,先把所有的数值两两存入结构体,再从小到大枚举.用二分的思路去判断数值以及出现 ...
- 第一次作业:使用Packet Tracer分析HTTP包
0 个人信息 张樱姿 201821121038 计算1812 1 实验目的 熟练使用Packet Tracer工具.分析抓到的HTTP数据包,深入理解:HTTP协议,包括语法.语义.时序. 2 实验内 ...
- 字符串之————图文讲解字符串排序(LSD、MSD)
本篇文章围绕字符串排序的核心思想,通过图示例子和代码分析的方式讲解了两个经典的字符串排序方法,内容很详细,完整代码放在文章的最后. 一.键索引计数法 在一般排序中,都要用里面的元素不断比较,而字符串这 ...
- Spring框架学习笔记(1)——控制反转IOC与依赖注入DI
Spring框架的主要作用,就是提供了一个容器,使用该容器就可以创建并管理对象.比如说Dao类等,又或者是具有多依赖关系的类(Student类中包含有Teacher类的成员变量) Spring有两个核 ...
- Java中的方法和方法重载
上次我们讲了Java中的一些基本的语法;今天我们就讲一点内容,来说说Java中的方法和方法重载以及需要注意的一些地方; 方法: Java的方法类似与其他语言的函数,是一段用来完成特定功能的代码片段, ...
- linux环境下Nginx的安装
因为工作环境大多数都是windows server服务器,仅有的linux服务器同事们都在抢着用,所以特意买了一台阿里云服务器,感兴趣的小伙伴可以了解一下,一年只要293: https://promo ...