#DDA画线算法+代码详解-直线扫描算法之一

本文目录结构如下

1、直线扫描算法简介
2、DDA直线扫描算法
2.1 公式推理
1、求斜率K:
2、当|K| <= 1 时
3、当|K| > 1 时
4、当|K|不存在时
2.2 疑惑解答
疑问一:当|K|>1 和 |K|<1,步进主方向为什么不一样
疑问二:K为什么要取绝对值,K<0 会怎样
3、代码验证及下载
3.1具体代码:
3.2 测试用例下载
3.3工程代码下载

1、直线扫描算法简介

在数学上直线是由无数个点组成,在光栅显示器上,用有限个逼近的像素点来表示直线,因此最终显示的屏幕上的也不是光滑的线。如图所示

2、DDA直线扫描算法

利用斜线方程: y = k x + b y=kx+b y=kx+b求每个逼近的像素点坐标,每个像素点坐标值都是整数并且不小于零

2.1 公式推理

已知起点P0(X0,Y0)和终点Pn(Xn,Yn),如图所示

1、求斜率K:

k = Y n − Y 0 X n − X 0 ( X n ≠ X 0 ) k=\frac{Yn-Y0}{Xn-X0} (Xn \neq X0) k=Xn−X0Yn−Y0​(Xn​=X0)为了提高运算速度,要避免乘法,采用加法运算,因此采用增量计算;

2、当|K| <= 1 时
x轴方向为步进的主方向

  • X(i+1) = Xi + 1;
  • Y(i+1) = Yi + K;
    备注:因为像素点坐标是整数,所有Y值要四舍五入,即int(Y+0.5)

3、当|K| > 1 时

y轴方向为步进的主方向

  • Y(i+1) = Yi + 1;
  • X(i+1) = Xi + 1/k;
    备注:因为像素点坐标是整数,所有X值要四舍五入,即int(X+0.5)

4、当|K|不存在时
即Xn = X0,说明绘制的是一条垂直的线

  • X(i+1) = Xi ;

2.2 疑惑解答

疑问一:当|K|>1 和 |K|<1,步进主方向为什么不一样

如果|k|>1 ,仍然采用X轴为主步进方向,像素点少;如图所示

疑问二:K为什么要取绝对值,K<0 会怎样

因为当K < 0 和 K > 0 的计算方法完全一样,自己可以举个例子验证一下;要记住一点,像素点的坐标值是整数

3、代码验证及下载

3.1具体代码:

//输入参数分别是起点坐标P(X0,Y0) 和终点坐标(Xn,Yn);
void LineDDA(int X0, int Y0, int Xn, int Yn)
{//定义斜率Kint dx = Xn - X0;int dy = Yn - Y0;int steps;//步数int direction;//方向 0--x方向  1--y方向float xIncrement, yIncrement;//每一步增加的数值float x = X0, y = Y0;//求出的中间像素点if (abs(dx) > abs(dy))                         {steps = abs(dx);//步数direction = 0;//确认X步进主方向}else{steps = abs(dy);direction = 1;//确认Y步进主方向}xIncrement = float(dx) / float(steps);          //x每步骤增量yIncrement = float(dy) / float(steps);          //y的每步增量//开始画点glBegin(GL_POINTS);                       for (int k = 0; k <= steps; ++k){//x主步进方向if (direction == 0){glVertex2i(int(x), int(y + 0.5));//点坐标}else //y主步进方向{glVertex2i(int(x+0.5), int(y));// 点坐标}x += xIncrement; //x点+增量y += yIncrement; //y点+增量}glEnd();
}//绘制函数
void display()
{glClear(GL_COLOR_BUFFER_BIT);  // 擦除背景色glColor3f(1, 0, 0);//红色LineDDA(100, 400, 100, 100);//第一条 竖线LineDDA(200, 200, 300, 300);//第二条 斜线LineDDA(200, 300, 300, 200);//第三条 斜线glFlush();//绘制结束
}

3.2 效果如图 vs2017软件:(opengl环境配置参看博客)

3.3 工程代码下载

DDA画线算法+代码详解-直线扫描算法之一相关推荐

  1. zuc算法代码详解_最短路算法-dijkstra代码与案例详解

    引言 在研究路径选择和流量分配等交通问题时,常常会用到最短路算法.用最短路算法解决交通问题存在两个难点: 一.算法的选择和程序的编写.最短路算法有很多种改进算法和启发式算法,这些算法的效率不同,适用的 ...

  2. 数据结构与算法--二进制详解 Python二进制算法详解 史上最详细的二进制讲解 彻底搞懂原码、反码、补码 Python的负数二进制表示形式

    阅读目录 原码.反码.补码 机器数 和 真值 原码.反码.补码的基础 Python中负数的处理 负数的补码如何转成十进制 位运算符 和 移位运算符 基本概述 妙用 二进制涉及的算法 原码.反码.补码 ...

  3. 图像拼接之APAP算法代码详解

    apap 算法:mdlt matlab 很多内置函数都是对列操作,如mean() 1. VLFEAT库 检测和匹配 SIFT 关键点 kp1,kp2,matches 2. 关键点坐标齐次化:(x,y, ...

  4. SoundTouch变调编译以及算法代码详解

    1. ubuntu20编译 源码地址:https://codeberg.org/soundtouch/soundtouch 安装必要依赖 sudo apt-get install automake a ...

  5. K-means算法代码详解及Demo

    最近比较忙公众号更新的就不太及时,请各位大佬见谅,但是我依旧每天坚持学习.那今天大管就给各位小伙伴献上K-means算法的sklearn使用方法,以及在文章末尾我们使用K-Means算法对图片进行矢量 ...

  6. knn算法代码详解(以鸢尾花数据为例)

    KNN 欧氏距离: d ( x , y ) = ∑ k = 1 n ( x k − y k ) 2 d(x,y)=\sqrt{\sum_{k=1}^{n}{(x_k-y_k)^2}} d(x,y)=k ...

  7. CLAHE算法代码详解

    转载 https://www.cnblogs.com/jsxyhelu/p/6435601.html?utm_source=debugrun&utm_medium=referral

  8. 【算法】详解二分查找算法(思路很简单,细节是魔鬼)

    我周围的人几乎都认为二分查找很简单,但事实真的如此吗?二分查找真的很简单吗?并不简单.看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的: Although the basic idea of ...

  9. [转]数据结构KMP算法配图详解(超详细)

    KMP算法配图详解 前言 KMP算法是我们数据结构串中最难也是最重要的算法.难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维.真正理解代码的人可以说对KMP算法的了解已经相当深入了.而 ...

最新文章

  1. 2021 AI技术盘点:预训练模型5大进展
  2. 微服务架构如何保障双11狂欢下的99.99%高可用?
  3. SQLServer之创建非聚集索引
  4. 利用Math.random做背景图像随机切换【前端开发技能必备系列】
  5. 系统架构师学习笔记-多媒体基础知识
  6. 常用的sublime text 3插件
  7. 模拟最大黑客组织 FIN6 的行为,MITRE 免费助力网络安全防御
  8. 图像、视频等文件类型(拓展名)
  9. linux提升nvme性能,基于SPDK的NVMe SSD性能评估指南
  10. 60. cache
  11. 前端能读取压缩包内容吗?_移动硬盘出现无法读取数据还能恢复吗?
  12. 关于 MRC 开发中的一些细节
  13. 数据结构(C语言)-数组
  14. IDEA远程调试代码
  15. HTTPS(一) -- 基础知识(密钥、对称加密、非对称加密、数字签名、数字证书)
  16. aliyun阿里云发送短信验证码和校验
  17. mysql useing_mysql中using where,using index
  18. 免费获取全球夜间NPP VIIRS灯光数据!内附下载链接!
  19. MFC在对话框中绘制图像
  20. 「THUWC 2017」在美妙的数学王国中畅游

热门文章

  1. 计算机网络:网络安全(网络支付安全)
  2. 12.贝叶斯正则化,在线学习,误差分析,销蚀分析
  3. 移动涂鸦电话面笔记--游戏开发岗
  4. 解决duilib使用zip换肤卡顿的问题:修改duilib并使用资源文件换肤
  5. 似乎在诉说着那段血泪历史
  6. 计算机电源接通显示未充电怎么办,win10已接通电源,但不显示充电怎么办_win10电脑电源接通但未充电是怎么回事...
  7. photo-sphere-viewer
  8. modelsim(2) - vcd (dump, 查看,格式理解)
  9. PHP和JAVA的区别
  10. 庄子如何应对杠精? 什么, 庄子原来不是在诡辩? ---庄子与惠子游于濠梁之上解析