首先还是假设直线L的一般公式为:Ax+By+C=0,并且斜率大于1,那么这个时候代表x变化慢,y变化快,那么这时我们应该让y每次递增1,x是否递增,需要判断,判断方法如下:

首先假设直线的起点(x1,y1),终点为(x2,y2),那么从起点开始,起点的下一个点的坐标应该是(x_next,y_next),因为y每次递增1,所以y_next = y1+1,那么x_next应该取哪个点呢?

设起点的正上方的点为V1(x1,y1+1),起点的右上方顶点V2(x1+1,y1+1),这两个点的中间点M(x1+0.5,y1+1),假设直线L与y+1的交点Q(x_q,y_q),那么Ax_q+By_q+C=0成立,因为点Q在直线上,那么点M带入直线L方程得到:

Ax_m + By_m+C = ?

假设x_m = x_q + dx,因为y_m = y_q,所以Ax_m + By_m + C = A(x_q + dx) + By_q + C = (Ax_q + By_q + C) + Adx,假设直线方程L的A>0,那么如果中点M在Q的右侧,则Adx > 0,否则Adx <=0。

那么我们可以这样:

当A>0时,

x_next = x_prev(L(x_m,y_m) > 0)

x_next =x_prev + 1 (Adx <=0)

当A<0时,则相反。

为了求增量,去除乘法,提升效率,我们计算增量的递推公式。

假设点M在直线的右侧,那么Q此时为(x1,y1+1),那么中点M2的坐标为(x1+0.5,y1+2),那么L(M2)=A(x1+0.5)+B(y1+2)+C= Ax1 + By1 + C + 0.5A + 2B,而L(M1) = A(x1 + 0.5)+B(y1+1)+C = Ax1 + By1 + C + 0.5A + B,

因此L(M2) = L(M1) + B

现在假设点M在直线的左侧,那么Q此时为(x1+1,y1+1),那么中点M2的坐标为(x1+1.5,y1+2),那么L(M2) = A(x1+1.5)+B(y1+2)+C=Ax1 + By1 + C + 1.5A + 2B,而L(M1) = A(x1 + 0.5)+B(y1+1)+C = Ax1 + By1 + C + 0.5A + B,

因此L(M2) = L(M1) + A + B

因此

当A>0时

d_next = d_prev + B (d_prev >0)

d_next = d_prev + A + B(d_prev < = 0)

下面推出直线L的第一个增量d,L(x1+0.5,y1+1) = A(x1+0.5) + B(y1 +1) + C = Ax1 + By1 + C + 0.5A + B = 0.5A + B,为了提升效率,我们不要浮点数,此时取2d = A + 2B,那么2d_next为:

2d_next = 2d_prev + 2B           (d_prev > 0)

2d_next = 2d_prev + 2(A+B)    (d_prev <=0)

到此,当A大于0,斜率大于1的情况,构造公式推导完毕。

如有不正确,请用证明的方式指出。

关于斜率大于1的中点画线的公式推导相关推荐

  1. 【计算机图形学】中点画线法实现任意斜率直线的绘制

    [计算机图形学]中点画线法实现任意斜率直线的绘制 一.中点画线法原理简介 1.建立基础 中点画线法的建立基础是数值微分画线法(DDA),其作为改进算法,沿用了DDA算法的增量思想,针对影响DDA算法效 ...

  2. 任意斜率的中点画线算法

    一.中点画线算法的基本原理 在画直线的过程中,当前像素点P(xp,yp),则下一个点与直线最接近的像素只能是P1或者P2,即P点的正右方或者右上角的点.设M(xp+1,yp+0.5)为P1与P2的中点 ...

  3. JAVA实现中点画线_实验1-中点画线和Bresenham画线算法的实现

    <实验1-中点画线和Bresenham画线算法的实现>由会员分享,可在线阅读,更多相关<实验1-中点画线和Bresenham画线算法的实现(9页珍藏版)>请在人人文库网上搜索. ...

  4. 计算机图形学 学习笔记(一):概述,直线扫描转换算法:DDA,中点画线算法,Bresenham算法

    前言 本笔记基于 http://www.icourse163.org/learn/CAU-45006?tid=1001746004#/learn/announce 感谢中国农大 赵明老师的分享~ 现在 ...

  5. 【OpenGL C++】画一个空心汉字和一个圆,并填充汉字(中点画线法,中点画圆法,种子填充法)

    内容:画一个空心汉字和一个圆 设计一个画任意直线和圆的算法,可选所学的任一图形扫描转换算法(中点或bresenham算法),不能使用任何画线/画圆的API: 使用画线算法实现空心汉字的绘制,汉字必须为 ...

  6. 【计算机图形学】扫面转换算法(DDA算法 中点画线算法 Bresenham画线算法)

    模块1 扫描转换算法 一 实验目的 编写直线.弧线的光栅扫描转换算法,并对线宽与线形的算法加以探讨 用DDA算法.中点画线算法.Bresenham画线算法绘制直线(如果键盘输入数据,给出数据值:如果绘 ...

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

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

  8. [XJTUSE]计算机图形学第二章作业,使用OpenGL编程实现DDA、中点画线和Bresenham算法和中点画圆法

    首先是Windows10 + Visual Studio 2019 搭建OpenGL环境可以查看如下链接: 萌新向!!!Windows10 + Visual Studio 2019 搭建OpenGL环 ...

  9. 图形学---中点画线法---opengl中实现

    目的: 为了优化DDA算法中的浮点数运算(DDA中每次+k运算,|k|<1,所以存在浮点数运算),达到整数运算,提高效率. 基本思想: 当前像素点为(xp,yp),下一像素点为P1或P2.设P1 ...

最新文章

  1. 甲骨文在中国区裁员是因为云服务在华缺少竞争力吗?
  2. 设定网页最小最大宽度和高度(兼容IE6)
  3. Python与常见加密方式
  4. Linux 内核系统架构
  5. 精选论文集|Transformer在视觉领域中的应用
  6. 奥松机器人PHP,Arduino四位七段数码管 LED数码管 4位共阳数码管 显示屏模块
  7. 图上上传页面设计_无线端页面设计“三大雷区”
  8. Java 25天基础-DAY 05-面向对象-构造函数
  9. 《Python机器学习——预测分析核心算法》——2.2 分类问题:用声纳发现未爆炸的水雷...
  10. python 类(1)
  11. python时间戳格式定义_关于Python时间戳是什么讲解
  12. H3C 无线控制器+瘦ap 配置
  13. php jmail,PHP利用Jmail组件实现发送邮件
  14. 简单易操作Jsp动态网页
  15. mtk处理器和骁龙对比_3500元以内手机的绝杀?首款MTK 天玑1000处理器手机IQOO Z发布...
  16. 老师对计算机课的评语,信息技术课堂教学评价与反思
  17. Android baidu地图定位实现签到打卡功能(附源码)
  18. 前端更新需要清空浏览器缓存_浏览器缓存机制分析及前端缓存清理
  19. 第3章第1节:使用图片来活跃整张幻灯片版面的气氛 [PowerPoint精美幻灯片实战教程]
  20. zabbix连接mysql_zabbix的简单操作(监控客户端MySQL数据包库)

热门文章

  1. python 读入文件列表_Python将文件读入列表
  2. http://vdisk.weibo.com/s/z6HxGAyBPqD4Q 关于数据统计的相关资料
  3. HFSS学习笔记—6.求解类型和求解设置1
  4. 绘制四叶玫瑰线matlab,数学实验_word文档在线阅读与下载_文档网
  5. linux rndis usb网络,RNDIS介绍
  6. ECharts实现湖北省地图
  7. WindowsServer服务器系列:部署FTP文件服务
  8. namesilo修改域名服务器,简单3步修改Namesilo域名DNS以及A记录解析教程
  9. MAC EFI启动设置
  10. 基于海豚PHP框架 七牛云(插件),合成小程序分享图 并上传到七牛云