文章目录

  • 前言
  • 一、中点算法是什么?
  • 二、中点算法整数化
    • 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这个点作为下一个坐标点。
  • 中点误差项递推公式

    • 当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。

  • 中点误差项的起始值

    • 由于开始是从第一个点开始,参与判断的中点是(X0+1,Y0+0.5)带入公式后得到
      Y0-kX0-b-k+0.5而由于第一个点是在直线上的所以Y0-kX0-b=0,所以d0=0.5-k,算法至此也就完成了

二、中点算法整数化

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来使用中点算法画线相关推荐

  1. 画图板-- 中点算法画圆

    为了能以任意点为圆心画圆,我们可以把圆心先设为视点(相当于于将其平移到坐标原点),然后通过中点法扫描转换后,再恢复原来的视点(相当于将圆心平移回原来的位置). 圆心位于原点的圆有四条对称轴x=0,y= ...

  2. 【转】【OPenGL】OPenGL 画图板-- 中点算法画圆

    为了能以任意点为圆心画圆,我们可以把圆心先设为视点(相当于于将其平移到坐标原点),然后通过中点法扫描转换后,再恢复原来的视点(相当于将圆心平移回原来的位置). 圆心位于原点的圆有四条对称轴x=0,y= ...

  3. Bresenham 算法画线 画圆

    最近作业在做 graphics driver 涉及到 Bresenham 画线以及画圆算法,以防自己忘记了总结一些知识点以及源码. 所有代码的输入参数类型都是 unsinged int Bresenh ...

  4. 中点圆c语言程序,[图形学] 画圆(基于中点算法)

    图形学中的中点算法画圆,以下是该算法的 C 语言实现: /// // 程序名称:基于中点算法画圆 // 编译环境:Visual C++ 6.0 / 2010,EasyX 2011惊蛰版 // 作 者: ...

  5. 【计算机图形学】基于OpenGL的中点Bresenham算法画直线

    学习过三种画直线的方法(DDA.中点Bresenham算法.改进的中点Bresenham算法)后,想着实际操作一下如何能够实现,OpenGL无疑是很好的选择,在老师的推荐下,我尝试着用OpenGL来实 ...

  6. 【OpenGL】画线算法

    文章目录 DDA数值微分线段算法 中点画线法(简) Bresenham画线算法 DDA数值微分线段算法 数值微分法即DDA法(Digital Differential Analyzer),是一种基于微 ...

  7. 计算机图形学学习笔记(4.1)画线算法

    前言 现在的显示器都是像素点阵.但是图形在计算机中都用连续的线段或多边形等存储.因此在显示出来之前,要进行光栅化处理. 图形的光栅化(图形的扫描转换)分成两步: 1)根据图形的定义 在点阵单元上确定最 ...

  8. 图形学--(中点画线法+Bresenham画线算法)

    编程环境:codeblocks+EGE库 用到的函数:putpixel(int x1,int y1,int color)  用某种颜色打亮一个坐标点. 这俩种算法都是用来在计算机上画一条直线的,那么我 ...

  9. 计算机图形学(三种画线算法)

    第二章:光栅图形学算法 1.光栅显示器:光栅扫描式图形显示器简称光栅显示器,是画点设备,可看作是一个点阵单元发生器,并可控制每个点阵单元的亮度 2.由来:随着光栅显示器的出现,为了在计算机上处理.显示 ...

最新文章

  1. Html报表用Excel打开保持表格线【Html报表模板】
  2. 【Web安全】Weak Session IDs (弱会话IDs)-burp进行Cookie劫持
  3. 合并远程仓库到本地_使用命令行把你新建的项目上传到GitHub仓库中
  4. ionic助手 v1.9.0 一键式开发环境工具(告别命令行,超强功能)
  5. SiteMesh参考
  6. RS485集线器知识详解
  7. boost 容器tuple 信号signal2测试
  8. gravity和layout_gravity
  9. 【李宏毅2020 ML/DL】P24 Semi-supervised
  10. 有读二本国防计算机学校,好的二本计算机大学
  11. 创建React脚手架项目
  12. php文件如何转换成mp4,qlv文件如何转换成mp4 怎样把下载好的qlv格式视频转换成MP4格式...
  13. 电力通信网与运营商5G网络融合方案
  14. 区块链能够防伪?你彷佛有什么误解!
  15. 我想加入阿里,我该怎么做
  16. pgAdmin4的应用(二)
  17. 团队管理的四大挑战——用人篇
  18. 千兆以太网工程模块划分总结与分析
  19. 简单的银行利息代码(已知存不同年份利息)
  20. 语音信号处理 c语言,语音信号处理(毕业设计论文).doc

热门文章

  1. 【DL】第4章 构建基于外向维基百科链接的推荐系统
  2. 新版标准日本语高级_第11课
  3. 港澳通行证签注可以自助办理了 三分钟搞定 - 杭州新闻中心 - 杭州网
  4. equalsIgnoreCase() 方法
  5. equalsIgnoreCase的使用
  6. Python getitem方法理解
  7. 前端基础02:CSS
  8. linux基本操作2
  9. rust货轮什么时候出现_汉语什么时候出现的?来源在哪里?
  10. 计算机毕业设计ssm基于SSM框架的药店管理系统ghao1系统+程序+源码+lw+远程部署