【问题标题】:Taylor McLaughlin Series to estimate the distance of two points泰勒麦克劳克林级数估计两点的距离
【发布时间】:2013-09-12 16:02:07
【问题描述】:

点到点的距离:dist = sqrt(dx * dx + dy * dy); 但是 sqrt 太慢了,我不能接受。我找到了一种叫做 Taylor McLaughlin Series 的方法来估计书上两点的距离。但我无法理解以下代码。感谢任何帮助我的人。

#define MIN(a, b) ((a < b) ? a : b)
int FastDistance2D(int x, int y)
{
    // This function computes the distance from 0,0 to x,y with 3.5% error
    // First 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);
}

我查阅了有关 McLaughlin Series 的相关数据,但我仍然无法理解返回值是如何使用 McLaughlin Series 来估算值的。谢谢大家~

【问题讨论】:

  • 我不明白为什么你的输入和方法的输入由两个整数组成,因为如果你想计算二维中两点的距离,你需要 4 个整数,每个 (x,y)点。
  • 评论确实说从 (,0,0) 到 (x,y)。 @MapleWan 当你说“在书上”时是哪本书?
  • dx 通常代表delta x,即两个x 值之间的差异。
  • @MSalters 谢谢,你是对的,但有时,我需要距离值来进行其他数学计算。
  • @doctorlove 一本关于游戏编程的书,叫做

标签: c++ algorithm graphic taylor-series


【解决方案1】:

这个任务几乎是另一个任务的重复: Very fast 3D distance check?

还有指向精彩文章的链接: http://www.azillionmonkeys.com/qed/sqroot.html

在文章中,您可以找到近似根的不同方法。例如,也许这个适合你:

int isqrt (long r) {
    float tempf, x, y, rr;
    int is;

    rr = (long) r;
    y = rr*0.5;
    *(unsigned long *) &tempf = (0xbe6f0000 - *(unsigned long *) &rr) >> 1;
    x = tempf;
    x = (1.5*x) - (x*x)*(x*y);
    if (r > 101123) x = (1.5*x) - (x*x)*(x*y);
    is = (int) (x*rr + 0.5);
    return is + ((signed int) (r - is*is)) >> 31;
}

如果你可以快速计算根操作,那么你可以用常规方式计算距离:

return isqrt(a*a+b*b)

还有一个链接: http://www.flipcode.com/archives/Fast_Approximate_Distance_Functions.shtml

u32 approx_distance( s32 dx, s32 dy )
{
   u32 min, max;

   if ( dx < 0 ) dx = -dx;
   if ( dy < 0 ) dy = -dy;

   if ( dx < dy )
   {
      min = dx;
      max = dy;
   } else {
      min = dy;
      max = dx;
   }

   // coefficients equivalent to ( 123/128 * max ) and ( 51/128 * min )
   return ((( max << 8 ) + ( max << 3 ) - ( max << 4 ) - ( max << 1 ) +
            ( min << 7 ) - ( min << 5 ) + ( min << 3 ) - ( min << 1 )) >> 8 );
} 

【讨论】:

  • 这不是 i 逆平方根吗?此外,在现代 CPU 上,这不是一个好主意。
  • 太棒了,代码比我想象的要复杂得多,非常感谢。我会研究代码并阅读您提供的文章。
【解决方案2】:

你说得对sqrt 是一个相当慢的功能。但是你真的需要计算距离吗?

在很多情况下,您可以改用距离²。
例如。

  1. 如果您想知道什么距离更短,您可以比较距离的平方和实际距离。
  2. 如果你想检查100 &gt; distance,你也可以检查10000 &gt; distanceSquared

在程序中使用距离的平方而不是距离,通常可以避免计算sqrt

这取决于您的应用程序是否适合您,但始终值得考虑。

【讨论】:

  • ² :平方(我真的无法忍受缺少脚注;)
  • 感谢您的建议,当我没有复杂的计算时,这是个好主意。
猜你喜欢
  • 2014-07-12
  • 2015-05-31
  • 2019-05-23
  • 2020-04-01
  • 1970-01-01
  • 2016-04-26
  • 2016-03-06
  • 2020-03-01
  • 2015-05-15
相关资源
最近更新 更多