Quelle est la meilleure façon d'obtenir la distance entre 2 points avec DirectXMath
À l'aide de la nouvelle XMVECTOR et XMFLOAT3 classes quelle est la meilleure façon d'obtenir la distance entre 2 points? Je ne pouvais pas trouver une fonction qui n'en XMVector* famille de fonctions alors je suis venu avec les éléments suivants :
float distance(const XMFLOAT3& v1,const XMFLOAT3& v2)
{
XMVECTOR vector1 = XMLoadFloat3(&v1);
XMVECTOR vector2 = XMLoadFloat3(&v2);
XMVECTOR vectorSub = XMVectorSubtract(vector1,vector2);
XMVECTOR length = XMVector3Length(vectorSub);
float distance = 0.0f;
XMStoreFloat(&distance,length);
return distance;
}
Ce que ce sera plus rapide que la normale Vector3 classe avec seulement 3 flotteurs pour x,y,z, puis en utilisant sqrt car il utilise intrinsèque des optimisations? À savoir :
float Distance(const Vector3& point1,const Vector3& point2)
{
float distance = sqrt( (point1.x - point2.x) * (point1.x - point2.x) +
(point1.y - point2.y) * (point1.y - point2.y) +
(point1.z - point2.z) * (point1.z - point2.z) );
return distance;
}
Vous devez vous connecter pour publier un commentaire.
Il n'y a qu'une manière d'obtenir la distance entre les points. Et c'est la façon dont vous avez décrit.
vec3 diff = b - a; float distance = sqrtf(dot(diff, diff));
Si vous êtes inquiet au sujet de la performance, vous avez besoin pour votre application de profil, au lieu d'essayer de deviner ce que sera plus rapide. Il ya une très bonne chance que l'impact de "moins efficace" solution sera complètement inaperçu dans votre application.
Il y a aussi une très bonne chance que si vous commencez à écrire des routines de vous-même, vous allez les rendre moins efficace ou introduire des bogues. Pour votre exemple "écrit à la main" code peut (en fonction du compilateur) effectuer plusieurs calculs en virgule flottante que code original qui utilise "XMVECTOR". Dans votre routine, vous devez calculer la différence entre les vecteurs à deux reprises. Si le compilateur n'a pas d'optimiser cela, vous vous retrouverez avec 6 soustractions, 2 ajouts, 1 sqrtf, et 3 multiplications. Dans "XMVECTOR" code que vous allez utiliser 3 soustractions, 2 ajouts, 3 multiplications, et 1 sqrtf.
Pour le profilage des applications que vous pouvez utiliser AQTime 7 Standard (gratuit pour le moment), ou gprof (si vous êtes à la compilation avec gcc/g++).
D3DXVec3Length(&(Point1-Point2))
est l'équivalent de la formule de la distance.