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
- Scalare: matrice diagonală, de exemplu [[2, 0], [0, 2]], mărește figura de două ori.
- Reflexie față de axa X: [[1, 0], [0, -1]] schimbă semnul coordonatei Y.
- Reflexie față de axa Y: [[-1, 0], [0, 1]] schimbă semnul coordonatei X.
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.