数值微分法(DDA)详解
数值微分法(DDADDADDA)
一、原理
假定直线的起点、终点分别为:(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−x0y1−y0 (x1=x0)假设xxx已知,即从xxx的起x0x_0x0开始,沿xxx方向前进一个像素(步长= 1),可以计算出相应的y值。因为像素的坐标是整数,所以y值还要进行取整处理:
y=round(y)y=round(y) y=round(y)DDADDADDA算法就是一个增量算法,即在一个迭代算法中,如果每一步的xxx、yyy值是用前一步的值加上一个增量来获得,则称为增量算法。
这种方法直观,但效率太低,因为每一步需要一次浮点乘法和一次舍入运算。
二、计算
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)所经过实际坐标。
- 判断kkk值,决定使用谁为增量
k=2−05−0=0.4<1k=\frac{2-0}{5-0}=0.4<1k=5−02−0=0.4<1,使用xxx为增量,步长为111。 - 计算
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+1yi+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 |
- 结果
经过如下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)详解相关推荐
- MapleSim中的符号和数值求解器详解
MapleSim基于数学软件Maple中强大的数值和符号数学引擎,提供了大量其他工具不具备的功能,例如自动生成符号形式的系统方程和实时仿真代码.符号计算正在成为最重要的新一代建模技术之一,为开发模型方 ...
- python中的浮点数用法_如何利用Python在运算后得到浮点数值的方法详解
在python中进行两个整数相除的时候,在默认情况下都是只能够得到整数的值,而在需要进行对除所得的结果进行精确地求值时,想在运算后即得到浮点值,那么如何进行处理呢? 1.修改被除数的值为带小数点的形式 ...
- 详解mysql字段类型int(4) int(10)等区别
一.mysql字段类型大致可以分为:数值.日期/时间.字符串 数值类型:tinyint,smallint,mediumint,int/integer,bigint,float,double,decim ...
- DDA画线算法+代码详解-直线扫描算法之一
#DDA画线算法+代码详解-直线扫描算法之一 本文目录结构如下 1.直线扫描算法简介 2.DDA直线扫描算法 2.1 公式推理 1.求斜率K: 2.当|K| <= 1 时 3.当|K| > ...
- 有序标称变量(Categorical Features)编码为数值变量(Continuous Features)详解及实践
有序标称变量(Categorical Features)编码为数值变量(Continuous Features)详解及实践 有一个带顺序的分类特征(例如,高.中.低) 使用pandas DataFra ...
- python符号格式化设置区间_Python 数值区间处理_对interval 库的快速入门详解
使用 Python 进行数据处理的时候,常常会遇到判断一个数是否在一个区间内的操作.我们可以使用 if else 进行判断,但是,既然使用了 Python,那我们当然是想找一下有没有现成的轮子可以用. ...
- python 归一化还原_对python3 一组数值的归一化处理方法详解
1.什么是归一化: 归一化就是把一组数(大于1)化为以1为最大值,0为最小值,其余数据按百分比计算的方法.如:1,2,3.,那归一化后就是:0,0.5,1 2.归一化步骤: 如:2,4,6 (1)找出 ...
- python数值类型教程_Python数值类型 int、float、complex 详解
Python数值类型 int.float.complex 详解 Python数值类型:int.float.complex 在Python程序中,int.float和complex是三种十分重要的数值类 ...
- python对每一列进行归一化_对python3 一组数值的归一化处理方法详解
1.什么是归一化: 归一化就是把一组数(大于1)化为以1为最大值,0为最小值,其余数据按百分比计算的方法.如:1,2,3.,那归一化后就是:0,0.5,1 2.归一化步骤: 如:2,4,6 (1)找出 ...
最新文章
- 历史版本_DNF:历史版本十大经典地图,没经历过那个时代的人不会明白的
- 比较两个ListT是否相同
- Sharepoint 2010配置form认证方式(SQL账号)
- efcore 新特性 SaveChanges Events
- CNN训练模型 花卉
- C#LeetCode刷题之#231-2的幂(Power of Two)
- Response JSON数据返回
- Android SDK上手指南:用户交互
- 已触发了一个断点 vs_实现ABAP条件断点的三种方式
- Android底部菜单栏的两种实现方式 附完整源码
- mac软件下载常用经典网站
- 解决OneNote for Windows 10 不能打开onedrive上已有笔记本问题
- 抖音sdk,抖音开发api接口
- 【Tensorflow 报错】struct.error: 'i' format requires -2147483648 = number = 2147483647
- 台风怎么看内存颗粒_普条居然采用南亚A-DIE HR颗粒,光威TYPEα内存条稳超3200MHZ...
- C 顺序表求交集和并集
- C语言求最小公倍数和最大公约数三种算法(经典)----ACM
- 计算机具有理性和逻辑思维吗,我们的理性和逻辑思维能力真的有那么重要吗?...
- 小程序源码:全新独立后台修复登录在线答题-多玩法安装简单
- 发送网页地址确定对方ip
热门文章
- pareto最优解程序_NIPS 2018 | 作为多目标优化的多任务学习:寻找帕累托最优解
- 人与人之间在八小时之外的差别
- 知乎上最火的租房经验
- wordpress异步ajax上传文件
- srs ~ Simple Realtime Server ~ 流媒体解决方案。
- 源码解析:JUC及使用场景
- Openshift4.x -- 基于裸机(Bare Metal) UPI方式的集群安装(参考)
- Team Fundation Server 2010 五
- 《CCNP SWITCH 300-115学习指南》——2.1节园区网结构
- Qt实战小工具 -- 简易Gif制作工具