diff --git a/puzzle.c b/puzzle.c index 17ac4764148b868ffcbf98ca05af6dfac1a39ed4..2a79bd664d49f2036778e95cc4dc706e503af06c 100644 --- a/puzzle.c +++ b/puzzle.c @@ -37,3 +37,54 @@ Dimensions calculer_dimensions(uint64_t piece) { dim.hauteur = max_row - min_row + 1; return dim; } + +//Normaliser (ramener la pièce en haut à gauche) +uint64_t normaliser(uint64_t piece) { + if (piece == 0) return 0; + int min_r = 8, min_c = 8; + + for (int r = 0; r < 8; r++) { + for (int c = 0; c < 8; c++) { + if (piece & BIT(r, c)) { + if (r < min_r) min_r = r; + if (c < min_c) min_c = c; + } + } + } + + uint64_t res = 0; + for (int r = 0; r < 8; r++) { + for (int c = 0; c < 8; c++) { + if (piece & BIT(r, c)) { + res |= BIT(r - min_r, c - min_c); + } + } + } + return res; +} + +//Rotation 90° +uint64_t rotation_90(uint64_t piece) { + uint64_t res = 0; + for (int r = 0; r < 8; r++) { + for (int c = 0; c < 8; c++) { + if (piece & BIT(r, c)) { + res |= BIT(c, 7 - r); + } + } + } + return normaliser(res); +} + +//Miroir +uint64_t miroir_horizontal(uint64_t piece) { + uint64_t res = 0; + for (int r = 0; r < 8; r++) { + for (int c = 0; c < 8; c++) { + if (piece & BIT(r, c)) { + res |= BIT(r, 7 - c); + } + } + } + return normaliser(res); +}