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 :

Conseils :

Programme de test

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;
}