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