Fr/Vector

Vector est une classe C++ représentant une ligne avec une direction et une longueur, elle commence à l'origine () courante. En français cela est tous simplement un vecteur
Chaque vecteur contient trois 'ordonnées' (ordinates). (0,20,5) signifie 20 en face et 5 unités au dessus de l'origin courante.
== Déclaration ==
 Vector vecMyVector = Vector(0,20,5);
* Le nom de classe (classname) Vector est sensible à la case.
* Vous pouvez aussi assigner les variables X, Y et Z séparément.
* vec (ou simplement v) comme suffixe, identifie une variable comme étend un vecteur Vector.
=== Orientation ===
Dans la majorité des cas, les vecteurs sont considérés comme étends orientés de manière 'relative' au coordonnées global. Ainsi, ils sont alignés sur les axes du monde 3D (world-axis-aligned): l'horizon ou composante X, est aligné d'est en ouest. 
La profondeur de champs ou composante Y, est aligné du nord au sud. 
L'altitude ou composante Z, est aligné de haut en bas.
Cependant dans quelques cas, le vecteur peut aussi être considéré comme étend aligné sur les axes d'un objet (object-axis-aligned) - orienté dans le sens des coordonnées et angles locaux de son parent. C'est dans ce cas que certaines fonctions sont utilisées pour appliquer une force à un objet physique. Ainsi les codeurs doivent en être conscient, et vérifier tout commentaires spécifiés quand ils sont dans le doute.
Un exemple de cela serait dans le fichier vphysics_interface.cpp pour la classe IPhysicsObject :
	// force the velocity to a new value
	// NOTE: velocity is in worldspace, angularVelocity is relative to the object's 
	// local axes (just like pev->velocity, pev->avelocity)
	virtual void	SetVelocity( const Vector *velocity, const AngularImpulse *angularVelocity ) = 0;
Pour attribuer une force world-axis-aligned (cf plus haut) à une force object-axis-aligned, vous pouvez utiliser : 
	VectorIRotate( aiIn, EntityToWorldTransform(), aiOut );
== Utilisation ==
=== Positionnement ===
Toutes les positions des entités sont stockées comme des vecteurs relatifs à leurs s. Vous devez être familiarisé avec cette notion via le système de la .
Les vecteurs relatifs à un parent (apparentés) stockés par l'entité sont 'locaux'; Calculer un vecteur absolue relatif au requiert un peu plus de calcule. Les deux fonctions Abs ci-dessous les font pour vous, mais sont plus . 
* , 
* , 
=== Mouvement ===
Une entité qui tente de se déplacer de la longueur de son vecteur de vélocité. Aura un code à peu près comme ça:
 Vector velocity = Vector(0,5,0); // 5 units/second in the +Y direction
 
 Vector vecNewOrigin = GetAbsOrigin() + velocity * {{L|gpGlobals}}->frametime; // frametime is in seconds, e.g. 0.033
 
 SetAbsOrigin(vecNewOrigin);
Noté comment frametime est utilisé pour réguler la vitesse de l'entité en fonction du temps requit pour calculer chaque frame. Regarder Multiplication scalaire pour plus de détails sur cette opération.
Comme avec l'origine, la vélocité est stockée relativement au parent. AbsVelocity représente la vélocité relative au cadre du reste du monde 3D, et c'est la méthode la plus utilisé communément.
* , 
* , 
=== Tracelines ===
Article principale: 
Tracer est le procédé qui consiste à aller d'un point A à un point B, et de trouver la première chose qui sera "touchée" sur notre chemin allant de A à B (TraceLine).
== Opérations ==
Tous les vecteurs lors d'une opération doivent avoir la même pour que le résultat est un sens (au propre comme au figuré). Si vous utilisez une origine local ou absolue, de cela dépends directement se que vous essayez d'obtenir.
=== Addition ===
Ajouter deux (ou plus) vecteurs les combines. Vous avez déjà expérimenté l'addition de vecteur si vous avez déjà poussé un objet avec vos mains!
=== Soustraction ===
Soustraire un vecteur par un autre produit la différence des deux. En d'autres termes comment obtenir la position du premier vecteur, depuis le deuxième. Le résultat est donc local au second vecteur.
=== Multiplication ===
==== Scalaire ====
Multiplier ou diviser un vecteur par un (nb: un ou ) changera ça longueur (Mathématiquement appellé "magnitude") sans affecter ça direction.
==== Produit scalaire (dot product) ====
Multiplier deux vecteurs normalisés puis additionné leurs ordonnés obtenues est appelé Produit Scalaire (dot product en anglais), cela permet de savoir l'angle qui sépare les deux vecteurs (Mathématiquement appelé l'argument des vecteurs). Pourquoi dire Argument au lieu d'Angle tout simplement car la valeurs obtenue est un cosinus et non pas une valeur en degrés. Si celle-ci vaut +1 alors les vecteurs sont alignés, si elle vaut 0 alors les vecteurs sont perpendiculaire l'un à l'autre, si elle vaut -1 alors les vecteurs sont opposés
Ce code calcule un produit scalaire avec les diverses fonctions d'aide de Source.
 Vector vecTarget = GetAbsOrigin() - pTarget->GetAbsOrigin();	// Get local vector to target
 VectorNormalize(vecTarget);	// Normalisation needs to be done beforehand
 
 Vector vecFacing;
 (GetLocalAngles(),&vecFacing);	// Convert facing angle to equivalent vector (arrives normalised)
 
 float result = DotProduct(vecTarget,vecFacing);	// Get the dot product.
 
 if (result > 0)
 	Msg("pLa cible est devant moi!\n");
==== Le produit vectoriel (cross product) ====
Le produit vectoriel ou cross product en anglais, est le vecteur perpendiculaire à deux autres vecteurs. Il est utilisé pour extrapoler une troisième dimension à partir de deux vecteurs: Le produit vectoriel d'un vecteur pointant le bas de l'axe X et d'un vecteur pointant le bas de l'axe Y, sera un vecteur pointant le bas de l'axe Z. 
Si l'équation suivante est trop compliquée ne vous en faite pas, Source à des fonctions qui font ça pour vous!
Soit un vecteur A et un vecteur B, ordonné en X, Y et Z. On obtient leur produit vectoriel dans un vecteur N comme suis:
N.x = (A.y * B.z) - (A.z * B.y)
N.y = (A.z * B.x) - (A.x * B.z)
N.z = (A.x * B.y) - (A.y * B.x)
Dans source il suffit de faire CrossProduct(vecA,vecB,&vecResult). 
Il n'est en général pas nécessaire de normaliser les vecteurs passés en argument. Il est rare que les moddeurs utilisent le produit vectoriel, comme toujours, si cela est requit, soyez conscient du niveau de mathématique requit pour comprendre ce genre d'opération.
== Fonctions membres ==
=== Longueur ===
; Length()
; vec_t LengthSqr()
: Length() retourne la longueur du vecteur en . Cependant il est plus rapide d'utiliser LengthSqr() et de prendre la racine du résultat pour comparer .
; IsLengthGreaterThan(flValue)
; bool IsLengthLessThan(flValue)
: Effectuer un rapide test de longueur grâce à la fonction d'aide LengthSqr().
; void Zero()
: Ce qui veux dire?
=== Direction ===
; void Init(vec_t X, Y, Z)
: Définit rapidement l'ordonée d'un vecteur existant.
; void Random(vec_t minVal,vec_t maxVal)
: Attribue des valeurs aléatoire pour les trois ordonnées dans l'intervalle donné.
; void Negate()
: Inverse la direction du vecteur sans en affecter la longueur.
; Vector Max(vOther)
; Vector Min(vOther)
: "Pince" les ordonnées du vecteur qu'elles soit au-dessus ou au-dessous des valeurs données. Les ordonnées ne resteront pas proportionnels (nb: La direction peu changer)
=== Comparaison ===
; vec_t DistTo(vOther)
; vec_t DistToSqr(vOther)
: Retourne la distance entre le vecteur courant et de vOther comme un scalaire. Comme toujours, une racine (flavour?) est plus rapide.
; vec_t Dot(vOther)
: Retourne le produit scalaire du vecteur courant et de vOther.
; Vector Cross(vOther)
: Retourne le produit vectoriel du vecteur courant et de vOther.
; bool WithinAABox(vecBoxmin,vecBoxmax)
: Est-ce que le vecteur finit avec cetet boite? L'Argument du vecteur est local.
=== Casts ===
; Vector2D AsVector2D()
: Cast en .
; vec_t Length2D()
; vec_t Length2DSqr()
: Cast dans leurs équivalent standard, en ignorant l'axe Z.
; Base()
: Cast en . 
== Fonctions d'aide ==
Elles sont disponibles dans le fichier cbase.h.
; DotProduct(vecA,vecB)
: Voir produit scalaire.
; void CrossProduct(vecA,vecB,vecResult)
: Voir produit vectoriel.
; void VectorRotate(in1,in2,out)
; void VectorIRotate(in1,in2,out)
: Transforme un vecteur. Plusieurs surcharge accepte un ou un pour le paramètre in1 et un , ou pour le paramètre in2.
* , 
* and 
* 
== Voir aussi ==
* 
* 
* 
* 
* 
* 
* Les vecteurs sur le SiteDuZéro
Category:French