Cum funcționează transformarea matricială a unei figuri 2D

Reprezentarea figurii

O figură este descrisă printr-o listă de vârfuri. Coordonatele X formează primul rând al matricei A, iar coordonatele Y formează al doilea rând. De exemplu, trei puncte (1, 2), (3, 2), (2, 4) devin:

       P1  P2  P3
A = X [ 1   3   2 ]
    Y [ 2   2   4 ]

În laboratorul interactiv puteți introduce propriile puncte, câte unul pe rând, în formatul x, y.

Transformarea prin matrice

Înmulțim matricea transformării T (2×2) cu matricea coordonatelor A (2×N). Rezultatul C conține coordonatele transformate. Pentru fiecare punct, formula este:

x' = T[0][0] · x + T[0][1] · y
y' = T[1][0] · x + T[1][1] · y

Cod C++

Programul de mai jos citește numărul de vârfuri și coordonatele introduse de utilizator, apoi aplică matricea de transformare.

#include <iostream>
#include <iomanip>
using namespace std;

const int MAX_PUNCTE = 100;

void transformaPuncte(double T[2][2], double A[2][MAX_PUNCTE],
                      double C[2][MAX_PUNCTE], int nrPuncte) {
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < nrPuncte; j++) {
            C[i][j] = 0;
            for (int k = 0; k < 2; k++) {
                C[i][j] += T[i][k] * A[k][j];
            }
        }
    }
}

int main() {
    int nrPuncte;
    double A[2][MAX_PUNCTE], C[2][MAX_PUNCTE];
    double T[2][2] = {{2, 0}, {0, 2}};

    cout << "Numarul de varfuri (3-100): ";
    cin >> nrPuncte;
    if (!cin || nrPuncte < 3 || nrPuncte > MAX_PUNCTE) {
        cout << "Numar de varfuri invalid.\n";
        return 1;
    }

    for (int j = 0; j < nrPuncte; j++) {
        cout << "Coordonatele punctului P" << j + 1 << " (x y): ";
        cin >> A[0][j] >> A[1][j];
        if (!cin) {
            cout << "Coordonate invalide.\n";
            return 1;
        }
    }

    transformaPuncte(T, A, C, nrPuncte);
    cout << fixed << setprecision(2);
    for (int j = 0; j < nrPuncte; j++) {
        cout << "P" << j + 1 << ": (" << A[0][j] << ", " << A[1][j]
             << ") -> (" << C[0][j] << ", " << C[1][j] << ")\n";
    }
    return 0;
}

Pentru a încerca alte transformări, modificați valorile matricei T.