DDA画线算法+代码详解-直线扫描算法之一
#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画线算法+代码详解-直线扫描算法之一相关推荐
- zuc算法代码详解_最短路算法-dijkstra代码与案例详解
引言 在研究路径选择和流量分配等交通问题时,常常会用到最短路算法.用最短路算法解决交通问题存在两个难点: 一.算法的选择和程序的编写.最短路算法有很多种改进算法和启发式算法,这些算法的效率不同,适用的 ...
- 数据结构与算法--二进制详解 Python二进制算法详解 史上最详细的二进制讲解 彻底搞懂原码、反码、补码 Python的负数二进制表示形式
阅读目录 原码.反码.补码 机器数 和 真值 原码.反码.补码的基础 Python中负数的处理 负数的补码如何转成十进制 位运算符 和 移位运算符 基本概述 妙用 二进制涉及的算法 原码.反码.补码 ...
- 图像拼接之APAP算法代码详解
apap 算法:mdlt matlab 很多内置函数都是对列操作,如mean() 1. VLFEAT库 检测和匹配 SIFT 关键点 kp1,kp2,matches 2. 关键点坐标齐次化:(x,y, ...
- SoundTouch变调编译以及算法代码详解
1. ubuntu20编译 源码地址:https://codeberg.org/soundtouch/soundtouch 安装必要依赖 sudo apt-get install automake a ...
- K-means算法代码详解及Demo
最近比较忙公众号更新的就不太及时,请各位大佬见谅,但是我依旧每天坚持学习.那今天大管就给各位小伙伴献上K-means算法的sklearn使用方法,以及在文章末尾我们使用K-Means算法对图片进行矢量 ...
- 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 ...
- CLAHE算法代码详解
转载 https://www.cnblogs.com/jsxyhelu/p/6435601.html?utm_source=debugrun&utm_medium=referral
- 【算法】详解二分查找算法(思路很简单,细节是魔鬼)
我周围的人几乎都认为二分查找很简单,但事实真的如此吗?二分查找真的很简单吗?并不简单.看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的: Although the basic idea of ...
- [转]数据结构KMP算法配图详解(超详细)
KMP算法配图详解 前言 KMP算法是我们数据结构串中最难也是最重要的算法.难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维.真正理解代码的人可以说对KMP算法的了解已经相当深入了.而 ...
最新文章
- 2021 AI技术盘点:预训练模型5大进展
- 微服务架构如何保障双11狂欢下的99.99%高可用?
- SQLServer之创建非聚集索引
- 利用Math.random做背景图像随机切换【前端开发技能必备系列】
- 系统架构师学习笔记-多媒体基础知识
- 常用的sublime text 3插件
- 模拟最大黑客组织 FIN6 的行为,MITRE 免费助力网络安全防御
- 图像、视频等文件类型(拓展名)
- linux提升nvme性能,基于SPDK的NVMe SSD性能评估指南
- 60. cache
- 前端能读取压缩包内容吗?_移动硬盘出现无法读取数据还能恢复吗?
- 关于 MRC 开发中的一些细节
- 数据结构(C语言)-数组
- IDEA远程调试代码
- HTTPS(一) -- 基础知识(密钥、对称加密、非对称加密、数字签名、数字证书)
- aliyun阿里云发送短信验证码和校验
- mysql useing_mysql中using where,using index
- 免费获取全球夜间NPP VIIRS灯光数据!内附下载链接!
- MFC在对话框中绘制图像
- 「THUWC 2017」在美妙的数学王国中畅游
热门文章
- 计算机网络:网络安全(网络支付安全)
- 12.贝叶斯正则化,在线学习,误差分析,销蚀分析
- 移动涂鸦电话面笔记--游戏开发岗
- 解决duilib使用zip换肤卡顿的问题:修改duilib并使用资源文件换肤
- 似乎在诉说着那段血泪历史
- 计算机电源接通显示未充电怎么办,win10已接通电源,但不显示充电怎么办_win10电脑电源接通但未充电是怎么回事...
- photo-sphere-viewer
- modelsim(2) - vcd (dump, 查看,格式理解)
- PHP和JAVA的区别
- 庄子如何应对杠精? 什么, 庄子原来不是在诡辩? ---庄子与惠子游于濠梁之上解析