float QuickDistance2d(float x, float y)
{float fMin;
float fDistance;;
fMin = min(x, y);
fDistance = x+y -fMin*QK;
return fDistance;
}
3张图分别为K, 平均误差
K: 0.586000, Average: 0.052808
K: 0.625000, Average: 0.040474
K: 0.666667, Average: 0.034080
强化精度方面
y=k*x k <= 1.0
sqrt(x*x+y*y)
= sqrt(k*k+1) * x ~= x + q*x
m=1.0 q=0.414
m=0.9 q=0.345
m=0.8 q=0.281
m=0.7 q=0.221
m=0.6 q=0.166
m=0.5 q=0.118
m=0.4 q=0.077
m=0.3 q=0.044
m=0.2 q=0.020
m=0.1 q=0.005
q ~= m*m/2
// 误差 1.5%
float QuickDistance2d_MQ(float x, float y)
{
float fMin;
float fMax;
float q, m;
float fDistance;
fMin = min(x, y);
fMax = max(x, y);
m = fMin/fMax;
q = m*m/2;
fDistance = fMax +fMax*q;
return fDistance;
}
// 误差 0.27%
float QuickDistance2d_MQ2(float x, float y)
{
float fMin;
float fMax;
float q, m;
float fDistance;
fMin = min(x, y);
fMax = max(x, y);
m = fMin/fMax;
q = m*m*0.37+0.05*m;
fDistance = fMax +fMax*q;
return fDistance;
}