#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <math.h>
#include <stdbool.h>
// DEFINITION DES TYPES
typedef float Flottant; // choix du type de précision
struct Sommet { // on a besoin de l'abcisse et de l'ordonnée d'un sommet pour le décrire
Flottant abcisse;
Flottant ordonnee;
};
typedef struct Sommet Sommet; // on définit un type Sommet afin d'éviter de taper struct à chaque fois qu'on l'utilise
struct Rectangle { // on peut décrire un rectangle totalement en connaissant les coordonnées de deux de ses sommets opposés
Sommet sommet_origine;
Sommet sommet_oppose;
};
typedef struct Rectangle Rectangle; // on définit un type Rectangle afin d'éviter de taper struct à chaque fois qu'on l'utilise
struct Longueur_largeur { // longueur et largeur d'un rectangle
Flottant longueur;
Flottant largeur;
};
typedef struct Longueur_largeur Longueur_largeur; // on définit un type Longueur_largeur afin d'éviter de taper struct à chaque fois qu'on l'utilise
struct Vecteur { // vecteur de translation d'un rectangle
Flottant abcisse_vecteur;
Flottant ordonnee_vecteur;
};
typedef struct Vecteur Vecteur; // on définit un type Vecteur afin d'éviter de taper struct à chaque fois qu'on l'utilise
// PROGRAMMES "OUTILS"
void differenciation_sommets (Rectangle* rect) { // nom pas terrible pour l'instant
/* Imposer au rectangle que le sommet sommet_origine soit celui en haut à
* gauche et le sommet somet_oppose soit celui en bas à droite
*/
/* Permuter les sommets sommet_origine et sommet_oppose si le sommet sommet_origine a une ordonnée plus petite que celle du sommet sommet_oppose */
if ((*rect).sommet_origine.ordonnee < (*rect).sommet_oppose.ordonnee) {
Sommet memoire_sommet_oppose; // on stocke en mémoire le sommet sommet_oppose afin d'effectuer une permutation entre sommet_origine et sommet_oppose
memoire_sommet_oppose.abcisse = (*rect).sommet_oppose.abcisse;
memoire_sommet_oppose.ordonnee = (*rect).sommet_oppose.ordonnee;
(*rect).sommet_oppose.abcisse = (*rect).sommet_origine.abcisse; // on effectue la permutation
(*rect).sommet_oppose.ordonnee = (*rect).sommet_origine.ordonnee;
(*rect).sommet_origine.abcisse = memoire_sommet_oppose.abcisse;
(*rect).sommet_origine.ordonnee = memoire_sommet_oppose.ordonnee;
printf("ici");
[color=#55ff00]printf("\n %d,%d, , %d, %d\n", &((*rect).sommet_origine.abcisse), &((*rect).sommet_origine.ordonnee), &((*rect).sommet_oppose.abcisse), &((*rect).sommet_oppose.ordonnee));
}; [/color]
/* Permuter les abcisses des sommets sommet_origine et sommet_oppose si le sommet sommet_origine a une abcisse plus grande que celle du sommet sommet_oppose */
if ((*rect).sommet_origine.abcisse > (*rect).sommet_oppose.abcisse) {
Flottant memoire_abcisse_sommet_oppose = (*rect).sommet_oppose.abcisse; // on stocke en mémoire l'abcisse du sommet sommet_oppose afin d'effectuer une permutation entre sommet_origine.abcisse et sommet_oppose.abcisse
(*rect).sommet_oppose.abcisse = (*rect).sommet_origine.abcisse; // on effectue la permutation
(*rect).sommet_origine.abcisse = memoire_abcisse_sommet_oppose;
printf("là");
};
};
Rectangle initialisation_rectangle_sommets(const Sommet som_org, const Sommet som_opp) {
/* OP_1: Initialiser un rectangle à partir de deux sommets opposés
*/
Rectangle rect;
rect.sommet_origine.abcisse = som_org.abcisse; // le rectangle est initialisé à partir de ses sommets opposés
rect.sommet_origine.ordonnee = som_org.ordonnee;
rect.sommet_oppose.abcisse = som_opp.abcisse; // le rectangle est initialisé à partir de ses sommets opposés
rect.sommet_oppose.ordonnee = som_opp.ordonnee;
//assert(est_rectangle_valide(rect)); // vérification de la postcondition
differenciation_sommets(&rect); // on place les sommets de façon naturelle
return rect;
};
void test_op_1() {
/* Tester l'opération OP_1 */
/* On réalise une initialisation avec un rectangle dont les sommets
* sont disposés de façon inhabituelle: le sommet sommet_origine est en bas
* à droite et le sommet sommet_oppose est en haut à gauche.
* Cela permet de tester le sous-programme differenciation_sommets qui se
* trouve dans le programme initialisation_rectangle_sommets.
* On initialise un rectangle R1d, qu'on teste ensuite.
*/
Sommet sommet_origine_R1d;
sommet_origine_R1d.abcisse = -5;
sommet_origine_R1d.ordonnee = 10;
Sommet sommet_oppose_R1d;
sommet_oppose_R1d.abcisse = 4;
sommet_oppose_R1d.ordonnee = -3;
Rectangle R1d;
R1d = initialisation_rectangle_sommets(sommet_origine_R1d, sommet_oppose_R1d);
[color=#55ff00] //assert((R1d.sommet_origine.abcisse == 4) && (R1d.sommet_origine.ordonnee == -3) && (R1d.sommet_oppose.abcisse == -5) && (R1d.sommet_oppose.ordonnee == 10)); // on teste les coordonnées disposées de façon naturelle[/color]
printf("Le rectangle R1d a été initialisé avec succès.\n");
};
int main()
{
/* On teste les différentes opérations */
test_op_1();
return EXIT_SUCCESS;
}