在平面上如果有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的某个