Vecteurs 2

Note pour les utilisateurs d'Internet Explorer

Cette page affiche des formules mathématiques en utilisant un script MathML.
Si vous lisez ceci avec Internet Explorer, je vous recommande d'accepter l'exécution de ce script quand IE vous le
demande.

Changer l'angle d'un vecteur

Dans le dernier article on a vu comment calculer l'angle entre un vecteur et l'axe horizontal.
Maintenant on peut faire le contraire: changer l'angle d'un vecteur en conservant sa longueur.
D'après les règles de trigonométrie, si on veut définir l'angle d'un vecteur de longueur R on doit mettre ses
coordonnées aux valeurs indiquées sur cette image.


Ca conduit à ce code:
		void Vec2f::setAngle(const float angle)
		{
			float	R = mag();
			x = R * cos(angle);
			y = R * sin(angle);
		}
				

Multiplier un vecteur par un nombre

SI on multiplie un vecteur par un nombre positif ça revient à modifier sa longueur.


Le multiplier par un nombre négatif change aussi sa longueur, mais ça le retourne aussi.


C'est équivalent à multiplier chaque coordonnée du vecteur par le nombre.
		Vec2f Vec2f::operator*(const float m)
		{
			Vec2f   result;

			result.x = m * x;
			result.y = m * y;

			return result;
		}

		Vec2f& Vec2f::operator*=(const float m)
		{
			x *= m;
			y *= m;
			return *this;
		}
				

Diviser un vecteur par un nombre

Diviser un vecteur par un nombre est à peu près la même chose que le multiplier.
Ca ne nécessite pas plus d'explications.
		Vec2f Vec2f::operator/(const float m)
		{
			Vec2f   result;

			result.x = x / m;
			result.y = y / m;

			return result;
		}

		Vec2f& Vec2f::operator/=(const float m)
		{
			x /= m;
			y /= m;
			return *this;
		}
				

Normaliser un vecteur

Quand on fait des calculs avec les vecteurs on veut souvent utiliser des vecteurs de longueur 1.
Réduire la longueur d'un vecteur à 1 est une opération appelée normalisation.
On doit simplement diviser les coordonnées du vecteur par sa longueur.
		void Vec2f::normalize()
		{
			float	m = mag();
			*this /= m;
		}
				
Si vous vous référez à l'image de la fonction setAngle() vous comprendrez que les coordonnées d'un vecteur
normalisé sont simplement le cosinus et le sinus de son angle.

Produit scalaire

On définit habituellement deux types de multiplications entre 2 vecteurs: le produit scalaire (en anglais dot
product) et le produit vectoriel (en anglais cross product).
Le produit scalaire de 2 vecteurs u et v s'écrit u v .
Son résultat est un nombre défini comme x u x v + y u y v .
Ca peut facilement se programmer:
		float Vec2f::dot(const Vec2f& a)
		{
			return x * a.x + y * a.y;
		}
				
Le produit scalaire a aussi une autre formulation mathématique:
u v = u v cos θ
où θ est l'angle entre u et v .
Cette formulation amène à différents usages en informatique.

D'abord, si u et v sont normalisés, le produit nous donne le cosinus de l'angle entre eux
sans avoir à calculer l'angle lui-même.

Si l'un des vecteurs est normalisé, disons v , le produit nous donne la longueur de la projection de u sur la
droite qui supporte v .


Même si les vecteurs ne sont pas normalisés, regarder leur produit nous donne des informations sur leur position
relative.

Produit vectoriel

Le produit vectoriel de u and v s'écrit u v .
Contrairement au produit scalaire, le résultat est un vecteur, et en particulier un vecteur en 3D.
En fait, ce vecteur est perpendiculaire aux 2 vecteurs de départ.
Donc en 2D ses coordonnées x et y sont zéro. On s'intéresse seulement à sa coordonnée z qui est définie comme:
x u y v - y u x v
Ca se traduit par ce code:
		float Vec2f::cross(const Vec2f& a)
		{
			return x * a.y - y * a.x;
		}
				
Comme pour le produit scalaire, le produit vectoriel a aussi une autre notation mathématique:
u v = u v sin θ k
Où θ est l'angle de u vers v , et k est le vecteur unitaire le long de l'axe z.

Cette formulation entraine diverses propriétés utiles.
Si les 2 vecteurs sont normalisés, le produit est le sinus de l'angle entre eux.

Le signe du produit nous dit de quel coté de la ligne définie par u se trouve v .


En 2D le produit vectoriel est parfois utilisé pour calculer des distance, mais il est surtout utilisé pour
détecter une intersection entre 2 lignes.
Il peut aussi être utilisé pour différencier l'intérieur de l'extérieur d'un polygone.

Code source de la classe Vec2f.