数值微分法(DDADDADDA)

一、原理

  1. 假定直线的起点、终点分别为:(x0,y0)(x_0,y_0)(x0​,y0​),(x1,y1)(x_1,y_1)(x1​,y1​),且都为整数。

    则过端点P0(x0,y0)P_0 (x_0, y_0)P0​(x0​,y0​),P1(x1,y1)P_1(x_1, y_1)P1​(x1​,y1​)的直线段L:y=kx+bL:y=kx+bL:y=kx+b,直线斜率为:
    k=y1−y0x1−x0(x1≠x0)k=\frac{y_1-y_0}{x_1-x_0}\ (x_1\neq x_0) k=x1​−x0​y1​−y0​​ (x1​​=x0​)

  2. 假设xxx已知,即从xxx的起x0x_0x0​开始,沿xxx方向前进一个像素(步长= 1),可以计算出相应的y值。因为像素的坐标是整数,所以y值还要进行取整处理:
    y=round(y)y=round(y) y=round(y)

  3. DDADDADDA算法就是一个增量算法,即在一个迭代算法中,如果每一步的xxx、yyy值是用前一步的值加上一个增量来获得,则称为增量算法。

  4. 这种方法直观,但效率太低,因为每一步需要一次浮点乘法和一次舍入运算。

二、计算

yi+1=kxi+1+b=k(xi+Δx)+b=kxi+b+Δx=yi+kΔx\begin{aligned} y_{i+1} &= kx_{i+1}+b \\ &=k(x_i+\Delta x)+b\\ &=kx_i+b+\Delta x\\ &= y_i+k\Delta x\\ \end{aligned} \\ yi+1​​=kxi+1​+b=k(xi​+Δx)+b=kxi​+b+Δx=yi​+kΔx​

  • 当xxx每递增111,yyy递增kkk(即直线斜率),即当xi+1=xi+1x_{i+1}=x_i+1xi+1​=xi​+1时,yi+1=yi+ky_{i+1}=y_i+kyi+1​=yi​+k;
  • 取整:yi+1=round(yi+k+0.5)y_{i+1}= round(y_i+k+0.5)yi+1​=round(yi​+k+0.5);
  • 注意上述分析的算法仅适用于∣k∣≤1|k|≤1∣k∣≤1的情形。在这种情况下,xxx每增加111,yyy最多增加111。
  • 当∣k∣≥1|k|\geq 1∣k∣≥1时,yyy每增加111,xxx增加1k\frac{1}{k}k1​,之后同理。

三、举例

写出下列直线段P0(0,0)→P1(5,2)P_0(0,0)\to P_1(5,2)P0​(0,0)→P1​(5,2)所经过实际坐标。

  1. 判断kkk值,决定使用谁为增量
    k=2−05−0=0.4<1k=\frac{2-0}{5-0}=0.4<1k=5−02−0​=0.4<1,使用xxx为增量,步长为111。
  2. 计算
    xi+1=xi+1yi+1=yi+0.4\begin{aligned} x_{i+1}&=x_i+1\\ y_{i+1}&=y_i+0.4 \end{aligned} xi+1​yi+1​​=xi​+1=yi​+0.4​
    即:当xi+1=xi+1x_{i+1}=x_i+1xi+1​=xi​+1时,yi+1=yi+0.4y_{i+1}=y_i+0.4yi+1​=yi​+0.4
x y+0.5 int(y+0.5)
0 0+0.5 0
1 0.4+0.5 0
2 0.8+0.5 1
3 1.2+0.5 1
4 1.6+0.5 2
5 2.0+0.5 2
  1. 结果
    经过如下5个坐标:
    P0(0,0)、P1(1,0)、P2(2,1)、P3(3,1)、P4(4,2)、P5(5,2)P_0(0,0)、P_1(1,0)、P_2(2,1)、P_3(3,1)、P_4(4,2)、P_5(5,2)P0​(0,0)、P1​(1,0)、P2​(2,1)、P3​(3,1)、P4​(4,2)、P5​(5,2)

数值微分法(DDA)详解相关推荐

  1. MapleSim中的符号和数值求解器详解

    MapleSim基于数学软件Maple中强大的数值和符号数学引擎,提供了大量其他工具不具备的功能,例如自动生成符号形式的系统方程和实时仿真代码.符号计算正在成为最重要的新一代建模技术之一,为开发模型方 ...

  2. python中的浮点数用法_如何利用Python在运算后得到浮点数值的方法详解

    在python中进行两个整数相除的时候,在默认情况下都是只能够得到整数的值,而在需要进行对除所得的结果进行精确地求值时,想在运算后即得到浮点值,那么如何进行处理呢? 1.修改被除数的值为带小数点的形式 ...

  3. 详解mysql字段类型int(4) int(10)等区别

    一.mysql字段类型大致可以分为:数值.日期/时间.字符串 数值类型:tinyint,smallint,mediumint,int/integer,bigint,float,double,decim ...

  4. DDA画线算法+代码详解-直线扫描算法之一

    #DDA画线算法+代码详解-直线扫描算法之一 本文目录结构如下 1.直线扫描算法简介 2.DDA直线扫描算法 2.1 公式推理 1.求斜率K: 2.当|K| <= 1 时 3.当|K| > ...

  5. 有序标称变量(Categorical Features)编码为数值变量(Continuous Features​​​​​​​)详解及实践

    有序标称变量(Categorical Features)编码为数值变量(Continuous Features)详解及实践 有一个带顺序的分类特征(例如,高.中.低) 使用pandas DataFra ...

  6. python符号格式化设置区间_Python 数值区间处理_对interval 库的快速入门详解

    使用 Python 进行数据处理的时候,常常会遇到判断一个数是否在一个区间内的操作.我们可以使用 if else 进行判断,但是,既然使用了 Python,那我们当然是想找一下有没有现成的轮子可以用. ...

  7. python 归一化还原_对python3 一组数值的归一化处理方法详解

    1.什么是归一化: 归一化就是把一组数(大于1)化为以1为最大值,0为最小值,其余数据按百分比计算的方法.如:1,2,3.,那归一化后就是:0,0.5,1 2.归一化步骤: 如:2,4,6 (1)找出 ...

  8. python数值类型教程_Python数值类型 int、float、complex 详解

    Python数值类型 int.float.complex 详解 Python数值类型:int.float.complex 在Python程序中,int.float和complex是三种十分重要的数值类 ...

  9. python对每一列进行归一化_对python3 一组数值的归一化处理方法详解

    1.什么是归一化: 归一化就是把一组数(大于1)化为以1为最大值,0为最小值,其余数据按百分比计算的方法.如:1,2,3.,那归一化后就是:0,0.5,1 2.归一化步骤: 如:2,4,6 (1)找出 ...

最新文章

  1. 第一次react-native项目实践要点总结
  2. null NULL is_null 竟然不一样
  3. python可以播放音乐吗_详解python播放音频的三种方法
  4. 【五校联考7day2】QYQ的图
  5. 【最长公共前缀】算法优化笔记
  6. JAVA程序通过JNI调用C/C++库
  7. QT使用winsocket
  8. 2018年前端星计划等你来报名!
  9. 7月共处理钓鱼网站1921个:非CN域名达1911 个
  10. Codevs 2989 寻找somebody
  11. 【转】初试JNI Java与C/C++交互
  12. java需要了解的几个算法
  13. allennlp0.9.0问题
  14. 文献检索——Web of Science|CSDN创作打卡
  15. php语言标记可用什么符号,【单选题】不可用作PHP语言标记用的是什么( )符号 A. ? B. 〈php C. ?...
  16. QQ群聊天记录统计分析 V0.2
  17. docker制作tomcat镜像并部署war包
  18. AI绘图打开二次元世界
  19. 【区块链】(2)区块链概念与体系
  20. 安全浏览器无法安装?看这一篇就够了

热门文章

  1. FPGA验证学习(五):SoC的总线架构
  2. android 字节码指令集,进入Android Dalvik虚拟机之Dalvik指令集
  3. ADSP21489之CCES开发笔记(三)
  4. Vue手机号正则匹配,姓名加密展示
  5. 智哪儿专访:小匠物联如何帮助颈部按摩仪品类完成智能化升级
  6. 东北石油大学 计算机科学与技术,东北石油大学的王牌专业怎么样?
  7. Flask——xinge中文文档
  8. k8w大神,我是真服了!跪服
  9. 腾讯会议桌面版怎么上传腾讯会议文件
  10. java简拼_java中把汉字转换成简拼的实现代码