2维快速距离算法(Fast_Distance_2D)的解释

本文介绍了《Windows游戏编程大师技巧》中提到的2维快速距离算法,该算法用于近似计算两点间的距离,避免了开平方根的耗时操作。通过泰勒•麦克劳林级数展开式,解析了算法背后的数学原理,指出算法存在约3.5%的误差。
摘要由CSDN通过智能技术生成

在平面上如果有2个点P0(x0,y0),P1(x1,y1),根据勾股定理这2点之间的距离是√((x0-x1)^2+(y0-y1)^2)。

但是sqrt()开平方根函数是费时的操作。

所以《Windows游戏编程大师技巧》中介绍了一个2维快速距离算法(Fast_Distance_2D)。

#define MIN(a, b) ((a < b) ? a : b)

#define MAX(a, b) ((a > b) ? a : b)

#define SWAP(a, b, t) {t = a; a = b; b = t;}

int Fast_Distance_2D(int x, int y)
{
// this function computes the distance from 0,0 to x,y with 3.5% error

// fist compute the absolute value of x,y
x = abs(x);
y = abs(y);

// compute the minimum of x,y
int mn = MIN(x, y);

// return the distance
return (x + y - (mn >> 1) - (mn >> 2) + (mn >> 4));

} // end Fast_Distance_2D

这个函数是求某一点(x, y)到原点(0,0)的近似距离。有大约3.5%的误差。如果要求P0(x0,y0),P1(x1,y1)之间的距离,则调用时可以写成如下形式:

dist = Fast_Distance_2D(x0 - x1, y0 - y1);

对于这个算法为什么可以这样写,作者提到了到了泰勒•麦克劳林级数展开式,即

f(x)可以表示为f(0)+f'(0)*x1/1!+f''(0)*x2/2!+...f(n)(0)*xn/n!

其中最后一项的f(n)(0)应该是指f(x)在0处的n次导数。

但是对于这是如何变成x + y - (1/2)*mn - (1/4)*mn + (1/16)*mn的原因,作者没有详细解释。

要研究这个问题,首先要把公式搞清楚。查看《高等数学》可以找到确切的描述:


泰勒(Taylor)中值定理  如果函数f(x)在含有x0的某个

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值