float Globals::ApproxAtan2(float y, float x)
{
const float n1 = 0.97239411f;
const float n2 = -0.19194795f;
float result = 0.0f;
if (x != 0.0f)
{
const union { float flVal; Uint32 nVal; } tYSign = { y };
const union { float flVal; Uint32 nVal; } tXSign = { x };
if (fabsf(x) >= fabsf(y))
{
union { float flVal; Uint32 nVal; } tOffset = { PI_FLOAT };
// Add or subtract PI based on y's sign.
tOffset.nVal |= tYSign.nVal & 0x80000000u;
// No offset if x is positive, so multiby 0 or based on x's sign.
tOffset.nVal *= tXSign.nVal >> 31;
result = tOffset.flVal;
const float z = y / x;
result += (n1 + n2 * z * z) * z;
}
else // Use atan(y/x) = pi/2 - atan(x/y) if |y/x| > 1.
{
union { float flVal; Uint32 nVal; } tOffset = { PI_2_FLOAT };
// Add or subtract PI/2 based on y's sign.
tOffset.nVal |= tYSign.nVal & 0x80000000u;
result = tOffset.flVal;
const float z = x / y;
result -= (n1 + n2 * z * z) * z;
}
}
else if (y > 0.0f)
{
result = PI_2_FLOAT;
}
else if (y < 0.0f)
{
result = -PI_2_FLOAT;
}
return result;
}
dinsdag 8 oktober 2019
Snellere atan2
Abonneren op:
Reacties posten (Atom)
Geen opmerkingen:
Een reactie posten