Comme le dit John D. Cook - vous faites cela principalement parce que vous vous souciez de la direction, et non du vecteur lui-même. Selon le contexte, il est plus que probable que vous ne vouliez pas / n'ayez pas besoin de l'information sur la magnitude - seulement de la direction elle-même. La normalisation permet de supprimer la magnitude afin qu'elle ne fausse pas les autres calculs, ce qui simplifie beaucoup d'autres choses.
En termes d'IA, imaginez que vous prenez le vecteur V entre P1 (le méchant de l'IA) et P2 (votre héros) comme la direction dans laquelle le méchant doit se déplacer. Vous voulez que le méchant se déplace à une vitesse N par battement - comment calculez-vous cela ? Eh bien, soit nous normalisons le vecteur à chaque battement, puis nous le multiplions par N pour déterminer la distance parcourue, soit nous normalisons la direction au départ, et nous multiplions simplement le vecteur unitaire par N à chaque fois - sinon le méchant se déplacerait davantage s'il était plus éloigné du héros ! Si le héros ne change pas de position, c'est un calcul de moins à faire.
Dans ce contexte, ce n'est pas un gros problème - mais qu'en est-il si vous avez une centaine de méchants ? Ou un millier ? Et si votre IA doit faire face à des combinaisons de méchants ? Soudain, c'est une centaine ou un millier de normalisations que vous économisez par battement. Comme il s'agit d'une poignée de multiplications et d'un carré de racine pour chacune d'entre elles, vous finissez par atteindre le point où le fait de ne pas normaliser les données à l'avance signifie que vous allez tuer le taux de traitement de votre IA.
De manière plus générale - les mathématiques pour cela sont vraiment communes - les gens font ici ce qu'ils font pour des choses comme le rendu 3D - si vous n'unitiez pas, par exemple, les normales de vos surfaces, vous auriez potentiellement des milliers de normalisations par rendu qui sont complètement inutiles. Vous avez deux options : un - faire en sorte que chaque fonction effectue le calcul, ou deux - pré-normaliser les données.
Du point de vue du concepteur du framework : la seconde est intrinsèquement plus rapide - si nous supposons la première, même si votre utilisateur pense à normaliser les données, il devra passer par la même routine de normalisation OU vous devrez fournir deux versions de chaque fonction, ce qui est un casse-tête. Mais au point où vous faites réfléchir les gens sur la version de la fonction à appeler, vous pouvez tout aussi bien les faire réfléchir suffisamment pour qu'ils appellent la bonne version, et ne la fournir qu'en premier lieu, en leur faisant faire la bonne chose pour les performances.