2. Classe de points et vecteurs
Objectif: Appliquer les connaissances de C++ acquise.
Le but de cet exercice est la création d'une classe PtVec
qui encapsule des calculs utiles sur des points et vecteurs en 2D.
Cette classe sera utilisée dans les exercices qui suivent.
Manipulation 2.1 : Créez une classe PtVec
(dans le fichier d'en-tête PtVec.h
) servant à gérer des points et des vecteurs en 2D.
Vous devez implémenter les fonctionnalités suivantes :
- Addition et soustraction de vecteurs
- Multiplication avec un scalaire (mise à l'échelle du vecteur)
- Calcul de la longueur du vecteur et normaliser un vecteur
- Produit scalaire et surface entre deux vecteurs
- Calcul de l'angle entre le vecteur et l'axe positif des X
- Calcul de l'angle entre deux vecteurs
- Rotation d'un vecteur
Conseils :
- Utilisez la commande
g++
(au lieu de gcc
) pour compiler un programme C++!
- Vous pouvez vous inspirer de la classe
Complex
vue au cours.
- Etudiez et utilisez le programme de test ci-dessous pour mieux comprendre les méthodes à implémenter et vérifier votre code.
Le programme testPtVec.cpp permet de vérifier de votre solution. Les commentaires expliquent les différentes fonctionnalités demandées ainsi que l'affichage résultant de printf
.
Note : Le formateur %g
dans les appels à printf()
affiche des nombres réels de manière "intelligent" en faisant un compromis entre la place à disposition et la précision affiché.
#include <stdio.h>
#include "PtVec.h"
int main(void)
{
PtVec v1, v2, v3;
double r;
v1.x = 1; v1.y = 0; // Direct access to x and y
printf("v1: %g %g\n", v1.x, v1.y); // 1 0
v2 = PtVec(1, 0); // Constructor: PtVec(x,y)
printf("v2: %g %g\n", v2.x, v2.y); // 1 0
v2.set(0, 1); // Accessor function
printf("v2: %g %g\n", v2.x, v2.y); // 0 1
v3 = v1 + v2; // + operator
printf("v3: %g %g\n", v3.x, v3.y); // 1 1
v3 = v1 - v2; // - operator
printf("v3: %g %g\n", v3.x, v3.y); // 1 -1
v3 = -v2; // negate operator
printf("v3: %g %g\n", v3.x, v3.y); // -0 -1
v3 = (v1+v2) * 2; // * operator
printf("v3: %g %g\n", v3.x, v3.y); // 2 2
v3 = 0.25 * v3; // * operator
printf("v3: %g %g\n", v3.x, v3.y); // 0.5 0.5
r = v3.length(); // length of vector
printf("r: %g\n", r); // 0.707107
r = v3 * v1; // inner product
printf("r: %g\n", r); // 0.5
r = v1.area(v2); // area spawn by v1 and v2
// (length of cross product)
printf("r: %g\n", r); // 1
v3 = v3.normalized(); // get a normalized vector
printf("v3: %g %g\n", v3.x, v3.y); // 0.707107 0.707107
v3.scale(2); // scale vector with factor
printf("v3: %g %g\n", v3.x, v3.y); // 1.41421 1.41421
v2.scale(v3); // scale vector with vector
printf("v2: %g %g\n", v2.x, v2.y); // 0 1.41421
v2.normalize(); // Normalize vector
printf("v2: %g %g\n", v2.x, v2.y); // 0 1
r = v3.angle(); // calculate angle with pos.
// X axis
printf("r: %g %g\n", r, r*180/M_PI); // 0.785398 45
r = v1.angle(v2); // calculate angle between
// vectors
printf("r: %g %g\n", r, r*180/M_PI); // 1.5708 90
r = v2.angle(v1); // calculate angle between
// vectors
printf("r: %g %g\n", r, r*180/M_PI); // -1.5708 -90
v3 = v1+v2;
v3.rotate(M_PI/2); // rotate vector
printf("v3: %g %g\n", v3.x, v3.y); // -1 1
return 0;
}