Distance
De Brdoom wiki
Mais ações
Aqui está uma representação em ACS de uma função similar a VectorLength.
function int fdistance (int tid1, int tid2)
{
int len;
int y = GetActorY(tid1) - GetActorY(tid2);
int x = GetActorX(tid1) - GetActorX(tid2);
int z = GetActorZ(tid1) - GetActorZ(tid2);
int ang = VectorAngle(x, y);
if(((ang+0.125)%0.5) > 0.25) len = FixedDiv(y, Sin(ang));
else len = FixedDiv(x, Cos(ang));
ang = VectorAngle(len, z);
if(((ang+0.125)%0.5) > 0.25) len = FixedDiv(z, Sin(ang));
else len = FixedDiv(len, Cos(ang));
return len;
}
A função acima funciona rotacionando os pontos para que eles se alinhem com um eixo. Ela roda em tempo constante e quase sempre é mais rápida do que a versão pitagórica mais reconhecível abaixo:
function int distance (int tid1, int tid2)
{
int x, y, z, d;
x = (GetActorX(tid1) - GetActorX(tid2)) >> 16; // Converte fixed point para inteiro
y = (GetActorY(tid1) - GetActorY(tid2)) >> 16;
z = (GetActorZ(tid1) - GetActorZ(tid2)) >> 16;
d = Sqrt( x*x + y*y + z*z );
return d;
}