直线绘制算法-中点画线法

article/2025/3/1 6:58:29

之前讲过用数值积分法(DDA)进行直线逼近,通过int(y_{i}+0.5)向下取整获取目标像素点。计算过程中每一次都需要加0.5这一浮点数,浮点数运算效率相比整数运算效率低的多,因此需要对此进行改进。

一.中点画线法

直线方程式通过一般式表示:F(x,y)=Ax+By+C=0,调整A、B参数为整数,且B为正整数。

点在直线上方则F(x,y)>0,点在直线直线下方则F(x,y)<0,点在直线上则F(x,y)=0

前提条件k∈[0,1],且P(x_{i},y_{i})坐标已经确定。接下来需要判断下一个点是取点P_{d}(x_{i}+1,y_{i})还是取点P_{u}(x_{i}+1,y_{i}+1)。判断的依据是看P_{d}P_{u}的中点M(x_{i}+1,y_{i}+0.5)位于直线上方还是下方,若位于直线上方则取P_{d}点,位于直线下方则取P_{u}点,正好位于直线上则任取均可。

d=F(x_{i}+1,y_{i}+0.5)=A(x_{i}+1)+B(y_{i}+0.5)+C

y=\left\{\begin{matrix} y+1 & (d<0)\\ y& (d\geqslant 0) \end{matrix}\right.

由上述可知,d的正负决定下一个像素点是进1还是保持不变。接下来考虑d的递推关系,共分为两种情况。

1.d_{0}\geqslant 0,即中点M_{0}位于直线上方,下一个像素点选择为P_{d}

d_{0}=F(x_{i}+1,y_{i}+0.5)=A(x_{i}+1)+B(y_{i}+0.5)+C

d_{1}=F(x_{i}+2,y_{i}+0.5)=A(x_{i}+2)+B(y_{i}+0.5)+C=d_{0}+A

2.d_{0}<0,即中点M_{0}位于直线下方,下一个像素点选择为P_{u}

d_{0}=F(x_{i}+1,y_{i}+0.5)=A(x_{i}+1)+B(y_{i}+0.5)+C

 d_{1}=F(x_{i}+2,y_{i}+1.5)=A(x_{i}+2)+B(y_{i}+1.5)+C=d_{0}+A+B

 

 至此,d的增量关系已经确定,最后只需要确定d_{0}的初值即可。已知P点为线段起点,则初始值d_{0}可求。

 d_{0}=F(x_{i}+1,y_{i}+0.5)=A(x_{i}+1)+B(y_{i}+0.5)+C

      =Ax_{0}+By_{0}+C+A+0.5B=A+0.5B

 总结:

d_{0}=A+0.5B

d_{new}=\left\{\begin{matrix} d_{old}+A+B & (d<0)\\ d_{old}+A& (d\geqslant 0) \end{matrix}\right.         y=\left\{\begin{matrix} y+1 & (d<0)\\ y& (d\geqslant 0) \end{matrix}\right.         

 二.例题推导

已知线段两端点A(0,0)、B(10,8),直线段方程式为-4x+5y=0

d-1.5-10-4-3-2-10-4-3
y01223456678

三.拓展

上述表述中有两个限定条件1.斜率k∈[0,1];2.进给方向为斜向上。若要表述所有的情况,则还需要考虑斜向下进给情况,以及斜率k不为[0,1]的情况。


http://chatgpt.dhexx.cn/article/6rrNtSKL.shtml

相关文章

3分钟看懂五日均线图!最实用的五日均线图解教程!

3分钟看懂五日均线图&#xff01;最实用的五日均线图解教程&#xff01; 均线并不是技术环境分析的全部内容&#xff0c;但无疑是技术环境中不可或缺的重要组成部分。均线代表的是市场平均成本运行趋势&#xff0c;其重要性在于反映现行价格得到支撑或受到压制的情况&#xff…

连连看(四)

Python3 实现QQ游戏连连看游戏辅助 连连看&#xff08;零&#xff09;—— 前记连连看&#xff08;一&#xff09;—— 你看&#xff0c;这是截图啊连连看&#xff08;二&#xff09;—— 哦吼&#xff0c;PIL CV2 Numpy 假图像识别构建矩阵连连看&#xff08;三&#xff09…

java基础2

1、mysql语句执行顺序 from on join where group by having select distinct union order by 我们看到on是在join和where前面的 如果两张表的数据量都比较大的话&#xff0c;那样就会占用很大的内存空间这显然是不合理的。所以&#xff0c;我们在进行表连接查询的时候一般都会…

机器学习基础知识点

机器学习基础知识点 文章目录 机器学习基础知识点监督学习回归线性回归岭回归lasso回归 分类k最近邻分类朴素贝叶斯分类logistic回归支持向量机 其他随机梯度下降线性判别分析决策树 无监督学习聚类k均值分层次聚类谱聚类高斯混合模型 降维PCA降维LLE降维MDS和t-SNE独立成分分析…

文本三剑客——awk 截取+过滤+统计

目录 一、awk是什么&#xff1f; 1、GNU是什么&#xff1f; 2、相关命令选项 3、awk有什么用 4、awk用在哪里 二、awk 命令的简要处理流程 1、分隔符 三、awk命令的内置变量 四、awk命令的完整语法 1、格式 2、 awk 中 gsub和tr命令的使用 1、gsub&#xff1a;替换 …

安卓APP——基础控件

目录 一、4种基础控件二、padding和margin三、制作一个登录界面 一、4种基础控件 Button 按键TextView 文本框EditText 输入框ImageView 图片&#xff0c;带边框的 <ImageButton android:layout_width"wrap_content"android:layout_height"wrap_content&qu…

现场编程

目录 组员职责分工github 的提交日志截图程序运行截图程序运行环境GUI界面基础功能实现运行视频 LCG算法过滤&#xff08;降权&#xff09;算法 算法思路红黑树附加功能一 背景实现附加功能二&#xff08;迭代中&#xff09;附加功能三 背景引言解决方法实现效果效果截图遇到的…

iOS之富文本总结

文章内容大纲 1、NSMutableAttributedString的基本使用2、NSMutableAttributedString的简易封装3、使用开源代码GOBMarkupPaser处理富文本4、UITextKit简介5、编程思想的相关思考 前言 富文本使用案例&#xff1a; 这里我自己也用了富文本实现了简单的却也是常用的例子&#xf…

【读书笔记《Android游戏编程之从零开始》】20.游戏开发基础(游戏数据存储)...

对于数据的存储&#xff0c;Android 提供了4种保存方式。 (1)SharedPreference 此方法适用于简单数据的保持&#xff0c;文如其名&#xff0c;属于配置性质的保存&#xff0c;不适合比较大的情况&#xff0c;默认存放在手机内存里 (2)FileInputStream/FileOutputStream 此方式比…

Demo06-GUI编程

GUI编程 1. 简介 GUI的核心技术&#xff1a;Swing AWT 2. AWT 2.1 Awt 介绍 awt 指抽象的窗口工具&#xff0c;包含了很多类和接口&#xff0c;用于GUI编程&#xff1a;图形用户界面编程元素&#xff1a;窗口&#xff0c;按钮&#xff0c;文本框java.awt [外链图片转存失…

【Java基础】语法基础

本文适合有编程基础或是需要Java语言复习的家人们食用~ 一、Java语言介绍 本篇文章使用的JDK版本是1.8&#xff08;即JDK 8&#xff09;Java语言是运行在JVM上的&#xff0c;有了JVM&#xff0c;Java语言得以在不同操作系统上运行垃圾回收机制&#xff1a;Java语言提供了一种…

编程算法集锦

编程算法集锦 一、分治法1.分治法介绍2.归并排序3.快速排序4.中值问题 二、贪心法1.贪心法2.最小生成树Kruskal算法3.Huffman编码4.单源点最短路径 三、回溯法1.回溯法-n皇后问题2.子集和数 四、动态规划1.数塔问题2.最长公共子序列3.求序列-2 11 -4 13 -5 -2的最大字段和4.求最…

富文本的使用 NSMutableAttributedString

文章内容大纲 1、NSMutableAttributedString的基本使用2、NSMutableAttributedString的简易封装3、使用开源代码GOBMarkupPaser处理富文本4、UITextKit简介5、编程思想的相关思考 前言 富文本使用案例&#xff1a; 这里我自己也用了富文本实现了简单的却也是常用的例子&#x…

iOS 开发 富文本

http://www.itnose.net/detail/6177538.html 文章内容大纲 1、NSMutableAttributedString的基本使用2、NSMutableAttributedString的简易封装3、使用开源代码GOBMarkupPaser处理富文本4、UITextKit简介5、编程思想的相关思考 前言 富文本使用案例&#xff1a; 这里我自己也用…

软工第三次作业-结对编程

结对项目-最长英语单词链 哈哈&#xff0c;这次记住了&#xff0c;来&#xff0c;初始化&#xff01; 项目内容这个作业属于哪个课程2023年北航敏捷软件工程社区这个作业的要求在哪里结对项目-最长英语单词链我在这个课程的目标是学习软件开发的原则、方法&#xff0c;并对敏捷…

Python基础编程习题

警察局抓了a&#xff0c;b&#xff0c;c&#xff0c;d四名偷窃嫌疑犯&#xff0c;其中只有一人是小偷。审问中 a说&#xff1a;“我不是小偷。” b说&#xff1a;“c是小偷。” c说&#xff1a;“小偷肯定是d。” d说&#xff1a;“c在冤枉人。” 现在已经知道四个人中三人说的…

四面体的表面积_如何求正四面体的体积和表面积?

当正四面体的棱长为a时&#xff0c;体积&#xff1a;√2a/12&#xff0c;表面积√3a^2。 解答过程如下&#xff1a; 正四面体是由四个全等的正三角形所组成的几何体。它有四个面、四个顶点、六条棱。每个二面角均为7032’&#xff0c;有四个三面角&#xff0c;每个三面角的面角…

空间四面体的面积、体积运算

基于C#窗体应用程序。通过添加控件&#xff08;Button、Label、TextBox&#xff09;来实现相应的功能。 目录 一、界面设计 二、编写代码 1、计算体积 2、计算面积 三、编译调试 四、实现效果 一、界面设计 二、编写代码 1、计算体积 double A1, A2, A3, A4, value; A…

四面体体积求法

四面体&#xff08;三棱锥&#xff09;体积 &#xff1a; 设 有&#xff1a; 不过这是有向的。如果知道那四个顶点&#xff0c;用这个公式即可求出体积。 如果不知道四点仅知道6条边长&#xff0c;就得用下面的方法——欧拉四面体公式 写成行列式&#xff1a; 那么有&…

matlab 四面体体积

计算方法&#xff1a; 已知四面体顶点坐标分别为 (x1,y1,z1)&#xff0c; (x2,y2,z2)&#xff0c; (x3,y3,z3)&#xff0c; (x4,y4,z4)&#xff0c; 可以通过如下两种方法求四面体体积&#xff1a; 1. 利用向量的混和积 过一顶点的三向量设为a&#xff0c;b&#xff0c;…