Ce que j'ai l'habitude de le faire est d'abord de filtrer par une distance Manhattan
float CBox::Within3DManhattanDistance( Vec3 c1, Vec3 c2, float distance )
{
float dx = abs(c2.x - c1.x);
float dy = abs(c2.y - c1.y);
float dz = abs(c2.z - c1.z);
if (dx > distance) return 0; // too far in x direction
if (dy > distance) return 0; // too far in y direction
if (dz > distance) return 0; // too far in z direction
return 1; // we're within the cube
}
En fait, vous pouvez optimiser cette plus loin si vous en savez plus sur votre environnement. Par exemple, dans un environnement où il existe un motif comme un simulateur de vol ou à la première personne jeu de tir, l'axe horizontal est beaucoup plus grand que l'axe vertical. Dans un tel environnement, si deux objets sont éloignés, ils sont très probablement plus séparés par l'axe x et y, plutôt que de l'axe des z (dans un jeu de tir première personne, la plupart des objets partagent le même axe z). Donc, si vous avez d'abord comparer x et y, vous pouvez revenir au début de la fonction et éviter de faire des calculs supplémentaires:
float CBox::Within3DManhattanDistance( Vec3 c1, Vec3 c2, float distance )
{
float dx = abs(c2.x - c1.x);
if (dx > distance) return 0; // too far in x direction
float dy = abs(c2.y - c1.y);
if (dy > distance) return 0; // too far in y direction
// since x and y distance are likely to be larger than
// z distance most of the time we don't need to execute
// the code below:
float dz = abs(c2.z - c1.z);
if (dz > distance) return 0; // too far in z direction
return 1; // we're within the cube
}
Désolé, je ne savais pas que la fonction est utilisée pour le tri. Vous pouvez toujours utiliser la distance Manhattan afin d'obtenir une très rugueux premier tri:
float CBox::ManhattanDistance( Vec3 c1, Vec3 c2 )
{
float dx = abs(c2.x - c1.x);
float dy = abs(c2.y - c1.y);
float dz = abs(c2.z - c1.z);
return dx+dy+dz;
}
Après la rudesse de la première sorte que vous pouvez alors prendre le plus haut des résultats, disons le top 10 le plus proche des joueurs, et re-trier selon les calculs de distance.