基于EasyX来使用中点算法画线
文章目录
- 前言
- 一、中点算法是什么?
- 二、中点算法整数化
- 1.为什么要整数化
- 2.e公式的由来
- 3.整数化后的中点误差项
- 三、两者的核心代码
前言
本次举例都是以X轴为主位移
中点算法的原理和其它算法也都差不多,都是当主位移方向递增一个单位,判断另一个方向的增量是否为1或0,区别在于是取决于中点误差项的值。
一、中点算法是什么?
中点算法是根据直线的隐形方程F(x,y)=y-kx-b=0将平面划分为3个区域:
- 对于直线上的点,F(x,y)=0;
- 对于直线上方的点,F(x,y)>0;
- 对于直线下方的点,F(x,y)<0;
中点误差项
- 设当前点坐标为Pi(Xi,Yi)在直线上,那么当选取下一个坐标时就要先获取中点坐标(Xi+1,Yi+0.5),根据中点坐标来获取中点误差项d,即
di=F(Xi+1,Yi+0.5)=Yi+0.5-k(Xi+1)-b - 判断中点在直线下方还是上方,当在上方时,也就是di>0,那么下一个坐标点距离Pd点近,则选取Pd这个点作为下一个坐标点,当在下方时,也就是di<0,那么下一个坐标点距离Pu点近,则选取Pu这个点作为下一个坐标点。
- 设当前点坐标为Pi(Xi,Yi)在直线上,那么当选取下一个坐标时就要先获取中点坐标(Xi+1,Yi+0.5),根据中点坐标来获取中点误差项d,即
中点误差项递推公式
- 当di<0时,下一步进行判断的中点为M(Xi+2,Yi+1.5),则递推公式为
di+1=F(Xi+2,Yi+1.5)运算完后得di+1-k。即中点误差项增量为1-k。 - 当di>0时,下一步进行判断的中点为M(Xi+2,Yi+0.5),则递推公式为
di+1=F(Xi+2,Yi+0.5)运算完后得di-k。即中点误差项增量为-k。
- 当di<0时,下一步进行判断的中点为M(Xi+2,Yi+1.5),则递推公式为
中点误差项的起始值
- 由于开始是从第一个点开始,参与判断的中点是(X0+1,Y0+0.5)带入公式后得到
Y0-kX0-b-k+0.5而由于第一个点是在直线上的所以Y0-kX0-b=0,所以d0=0.5-k,算法至此也就完成了
- 由于开始是从第一个点开始,参与判断的中点是(X0+1,Y0+0.5)带入公式后得到
二、中点算法整数化
1.为什么要整数化
由于上面所说的中点算法存在一个缺点,在推断中点误差项时,包含有小数与斜率k,而此算法只需要知道d的符号,而不需要具体值,所以可以消除那些小数与斜率,从而得到一个新的误差项e来代替d,
e=2△xdi
2.e公式的由来
根据上述所推出的中点误差项d,我们发现其中包含0.5和k,而要消除这两个只要对齐乘以一个2和△x便可以消除0.5和k,因为0.5*2变为1,这个也不一定非得乘2,其余也可以,而k=△y/△x,所以乘以△x便可以消除。
3.整数化后的中点误差项
- 由于e=2△xdi,便可以将上述求出来的di带入便可以获得初始值,以及增量,在此我直接列出
- 初始值e0=△x-2△y
- ei<0的增量为2△x-2△y
- ei>=0的增量为-2△y
三、两者的核心代码
本次代码都只针对X轴为主位移方向
float d = 0.5 - k;int y = starty;for (int x = startx; x < endx; x++) {if (d < 0) {d += 1 - k;putpixel(x, y + 1, LIGHTBLUE);y = y + 1;}else {d += -k;putpixel(x, y, LIGHTBLUE);y = y;}}
int e = dx - 2 * dy;int Y = starty;for (int x = startx ; x < endx; x++) {if (e < 0) {e += 2 * dx - 2 * dy;putpixel(x, Y + 1, LIGHTBLUE);Y = Y + 1;}else {e += -2 * dy;putpixel(x, Y, LIGHTBLUE);Y = Y;}}
基于EasyX来使用中点算法画线相关推荐
- 画图板-- 中点算法画圆
为了能以任意点为圆心画圆,我们可以把圆心先设为视点(相当于于将其平移到坐标原点),然后通过中点法扫描转换后,再恢复原来的视点(相当于将圆心平移回原来的位置). 圆心位于原点的圆有四条对称轴x=0,y= ...
- 【转】【OPenGL】OPenGL 画图板-- 中点算法画圆
为了能以任意点为圆心画圆,我们可以把圆心先设为视点(相当于于将其平移到坐标原点),然后通过中点法扫描转换后,再恢复原来的视点(相当于将圆心平移回原来的位置). 圆心位于原点的圆有四条对称轴x=0,y= ...
- Bresenham 算法画线 画圆
最近作业在做 graphics driver 涉及到 Bresenham 画线以及画圆算法,以防自己忘记了总结一些知识点以及源码. 所有代码的输入参数类型都是 unsinged int Bresenh ...
- 中点圆c语言程序,[图形学] 画圆(基于中点算法)
图形学中的中点算法画圆,以下是该算法的 C 语言实现: /// // 程序名称:基于中点算法画圆 // 编译环境:Visual C++ 6.0 / 2010,EasyX 2011惊蛰版 // 作 者: ...
- 【计算机图形学】基于OpenGL的中点Bresenham算法画直线
学习过三种画直线的方法(DDA.中点Bresenham算法.改进的中点Bresenham算法)后,想着实际操作一下如何能够实现,OpenGL无疑是很好的选择,在老师的推荐下,我尝试着用OpenGL来实 ...
- 【OpenGL】画线算法
文章目录 DDA数值微分线段算法 中点画线法(简) Bresenham画线算法 DDA数值微分线段算法 数值微分法即DDA法(Digital Differential Analyzer),是一种基于微 ...
- 计算机图形学学习笔记(4.1)画线算法
前言 现在的显示器都是像素点阵.但是图形在计算机中都用连续的线段或多边形等存储.因此在显示出来之前,要进行光栅化处理. 图形的光栅化(图形的扫描转换)分成两步: 1)根据图形的定义 在点阵单元上确定最 ...
- 图形学--(中点画线法+Bresenham画线算法)
编程环境:codeblocks+EGE库 用到的函数:putpixel(int x1,int y1,int color) 用某种颜色打亮一个坐标点. 这俩种算法都是用来在计算机上画一条直线的,那么我 ...
- 计算机图形学(三种画线算法)
第二章:光栅图形学算法 1.光栅显示器:光栅扫描式图形显示器简称光栅显示器,是画点设备,可看作是一个点阵单元发生器,并可控制每个点阵单元的亮度 2.由来:随着光栅显示器的出现,为了在计算机上处理.显示 ...
最新文章
- Html报表用Excel打开保持表格线【Html报表模板】
- 【Web安全】Weak Session IDs (弱会话IDs)-burp进行Cookie劫持
- 合并远程仓库到本地_使用命令行把你新建的项目上传到GitHub仓库中
- ionic助手 v1.9.0 一键式开发环境工具(告别命令行,超强功能)
- SiteMesh参考
- RS485集线器知识详解
- boost 容器tuple 信号signal2测试
- gravity和layout_gravity
- 【李宏毅2020 ML/DL】P24 Semi-supervised
- 有读二本国防计算机学校,好的二本计算机大学
- 创建React脚手架项目
- php文件如何转换成mp4,qlv文件如何转换成mp4 怎样把下载好的qlv格式视频转换成MP4格式...
- 电力通信网与运营商5G网络融合方案
- 区块链能够防伪?你彷佛有什么误解!
- 我想加入阿里,我该怎么做
- pgAdmin4的应用(二)
- 团队管理的四大挑战——用人篇
- 千兆以太网工程模块划分总结与分析
- 简单的银行利息代码(已知存不同年份利息)
- 语音信号处理 c语言,语音信号处理(毕业设计论文).doc