From 099a4b82ca0615ddbbd89c7819e5696ef1018629 Mon Sep 17 00:00:00 2001 From: Thomas Pietrzak Date: Sun, 23 Sep 2018 16:14:04 +0200 Subject: [PATCH] init --- client/BarreMenu.class | Bin 0 -> 6512 bytes client/CaFenetrePrincipal.class | Bin 0 -> 468 bytes client/CercleE.class | Bin 0 -> 767 bytes client/CercleListeE.class | Bin 0 -> 850 bytes client/CercleListeR.class | Bin 0 -> 850 bytes client/CercleR.class | Bin 0 -> 771 bytes client/Communication.class | Bin 0 -> 4810 bytes client/Dessin.class | Bin 0 -> 5400 bytes client/DroiteE.class | Bin 0 -> 807 bytes client/DroiteListeE.class | Bin 0 -> 850 bytes client/DroiteListeR.class | Bin 0 -> 850 bytes client/DroiteR.class | Bin 0 -> 828 bytes client/EcBarreMenu.class | Bin 0 -> 3016 bytes client/EcFCButtons.class | Bin 0 -> 1208 bytes client/EcFCCButtons.class | Bin 0 -> 1226 bytes client/EcFCRadioButtons.class | Bin 0 -> 812 bytes client/EcFChButtons.class | Bin 0 -> 1098 bytes client/EcFPButtons.class | Bin 0 -> 1092 bytes client/EcFSButtons.class | Bin 0 -> 1200 bytes client/EcFenetreChoix.class | Bin 0 -> 934 bytes client/EcFenetreConnection.class | Bin 0 -> 959 bytes client/EcFenetreConnectionChoix.class | Bin 0 -> 984 bytes client/EcFenetrePrincipal.class | Bin 0 -> 822 bytes client/EcFenetreSaisie.class | Bin 0 -> 939 bytes client/EcTimer.class | Bin 0 -> 531 bytes client/Espace.class | Bin 0 -> 7773 bytes client/FenetreChoix.class | Bin 0 -> 1809 bytes client/FenetreConnection.class | Bin 0 -> 2427 bytes client/FenetreConnectionChoix$1.class | Bin 0 -> 739 bytes client/FenetreConnectionChoix$2.class | Bin 0 -> 546 bytes client/FenetreConnectionChoix.class | Bin 0 -> 2652 bytes client/FenetrePrincipale.class | Bin 0 -> 29359 bytes client/FenetreSaisie.class | Bin 0 -> 1773 bytes client/Forme.class | Bin 0 -> 416 bytes client/MaDessin.class | Bin 0 -> 6044 bytes client/MmaDessin.class | Bin 0 -> 1241 bytes client/MwlDessin.class | Bin 0 -> 627 bytes client/PointE.class | Bin 0 -> 1009 bytes client/PointListeE.class | Bin 0 -> 845 bytes client/PointListeR.class | Bin 0 -> 845 bytes client/PointR.class | Bin 0 -> 1014 bytes client/Principal.class | Bin 0 -> 328 bytes client/TexteE.class | Bin 0 -> 846 bytes client/TexteListeE.class | Bin 0 -> 845 bytes client/TexteListeR.class | Bin 0 -> 845 bytes client/TexteR.class | Bin 0 -> 846 bytes client/class/BarreMenu.class | Bin 0 -> 6512 bytes client/class/CaFenetrePrincipal.class | Bin 0 -> 468 bytes client/class/CercleE.class | Bin 0 -> 767 bytes client/class/CercleListeE.class | Bin 0 -> 850 bytes client/class/CercleListeR.class | Bin 0 -> 850 bytes client/class/CercleR.class | Bin 0 -> 771 bytes client/class/Communication.class | Bin 0 -> 4810 bytes client/class/Dessin.class | Bin 0 -> 5400 bytes client/class/DroiteE.class | Bin 0 -> 807 bytes client/class/DroiteListeE.class | Bin 0 -> 850 bytes client/class/DroiteListeR.class | Bin 0 -> 850 bytes client/class/DroiteR.class | Bin 0 -> 828 bytes client/class/EcBarreMenu.class | Bin 0 -> 3016 bytes client/class/EcFCButtons.class | Bin 0 -> 1208 bytes client/class/EcFCCButtons.class | Bin 0 -> 1226 bytes client/class/EcFCRadioButtons.class | Bin 0 -> 812 bytes client/class/EcFChButtons.class | Bin 0 -> 1098 bytes client/class/EcFPButtons.class | Bin 0 -> 1092 bytes client/class/EcFSButtons.class | Bin 0 -> 1200 bytes client/class/EcFenetreChoix.class | Bin 0 -> 934 bytes client/class/EcFenetreConnection.class | Bin 0 -> 959 bytes client/class/EcFenetreConnectionChoix.class | Bin 0 -> 984 bytes client/class/EcFenetrePrincipal.class | Bin 0 -> 822 bytes client/class/EcFenetreSaisie.class | Bin 0 -> 939 bytes client/class/EcTimer.class | Bin 0 -> 531 bytes client/class/Espace.class | Bin 0 -> 7773 bytes client/class/FenetreChoix.class | Bin 0 -> 1809 bytes client/class/FenetreConnection.class | Bin 0 -> 2427 bytes client/class/FenetreConnectionChoix$1.class | Bin 0 -> 739 bytes client/class/FenetreConnectionChoix$2.class | Bin 0 -> 546 bytes client/class/FenetreConnectionChoix.class | Bin 0 -> 2652 bytes client/class/FenetrePrincipale.class | Bin 0 -> 29359 bytes client/class/FenetreSaisie.class | Bin 0 -> 1773 bytes client/class/Forme.class | Bin 0 -> 416 bytes client/class/MaDessin.class | Bin 0 -> 6044 bytes client/class/MmaDessin.class | Bin 0 -> 1241 bytes client/class/MwlDessin.class | Bin 0 -> 627 bytes client/class/PointE.class | Bin 0 -> 1009 bytes client/class/PointListeE.class | Bin 0 -> 845 bytes client/class/PointListeR.class | Bin 0 -> 845 bytes client/class/PointR.class | Bin 0 -> 1014 bytes client/class/Principal.class | Bin 0 -> 328 bytes client/class/TexteE.class | Bin 0 -> 846 bytes client/class/TexteListeE.class | Bin 0 -> 845 bytes client/class/TexteListeR.class | Bin 0 -> 845 bytes client/class/TexteR.class | Bin 0 -> 846 bytes client/class/images/bbas.gif | Bin 0 -> 79 bytes client/class/images/bdroite.gif | Bin 0 -> 78 bytes client/class/images/bgauche.gif | Bin 0 -> 81 bytes client/class/images/bhaut.gif | Bin 0 -> 79 bytes client/images/bbas.gif | Bin 0 -> 79 bytes client/images/bdroite.gif | Bin 0 -> 78 bytes client/images/bgauche.gif | Bin 0 -> 81 bytes client/images/bhaut.gif | Bin 0 -> 79 bytes dossier.pdf | Bin 0 -> 270014 bytes serveur/Connexion/Connexion.cpp | 91 +++ serveur/Connexion/Connexion.h | 94 +++ serveur/Connexion/Connexion.o | Bin 0 -> 5128 bytes serveur/Connexion/Makefile | 19 + serveur/Connexion/Socket.cpp | 129 ++++ serveur/Connexion/Socket.h | 113 +++ serveur/Connexion/Socket.o | Bin 0 -> 4448 bytes serveur/Connexion/SocketTCP.cpp | 106 +++ serveur/Connexion/SocketTCP.h | 63 ++ serveur/Connexion/SocketTCP.o | Bin 0 -> 5560 bytes serveur/Connexion/SocketUDP.cpp | 124 +++ serveur/Connexion/SocketUDP.h | 68 ++ serveur/Connexion/SocketUDP.o | Bin 0 -> 5424 bytes serveur/Contraintes/CCercle.cpp | 48 ++ serveur/Contraintes/CCercle.h | 52 ++ serveur/Contraintes/CCercle.o | Bin 0 -> 5552 bytes serveur/Contraintes/CCerclePassant1P.cpp | 81 ++ serveur/Contraintes/CCerclePassant1P.h | 72 ++ serveur/Contraintes/CCerclePassant1P.o | Bin 0 -> 6780 bytes serveur/Contraintes/CCerclePassant3P.cpp | 113 +++ serveur/Contraintes/CCerclePassant3P.h | 65 ++ serveur/Contraintes/CCerclePassant3P.o | Bin 0 -> 8516 bytes serveur/Contraintes/CCercleTangent2C.cpp | 120 +++ serveur/Contraintes/CCercleTangent2C.h | 66 ++ serveur/Contraintes/CCercleTangent2D.cpp | 184 +++++ serveur/Contraintes/CCercleTangent2D.h | 66 ++ serveur/Contraintes/CCercleTangent2D.o | Bin 0 -> 16584 bytes serveur/Contraintes/CDroite.cpp | 48 ++ serveur/Contraintes/CDroite.h | 52 ++ serveur/Contraintes/CDroite.o | Bin 0 -> 5180 bytes serveur/Contraintes/CDteHorizPassant1P.cpp | 52 ++ serveur/Contraintes/CDteHorizPassant1P.h | 51 ++ serveur/Contraintes/CDteHorizPassant1P.o | Bin 0 -> 5056 bytes serveur/Contraintes/CDteMediatrice2P.cpp | 75 ++ serveur/Contraintes/CDteMediatrice2P.h | 59 ++ serveur/Contraintes/CDteMediatrice2P.o | Bin 0 -> 6040 bytes serveur/Contraintes/CDteParall1D.cpp | 109 +++ serveur/Contraintes/CDteParall1D.h | 60 ++ serveur/Contraintes/CDteParall1D.o | Bin 0 -> 8816 bytes serveur/Contraintes/CDteParall1DPassant1P.cpp | 57 ++ serveur/Contraintes/CDteParall1DPassant1P.h | 60 ++ serveur/Contraintes/CDteParall1DPassant1P.o | Bin 0 -> 5932 bytes serveur/Contraintes/CDtePassant2P.cpp | 64 ++ serveur/Contraintes/CDtePassant2P.h | 58 ++ serveur/Contraintes/CDtePassant2P.o | Bin 0 -> 5332 bytes serveur/Contraintes/CDtePerp1DPassant1P.cpp | 60 ++ serveur/Contraintes/CDtePerp1DPassant1P.h | 58 ++ serveur/Contraintes/CDtePerp1DPassant1P.o | Bin 0 -> 5896 bytes serveur/Contraintes/CDteVertPassant1P.cpp | 52 ++ serveur/Contraintes/CDteVertPassant1P.h | 51 ++ serveur/Contraintes/CDteVertPassant1P.o | Bin 0 -> 5032 bytes serveur/Contraintes/CPoint.cpp | 52 ++ serveur/Contraintes/CPoint.h | 58 ++ serveur/Contraintes/CPoint.o | Bin 0 -> 5080 bytes serveur/Contraintes/CPointAppart1C.cpp | 88 +++ serveur/Contraintes/CPointAppart1C.h | 71 ++ serveur/Contraintes/CPointAppart1C.o | Bin 0 -> 6144 bytes serveur/Contraintes/CPointAppart1D.cpp | 84 ++ serveur/Contraintes/CPointAppart1D.h | 71 ++ serveur/Contraintes/CPointAppart1D.o | Bin 0 -> 6728 bytes serveur/Contraintes/CPointCentre1C.cpp | 51 ++ serveur/Contraintes/CPointCentre1C.h | 51 ++ serveur/Contraintes/CPointCentre1C.o | Bin 0 -> 4888 bytes serveur/Contraintes/CPointInter1C1D.cpp | 121 +++ serveur/Contraintes/CPointInter1C1D.h | 59 ++ serveur/Contraintes/CPointInter1C1D.o | Bin 0 -> 9540 bytes serveur/Contraintes/CPointInter2C.cpp | 117 +++ serveur/Contraintes/CPointInter2C.h | 58 ++ serveur/Contraintes/CPointInter2C.o | Bin 0 -> 10912 bytes serveur/Contraintes/CPointInter2D.cpp | 78 ++ serveur/Contraintes/CPointInter2D.h | 62 ++ serveur/Contraintes/CPointInter2D.o | Bin 0 -> 5952 bytes serveur/Contraintes/CPointIsole.cpp | 41 + serveur/Contraintes/CPointIsole.h | 63 ++ serveur/Contraintes/CPointIsole.o | Bin 0 -> 4916 bytes serveur/Contraintes/CPointMilieu2P.cpp | 54 ++ serveur/Contraintes/CPointMilieu2P.h | 57 ++ serveur/Contraintes/CPointMilieu2P.o | Bin 0 -> 5352 bytes serveur/Contraintes/Objet.cpp | 45 ++ serveur/Contraintes/Objet.h | 87 +++ serveur/Contraintes/Objet.o | Bin 0 -> 22376 bytes serveur/Contraintes/makefile | 96 +++ serveur/Doxyfile | 207 +++++ serveur/Formes/Cercle.cpp | 53 ++ serveur/Formes/Cercle.h | 78 ++ serveur/Formes/Cercle.o | Bin 0 -> 3188 bytes serveur/Formes/Droite.cpp | 98 +++ serveur/Formes/Droite.h | 110 +++ serveur/Formes/Droite.o | Bin 0 -> 3860 bytes serveur/Formes/Point.cpp | 53 ++ serveur/Formes/Point.h | 78 ++ serveur/Formes/Point.o | Bin 0 -> 1706 bytes serveur/Formes/makefile | 16 + serveur/Global.h | 19 + serveur/Listes/ListeCercles.cpp | 121 +++ serveur/Listes/ListeCercles.h | 82 ++ serveur/Listes/ListeCercles.o | Bin 0 -> 36992 bytes serveur/Listes/ListeCompo.cpp | 118 +++ serveur/Listes/ListeCompo.h | 93 +++ serveur/Listes/ListeCompo.o | Bin 0 -> 37736 bytes serveur/Listes/ListeDroites.cpp | 118 +++ serveur/Listes/ListeDroites.h | 82 ++ serveur/Listes/ListeDroites.o | Bin 0 -> 36624 bytes serveur/Listes/ListePoints.cpp | 122 +++ serveur/Listes/ListePoints.h | 82 ++ serveur/Listes/ListePoints.o | Bin 0 -> 36396 bytes serveur/Listes/makefile | 19 + serveur/Serveur/ServeurCompo.cpp | 727 ++++++++++++++++++ serveur/Serveur/ServeurCompo.h | 21 + serveur/Serveur/ServeurCompo.o | Bin 0 -> 20564 bytes serveur/Serveur/makefile | 11 + serveur/makefile | 23 + serveur/s.cpp | 254 ++++++ serveur/s.o | Bin 0 -> 6484 bytes serveur/scompo | Bin 0 -> 221230 bytes serveur/ssauvegarde.cpp | 238 ++++++ sujet.doc | Bin 0 -> 34816 bytes 218 files changed, 6927 insertions(+) create mode 100644 client/BarreMenu.class create mode 100644 client/CaFenetrePrincipal.class create mode 100644 client/CercleE.class create mode 100644 client/CercleListeE.class create mode 100644 client/CercleListeR.class create mode 100644 client/CercleR.class create mode 100644 client/Communication.class create mode 100644 client/Dessin.class create mode 100644 client/DroiteE.class create mode 100644 client/DroiteListeE.class create mode 100644 client/DroiteListeR.class create mode 100644 client/DroiteR.class create mode 100644 client/EcBarreMenu.class create mode 100644 client/EcFCButtons.class create mode 100644 client/EcFCCButtons.class create mode 100644 client/EcFCRadioButtons.class create mode 100644 client/EcFChButtons.class create mode 100644 client/EcFPButtons.class create mode 100644 client/EcFSButtons.class create mode 100644 client/EcFenetreChoix.class create mode 100644 client/EcFenetreConnection.class create mode 100644 client/EcFenetreConnectionChoix.class create mode 100644 client/EcFenetrePrincipal.class create mode 100644 client/EcFenetreSaisie.class create mode 100644 client/EcTimer.class create mode 100644 client/Espace.class create mode 100644 client/FenetreChoix.class create mode 100644 client/FenetreConnection.class create mode 100644 client/FenetreConnectionChoix$1.class create mode 100644 client/FenetreConnectionChoix$2.class create mode 100644 client/FenetreConnectionChoix.class create mode 100644 client/FenetrePrincipale.class create mode 100644 client/FenetreSaisie.class create mode 100644 client/Forme.class create mode 100644 client/MaDessin.class create mode 100644 client/MmaDessin.class create mode 100644 client/MwlDessin.class create mode 100644 client/PointE.class create mode 100644 client/PointListeE.class create mode 100644 client/PointListeR.class create mode 100644 client/PointR.class create mode 100644 client/Principal.class create mode 100644 client/TexteE.class create mode 100644 client/TexteListeE.class create mode 100644 client/TexteListeR.class create mode 100644 client/TexteR.class create mode 100644 client/class/BarreMenu.class create mode 100644 client/class/CaFenetrePrincipal.class create mode 100644 client/class/CercleE.class create mode 100644 client/class/CercleListeE.class create mode 100644 client/class/CercleListeR.class create mode 100644 client/class/CercleR.class create mode 100644 client/class/Communication.class create mode 100644 client/class/Dessin.class create mode 100644 client/class/DroiteE.class create mode 100644 client/class/DroiteListeE.class create mode 100644 client/class/DroiteListeR.class create mode 100644 client/class/DroiteR.class create mode 100644 client/class/EcBarreMenu.class create mode 100644 client/class/EcFCButtons.class create mode 100644 client/class/EcFCCButtons.class create mode 100644 client/class/EcFCRadioButtons.class create mode 100644 client/class/EcFChButtons.class create mode 100644 client/class/EcFPButtons.class create mode 100644 client/class/EcFSButtons.class create mode 100644 client/class/EcFenetreChoix.class create mode 100644 client/class/EcFenetreConnection.class create mode 100644 client/class/EcFenetreConnectionChoix.class create mode 100644 client/class/EcFenetrePrincipal.class create mode 100644 client/class/EcFenetreSaisie.class create mode 100644 client/class/EcTimer.class create mode 100644 client/class/Espace.class create mode 100644 client/class/FenetreChoix.class create mode 100644 client/class/FenetreConnection.class create mode 100644 client/class/FenetreConnectionChoix$1.class create mode 100644 client/class/FenetreConnectionChoix$2.class create mode 100644 client/class/FenetreConnectionChoix.class create mode 100644 client/class/FenetrePrincipale.class create mode 100644 client/class/FenetreSaisie.class create mode 100644 client/class/Forme.class create mode 100644 client/class/MaDessin.class create mode 100644 client/class/MmaDessin.class create mode 100644 client/class/MwlDessin.class create mode 100644 client/class/PointE.class create mode 100644 client/class/PointListeE.class create mode 100644 client/class/PointListeR.class create mode 100644 client/class/PointR.class create mode 100644 client/class/Principal.class create mode 100644 client/class/TexteE.class create mode 100644 client/class/TexteListeE.class create mode 100644 client/class/TexteListeR.class create mode 100644 client/class/TexteR.class create mode 100644 client/class/images/bbas.gif create mode 100644 client/class/images/bdroite.gif create mode 100644 client/class/images/bgauche.gif create mode 100644 client/class/images/bhaut.gif create mode 100644 client/images/bbas.gif create mode 100644 client/images/bdroite.gif create mode 100644 client/images/bgauche.gif create mode 100644 client/images/bhaut.gif create mode 100644 dossier.pdf create mode 100755 serveur/Connexion/Connexion.cpp create mode 100755 serveur/Connexion/Connexion.h create mode 100644 serveur/Connexion/Connexion.o create mode 100755 serveur/Connexion/Makefile create mode 100755 serveur/Connexion/Socket.cpp create mode 100755 serveur/Connexion/Socket.h create mode 100644 serveur/Connexion/Socket.o create mode 100755 serveur/Connexion/SocketTCP.cpp create mode 100755 serveur/Connexion/SocketTCP.h create mode 100644 serveur/Connexion/SocketTCP.o create mode 100755 serveur/Connexion/SocketUDP.cpp create mode 100755 serveur/Connexion/SocketUDP.h create mode 100644 serveur/Connexion/SocketUDP.o create mode 100644 serveur/Contraintes/CCercle.cpp create mode 100644 serveur/Contraintes/CCercle.h create mode 100644 serveur/Contraintes/CCercle.o create mode 100644 serveur/Contraintes/CCerclePassant1P.cpp create mode 100644 serveur/Contraintes/CCerclePassant1P.h create mode 100644 serveur/Contraintes/CCerclePassant1P.o create mode 100644 serveur/Contraintes/CCerclePassant3P.cpp create mode 100644 serveur/Contraintes/CCerclePassant3P.h create mode 100644 serveur/Contraintes/CCerclePassant3P.o create mode 100644 serveur/Contraintes/CCercleTangent2C.cpp create mode 100644 serveur/Contraintes/CCercleTangent2C.h create mode 100644 serveur/Contraintes/CCercleTangent2D.cpp create mode 100644 serveur/Contraintes/CCercleTangent2D.h create mode 100644 serveur/Contraintes/CCercleTangent2D.o create mode 100644 serveur/Contraintes/CDroite.cpp create mode 100644 serveur/Contraintes/CDroite.h create mode 100644 serveur/Contraintes/CDroite.o create mode 100644 serveur/Contraintes/CDteHorizPassant1P.cpp create mode 100644 serveur/Contraintes/CDteHorizPassant1P.h create mode 100644 serveur/Contraintes/CDteHorizPassant1P.o create mode 100644 serveur/Contraintes/CDteMediatrice2P.cpp create mode 100644 serveur/Contraintes/CDteMediatrice2P.h create mode 100644 serveur/Contraintes/CDteMediatrice2P.o create mode 100644 serveur/Contraintes/CDteParall1D.cpp create mode 100644 serveur/Contraintes/CDteParall1D.h create mode 100644 serveur/Contraintes/CDteParall1D.o create mode 100644 serveur/Contraintes/CDteParall1DPassant1P.cpp create mode 100644 serveur/Contraintes/CDteParall1DPassant1P.h create mode 100644 serveur/Contraintes/CDteParall1DPassant1P.o create mode 100644 serveur/Contraintes/CDtePassant2P.cpp create mode 100644 serveur/Contraintes/CDtePassant2P.h create mode 100644 serveur/Contraintes/CDtePassant2P.o create mode 100644 serveur/Contraintes/CDtePerp1DPassant1P.cpp create mode 100644 serveur/Contraintes/CDtePerp1DPassant1P.h create mode 100644 serveur/Contraintes/CDtePerp1DPassant1P.o create mode 100644 serveur/Contraintes/CDteVertPassant1P.cpp create mode 100644 serveur/Contraintes/CDteVertPassant1P.h create mode 100644 serveur/Contraintes/CDteVertPassant1P.o create mode 100644 serveur/Contraintes/CPoint.cpp create mode 100644 serveur/Contraintes/CPoint.h create mode 100644 serveur/Contraintes/CPoint.o create mode 100644 serveur/Contraintes/CPointAppart1C.cpp create mode 100644 serveur/Contraintes/CPointAppart1C.h create mode 100644 serveur/Contraintes/CPointAppart1C.o create mode 100644 serveur/Contraintes/CPointAppart1D.cpp create mode 100644 serveur/Contraintes/CPointAppart1D.h create mode 100644 serveur/Contraintes/CPointAppart1D.o create mode 100644 serveur/Contraintes/CPointCentre1C.cpp create mode 100644 serveur/Contraintes/CPointCentre1C.h create mode 100644 serveur/Contraintes/CPointCentre1C.o create mode 100644 serveur/Contraintes/CPointInter1C1D.cpp create mode 100644 serveur/Contraintes/CPointInter1C1D.h create mode 100644 serveur/Contraintes/CPointInter1C1D.o create mode 100644 serveur/Contraintes/CPointInter2C.cpp create mode 100644 serveur/Contraintes/CPointInter2C.h create mode 100644 serveur/Contraintes/CPointInter2C.o create mode 100644 serveur/Contraintes/CPointInter2D.cpp create mode 100644 serveur/Contraintes/CPointInter2D.h create mode 100644 serveur/Contraintes/CPointInter2D.o create mode 100644 serveur/Contraintes/CPointIsole.cpp create mode 100644 serveur/Contraintes/CPointIsole.h create mode 100644 serveur/Contraintes/CPointIsole.o create mode 100644 serveur/Contraintes/CPointMilieu2P.cpp create mode 100644 serveur/Contraintes/CPointMilieu2P.h create mode 100644 serveur/Contraintes/CPointMilieu2P.o create mode 100644 serveur/Contraintes/Objet.cpp create mode 100644 serveur/Contraintes/Objet.h create mode 100644 serveur/Contraintes/Objet.o create mode 100755 serveur/Contraintes/makefile create mode 100644 serveur/Doxyfile create mode 100644 serveur/Formes/Cercle.cpp create mode 100644 serveur/Formes/Cercle.h create mode 100644 serveur/Formes/Cercle.o create mode 100644 serveur/Formes/Droite.cpp create mode 100644 serveur/Formes/Droite.h create mode 100644 serveur/Formes/Droite.o create mode 100644 serveur/Formes/Point.cpp create mode 100644 serveur/Formes/Point.h create mode 100644 serveur/Formes/Point.o create mode 100755 serveur/Formes/makefile create mode 100644 serveur/Global.h create mode 100755 serveur/Listes/ListeCercles.cpp create mode 100755 serveur/Listes/ListeCercles.h create mode 100644 serveur/Listes/ListeCercles.o create mode 100755 serveur/Listes/ListeCompo.cpp create mode 100755 serveur/Listes/ListeCompo.h create mode 100644 serveur/Listes/ListeCompo.o create mode 100755 serveur/Listes/ListeDroites.cpp create mode 100755 serveur/Listes/ListeDroites.h create mode 100644 serveur/Listes/ListeDroites.o create mode 100755 serveur/Listes/ListePoints.cpp create mode 100755 serveur/Listes/ListePoints.h create mode 100644 serveur/Listes/ListePoints.o create mode 100755 serveur/Listes/makefile create mode 100644 serveur/Serveur/ServeurCompo.cpp create mode 100644 serveur/Serveur/ServeurCompo.h create mode 100644 serveur/Serveur/ServeurCompo.o create mode 100755 serveur/Serveur/makefile create mode 100755 serveur/makefile create mode 100755 serveur/s.cpp create mode 100644 serveur/s.o create mode 100755 serveur/scompo create mode 100755 serveur/ssauvegarde.cpp create mode 100644 sujet.doc diff --git a/client/BarreMenu.class b/client/BarreMenu.class new file mode 100644 index 0000000000000000000000000000000000000000..1ed88f59c252c18a4f7293a935008fecfeb117d4 GIT binary patch literal 6512 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 literal 0 HcmV?d00001 diff --git a/client/CaFenetrePrincipal.class b/client/CaFenetrePrincipal.class new file mode 100644 index 0000000000000000000000000000000000000000..9ae0c55173613413c10b1112343bf1a0b6b84709 GIT binary patch literal 468 zcmZ`#%Syvg5Ir}2B#p6;R8!qp6~P#xS-7kSQtYZo(c=ELoy9F_Qes-czY=_a3qQb* z66Y30sJc0GXXZRE^ZxPr2B3v)8wFHL$fIV%Mcu@PiA@2c+ZU+!x)f8EQa@GkNX=wK zZGqycidA+d;Q4>-k8T9=on%Y`m7a>}ay}hWI*`MNC)H6hoh32F*%jTYdm0Pu`@M-= z$WY#8AuV_lcD^|mx@~Ji`#PDYBkC$`(&)(5Z?&|A0}GymB1{tv2V3w2+}~V*=6`|b zV>!zx70CHIwYD0=;iajZ45W%8!X6*3z(?d`=}>+d{I*bHw7EOs-r!mZULXST1S2?R xcvwo-7+p31b{IVtHBrVcOC79#860rc23GJ0;~BXhrM;XVa;VRoGII=6J^{o-Wkvu1 literal 0 HcmV?d00001 diff --git a/client/CercleE.class b/client/CercleE.class new file mode 100644 index 0000000000000000000000000000000000000000..e3f821115c16ea61919ea52ddde58b0c48d8e370 GIT binary patch literal 767 zcmZvaZ%f-y6vm&MCQX~Bb@q?{tG07nj9PtZZShTMp-@y*2JT($!pN`*#8%jM+KUY= z1%-WpeJJs{X=+6z>?KyCQn9f7%y>p3UG{TJr)fll6R9hWE`^$pBJYyCr;|AjBZ2_J=8ID z$>dg(Smhn;Aseg29bpwU+N=|pMyxJ#KYt%;}Vt`e6g zBR=|2K~qo=pZ!tdxyh0g>C0qxX3n{1&g9SEAHM+XVc&*C&cYoV2672pLtbYE9q#II zPlx+DJg~5B;h_abV9EDJp%Pecblo$zJPtj-d>91ohX(5vf%tQ;?}Y~fF{k)iz^o2B zoK7~pzIr+CwN%h_TRtn6+Z~KU6$nVDQB^_PSG9^pBu3-mFz|Z1Wjb|TvW9``cLJg$ z3-f6{7P_9V+4xwU@zvp50sD9`4%+I4ryHv?YAsIH_OxV)BvJzDE96UD$BIM|C5atm zBpzW`(yEk18N1XG>7SOp;~5f=3I$!m0$aaF#}Si3y9KB7;i2R z`wsK#6tl*-!U5duBPWP|LRx3p39OS@X?a1l#>auj6#WDnc#1rpk?a<3N0bK_|GVvSs zxi}|>z+$B;`D$FO&gup-5m%nS+K}Z)*q1p<8wWHQvvd2L$Ub?cbu$az@dWRQ+9cY* F);}+Rk5&Kx literal 0 HcmV?d00001 diff --git a/client/CercleListeR.class b/client/CercleListeR.class new file mode 100644 index 0000000000000000000000000000000000000000..f63acd586e8da85af1747612d7e8357b634c19ae GIT binary patch literal 850 zcmZuvU279j5IuLZ%{J?`NgJy+X=CC?-K4fDqWBOglu#iM6w+W(P}n4wvSIVVW>e6g zBR=|2K~qo=pZ!tdxyh0g>C0qxX3n{1&g9SEAHM+XVc&*C&cYoV2672pLtbYE9q#II zPlx+DJg~5B;h_abV9EDJp%PfHcil6$JPtj-d>91ohdS#Of%tQ;?}Y~fF{k)iz^o2B zoKDugzIr+CwN%h_TRtn6+Z~KU6$nVDUR6QcSB;8BBu3-mFz|Z1WjZxovW9``cLJg$ z3-f6{7P_9V+4xwEv2plTz&;*~gSL9%>Bj1eT8mSSJuO)xiIhP43i%S(u_94KNn!^X ziAUI#v??W0#x8Y4I;rC_tw3r@=DYpV@~c)?wL@xgI~}^@%xt>UsuZcw9C;t9E*_}f z;Ec(--s^u7x@m`WqB%I8PRCAFhyo8Kc|gItP%X1KbFRd=%CCLIm;tHM1w`p5j5imE zeTVsVidkb^;RLV=6I;aPIGx6g2)#{KgI&Ay4d%`SOD7AQ{wDwq5;Ta4aWldkMVLa? z_>5duBPWP|LRx3p39OS@X?a1l#>auj6#WDnc#1rpk?a<3N0bK_|GVvSs zxi}|>z+$B;`Hr|)jnxfgBCb4twIR!qurG6zHV$YqX6N=fk$v(?>t+_b;|bmqwMn#r Ft$)VukCy-d literal 0 HcmV?d00001 diff --git a/client/CercleR.class b/client/CercleR.class new file mode 100644 index 0000000000000000000000000000000000000000..45ee67d2fd4f46978bfa5224a553a817746ad422 GIT binary patch literal 771 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≷#!QaG`Lt?NOA3IpW6D#CdW-d5+`rQ z94Z#j&4eUQNqKUobmlI9iOY3?qvm7lf;E-p{_;S1kh{>}+Z^!1B)+^E)2LlY@Kckh zYjOG0>ipw07^y(e-rrds6ygtb%YPDI(P(>W9>D2IoZ)~Lrvp=*5ttPJ1pPnxOfL5`4FVZyu#d4li?MYp<=5d!wGsQ(-FQkRaX>wZr_~`mqh6!@Fb=8@@EqIN^S%Nc z@|EEQ-*I@+SBrzbQ}K##Dqi!o;B{Xc-taBJo4z<@%W>GZlFuTAIQpEbW9|FN0fl=p zrM<*AzeKIwgZdqmINc(sSKlX1pr4felO4jR`)9DahONzwm#L*6GF~51b7@+CWJ*7e z;rG)dBgEQ-Z>L-(j+SA0%0(qd*_PB-aQo4_QAJ$37%Nh$?rx4}*Us9FIt~FfgqoLl zLL1r8!>RgBZ)hVMdK{t0Q~y#==-h1R)2MoxH*{_`bUmS`Qh%i}IaFQc4V{+_ zJ(tk)sDHU9w3!Wk0adT?hBmXI!-QT!{VP48^RuBP1y_4R=VwD-O6bd|f0ZZnpls+h zRK408dQdj>Izrz-{WZLwoczvAzCczfs9ULYEw3;~buLHA(~-Lh`3V%0+X^#W13=X~(Hv5seCo9t&DKSky1Jxz+eOb*iIS#7e`!%GQGW@dYNi6$>onZKMoObWbA z-lEB2ZL-e8q>v`(WP5p!CerqNciP13g+ABC{S4FgoEJYxPKT7Klct#xRdqU zv(DKnde85?8%E(MIA}WXZv@!9cZc^J6QGAFLN{tW*3N~026gJJJY}jPOX1Aa} zM|||5f~KG#KKrA@bCV@0(wE8X%$#%2oXMZRKYjt&!L9{~qKR7;5-6r|1tp!8b-1m= z9UboKaL>f1iTfsOfd$VUg-T$x)pJgrS`@loZ9fQ{4=vW~0;#9&zzz2Vl6K{_fN|h= zIh|>_1N9>6cT~`JIvy*g)AOTH1p?A;Jqvs{RE@euq({+k7`T1iGVG=c;YvT8mSS9W7ZRgRDUA68REWu_RGJRbmTy zi3ix0v??o6!!~uqI;rC#tw44{<~f6t+RIK)9f#E7bh~uPp4xPwRj*K^F>*grT`Ew0 z|CGt9-s^u7x@m=UqU|3}rjsWsM45+@JfPrRsFqoZIagv_=GQKg%z$k59HROYi8tp+ zeuwdOf>~i);sme`0~^E@Ii16`7`;i>1iM!C8;q?n7LMjP{Z9aFq-hWp<9du~#F%m+ z@fpQ}MvjsCgq+R_W0*(N(&C(Ig^vRdDf$uC@E9dLA=wSwj4AhG%A%&s&nYu8W%@U) zGjT=^f%!@Y5IuLZ%{J?`NgJy+X=75gZc^J6QGAFLO05tG71Cg_ps;B!WkZq;n@vGK zM|||5f~KG#KKoJPxyh0g>C0qxX3n{1&g9SEAHM)>W5&cZz#26749Kwf7B9oBWY zufqc!9$MJ2@W_HAFxT-0p%PfGwcT^KJPf@~c`pdu4>i^+0`V7K&kJ`2VovdmfVuCt zIGwC{J#{$jHdWAYn;ljxx9tx@6$nVD_A>CjP}M6Mkr)j7{lM$$mg!V=$?6BH*9wS| zEKH~QSm=5k&Bn*7jP<<}0sF`w2B+$kryGkCYAsIHx3y%6BvJzDYvfDZ#DYW-C5cUB zBpzc+(yEk18C%p5>7NKPlx7DIc&cvoGtxAy^&4Krk>f(Xw z`sYlR^7X4R-C)H<+6v%pK2g`kw$eNYEfE#_b4m5Mc^g z<1=zujT|BV32B{WN3f13rTH1v5+4ViQ1nx*;2H9GPO>|=8&U2?lsQeAnNcPq%EWKj z7vh2(0<)F&$#=lTs;sUc6LIDFs|}ftgngN!v~fU#F*~)-iR_ctS~s!a9Z&F{s8ym3 Gto;M*{*V*^ literal 0 HcmV?d00001 diff --git a/client/DroiteR.class b/client/DroiteR.class new file mode 100644 index 0000000000000000000000000000000000000000..763d0a4e04b9af0e316ac936d09e443d0499109f GIT binary patch literal 828 zcmZvZ+fEZv6o&sfbcWUeJXEYLMW_;oL3`;5Vxo)~64DDKMlV~OkTJAPYRhXG6B`pR zd;lNH`0YJSFtrzZt-aU$>syEU{paT|No{Rc6l%S!Kuu#djJapbW~i-DEk{n5lX7~T zGe^OGKFG%}9eMH2dq@7k@Kfe!^*A47ok_o!jZVA03nF2Bl%}bXMDcMt8s_8dWY1=N z$;PipjO|DN+`fQO!{^g$95Lf~9TYEI<=t>HI?E1o1CM6F_UG!=@0{bb0K2ufCY54`K z*@JqM#*5Kgusym6l7~RAdaJN9DP`n0D68~U=$pjNs!9oMeC1N?Ca}Q{c5N}*n@4{D n{Sp10g=lXc-9uVijQ-~r6dxFHI`h0g=I@Okhc-Z*jcq$f@s{Cuw_grouWF!i6V-@jf}zp8pOzx@5< z&j2Rjhdj(gU2i;(1$kJAdWl7OcoB>9umnrx?AEM);$t?S@%i2%er6UJ=Oye9E{*l1n&!I zv+4x;)Xp+J&#JSWY?VN-X|`kgGX(k;b?Gl&CeSnHCM|(}wYFm|$fnm>-V$?NihIn2 zZ@W&t<*j$Uw3QSnEUIlZH=3npi(hJOv>d;5rn1!V_bLvSx7f{k32U~^0s7Y@I+rks z2kNN7VI48VBltka5gervG1qY{6()jXIzGhl2tLyBF-}BqQpX}37RZmcwG($bX(Q`cM$&U_-_miKEyKzl zv=|A?OQgtgMg=K1<~lS-CbvQ(X=OKc#K`D4t1J}{vE+h~lWRLZMLExS@Khs4dG?5n%Q~Iw{ES&|N>EeEq`*1??kJdS)SHi>3cTEq!ZOcV=jE;88^u6S%-L(wQ z-0V6A?aDXoEh_srFRdfpenGvnj!WzxS8gmZod#MCzkk=m7Y_fevR6D{?>LBI`*&7RwR=RLqBi%=V5f80KwRA)*$MOVv6md-&_E49qSroOw@^eKj z=BCr8Lsf2YQE{%!sks)@(Qq25f_9ld*GEOwYR;OejKGkN!q{bXRmH35T6WeyD!eq) zY+4uXZ=K~)c^pFXbad3y90|LLE*MQT;DJucUfjB0|ER#%Pv$1dO&K@k+*EKgg_}xl zrg9UfCeG$Ko8xSbvpLS@IGf{ajBZY#+DdaWSSB+kM@pUdkbybT!;3L zzbwr97)igoGa)dGJ{s3|`c2m8dktn&`vN_c(X&R{ujDF3iMRr-WIQ#Os7qiDwFA+U z+7Z+aMQ=QXz9=Lz7xQufdfdzf&~A=zLyv(y+wjAO&A!yB9DQf=#x+)o2 literal 0 HcmV?d00001 diff --git a/client/EcFCButtons.class b/client/EcFCButtons.class new file mode 100644 index 0000000000000000000000000000000000000000..19de00b67766119d9a47d93d841ba5ac242e1032 GIT binary patch literal 1208 zcmZuxOH&g;5dJ0vHd$7I@Dv1sh$cY^?}tGY0#PWCR6(J|MTanir8cv1A3*s}`~`UM zLX{%r!HYM4lx5E*RYc&hz0;5B{`#Bg`SbVZF90K0)6s(7D4NlyqaX1I26Q~YppJ(a z((wq7btI5fYD&X!1WzJ(s?)}_GL1$sreR#egoa6mP%g{Rx}FnKc#g>0Qi_6S+A_n? zFmFoJTVUu&+~QB}Fod)AzF=rtH>G&vm-d9S&G#&2;X#tTa1LyzB=#Bl6YEF(n5X%P zmlnrDdg;X=WJRqrDw)1z`%XdROqHN{rI5=m`JQJ>cSLP8(2gkst!UFQZD0no4B8I2 z%zfc#m^1JU84dFWo?}773j;4Pt6|Z=60!!Cu|g0602Y_UbOmgVuyJqYv>?i=Wroom z;hUBvKE(-?Bb>M|Mf{js!grL#{Qbod@iM`TTk7w4)aeHIkGbiJxJ%L$8gd3+;kAKP zOcBIIDSb;g42?A%QGZuhHusK*a)#bp`B^tzkIse?)Fl*4-M2;sEK=5@@G7)s?NW(L z;=L`AtPmgcz2!NkEYjK5)UVj+xWz}GTP{O;^{9d!6?B>8ENM@1P?hxBwm9{2rm*&@V28qe(?bkV1{Fy8uQ*wio+zrOBW3Qmg4AoUs*NO934$xU zEdpTDwFxJ76-k}{726C>H_s&nw77@%$%b%UUKGnFx9lRre9hG)-paOASF(n+DhD-| zYWdY*2oC8EVt~f61q?CzLh72*sD^0Wjt-KYq)m_>qJLBB2Uv=IM<_K+;+#wjT_j@& zlN==3gD6evT?~=u9=fXuzLKYoB0daXpe`1^K>cTAQr{4|K*I&JOGMr(jU3T4bZw}0 ztTATPU*e8h*O9#vefJD~L5`*%N9>ySoa!0$pbSB;A{!@Ny*viS2+cV8rpY@&Pt7E0 aQ#5-sG-7keBZGIC$9pW$&K}wm!u@}nS}Rik literal 0 HcmV?d00001 diff --git a/client/EcFCCButtons.class b/client/EcFCCButtons.class new file mode 100644 index 0000000000000000000000000000000000000000..50a52e66399569a1956bfdba00aa8490f4d17ec8 GIT binary patch literal 1226 zcmZ`(TTc^F5dKanY`d;p%1uFF5rI;aA_!iJAQURa3M3F7h%ZZfC`-2I;9d&xpP2aI z8_y_@j(-wnU1-G@YKAGv}L`Z)W=I_xB$Frclt)fq^*MF{on*W(>nR?qWp8 zJ&fuY!?-#nbxa@?!(_j$(6Ls`WwR@R?@QrLsh0-2F=wC?T^i;M zJjN3SZO?M-5_dH`HSi1>4GRXIV^PDBffradu!5|HRRe3vJ+sFH+j00ivq*J%wrd80 zn^nuru2**V|uE#q| zd#4mCy`c)AfE_CDE5>@dJKUk_c_}YS{46XoPh=6Gf4C`wDz^fv`CrUke&*+F?vx0) z=L+!O8{(col*-V1#bxV6^>Et~YP7r~dHR}ro>k_nw&ln&!$QM!5{)NPsHtoqvEHyo z%LT1@)u6b?{T=E0Ho-@e`{8OF(O_bj7PbQn3HnCV?9wtv=-iDSlD(wOk{+Sow$xX! z6#IfmYLdh!GSP;TOdv{fgk(SBw8^a)rJLL6y8!q=HwvIMSwmAIT0`@DETujpQbS7( zTI3^!>RPOZ_)jF1lF$=3n!mv~$Fx%E(apL~>p2EPoVE}rbZ)x5z07Kia#8XDGPM zQ+~#){FADRGa*&=Wn5C%eod3vC*dUOiAJCaHtW5H|CaZI@YO^qTA`x?{>C}NNWVBo-I1rv7DaW! z6ZGBozJqzj6ba9q!tmG>rdJ~Km68ls$nGFXwhWWJGzvt%Pm~9gt5C%@p>xXiIc2#t z!%{9egY_9J-Zz-W45=^Jis5t&FKgH&_@YZ5OVs5tt@MNjtkIKyh7w*7_f^6Zxb_Ej C)T+M# literal 0 HcmV?d00001 diff --git a/client/EcFChButtons.class b/client/EcFChButtons.class new file mode 100644 index 0000000000000000000000000000000000000000..5d92241ce5adc9403814aa27ccac26bfac7af9b9 GIT binary patch literal 1098 zcmZuwTTc^F5dO|m*mhkhRPX`dzc<6NJa%Se6`R4Dx-+urU@lwMGZl;jNl!j@{B$3r{3%51Q zVot*y+)d(M5;+Zd6r^!piu+PLNTR5sq+&tELk6X4FbvnKTyWpzM%%HvWrm?OOIZFo z!)WfjE5FB(Fq|f5NY^aE-vpfl?!Gk-Y-uqYzU7Er?tXCG4sSBdKMbKjts7-Skmzbj~UcG)3%!2 zRk5sN1*8))x1p*%(fzV+tDHSS}w;FRWGfT}!lRH?jJWjn>6K2Bz&XjGxUr)?GQjPY~k! zWk^x6TDWWZB&yOac_&n$^h&l(WkzMU=ZsO4b#4=8-rN>V-VLE`Gh90tymJ)Nz!Y+& zUfVf&%{|X-@lDILofgAdj1`3T$PtnaF|5&CBtza-daF{E6J<#{|J1an=x<%+%zyucQ;+N?fR*285sG*E^bQABf Ojuz3JNJy~?CjSEnO9hw! literal 0 HcmV?d00001 diff --git a/client/EcFPButtons.class b/client/EcFPButtons.class new file mode 100644 index 0000000000000000000000000000000000000000..ef6979843c594db78d28ac082fd54fb91c26c077 GIT binary patch literal 1092 zcmZuwT~pIQ6g^v764J;=si>$RirSXaDt;goE2Xre7U>kmQQo#;DZw_W=@uOy{QWiaq&Pbi{!5`oc^3m~bD^Ny~$xU|exgY23&96T{ega6KU?7aky^E8yqN@+XxT4IY zfvdQtWgk5z-Sy&vq=k&Z{ED(7RwewoEgOL{9KWpE3Be?v`K}DAjES>2r(xbi3JcW34sS{g_f4enK*OSm43;!xO)Mj4BCpItteAL& zIfkAxZxFKzZ(2LT#AD@sf)(1@@?2X|Z9Fsl{=N>T6tGklHuZsJPLM0l7=3Y zh$uEg|0&AQR}nJTsB??T7?Eh9^G!;Ro|v*N4Yfc~9j&r%t;QV^Gfcrpjjc;MwF;%_ zYPPdSw8X0>uM*|c|Mc&ol8SB;;Gm%ZmC2J3)IN=cL8}t4*Ikbo2c^fIMwLt9y&%CO z%Zi|GRbAQi6ytVi;TY~YCTL#6pu+IcP3J~~>{CbAeiLV$C+`JXrO`tkU?lb(EEa}u zAO0BIM<6yu<|}zfbmd2YY#e@!BZx^1Vw$oi$U8>C0t^sa`qsTTAW z`aWPH-XCwlpeOi}+Tk{zK$={5Y^1R|*Xr#|<7OY+>jyUn~?l#ErEp zcLAyL0rH67Jo>5gS?HJ}w@3nHh>0PWdAF2CZru4Ovo@}Pz;%xbucP6cxs=CQz_>~TXc z3R}UVhG$4C$Y^+uB?T`uyu^ZnWeqD>)v$&vLGS?>+$^PPU~`0xyVOG0zmSDmR2@OO5{XlPzKuf*CX9-*&0eE$&r`EfI5k&J^S{yuxb@>zE~o z%ckiW!e(e`sEF$Ohh_WlL=-5}z^(jj>W)iyLIHwt$x`2~UOtNywItjct*chK%uV9G zGoGjs@7JAoZQU%FBD(dyg9qLs$K({1Y{F>BIp;>$T>fiYS|VRBIIiR!?-6 za!x5nYGYTNxj9`JMM~E#QU7ltekg`?yoPAa^87Apsc_p7f2C`%>V+iM7$S~v^K=(F zwM{5~AW7=EmTud>-5qX{Lx*#0oo)%o;U%%AbHgezWExtNc&k{ZY{>@J>Krs^>gm`0 zAvmTU#4wFv2WU>{3&=L55e?A33*EH#kTgwlfc|aCZ(vFG6@la!Ef=I>=%qD^5UnG$ z_9H?QdIzIqxre@bfX`$JlE=HTO9Z2#OEi5%I{5{GOEh0Xxk7kfN@R$fqjyX0qb*Ub z=?blKA0&Ov`_4HA{TOY2jOY#P1?AJ|AsK~QM>a*Wd~q~P5}GNp&5?DQo|qYuW@+~3 WX~Y(>gEaP$!CNfR$$mN$!2Lg<3@6tB literal 0 HcmV?d00001 diff --git a/client/EcFenetreChoix.class b/client/EcFenetreChoix.class new file mode 100644 index 0000000000000000000000000000000000000000..cf04872a68b149e67c36d61f5768784777b781d9 GIT binary patch literal 934 zcmah{VQbS+6g{tvjm@&PbvoU2>!#gI)47Nu2opi-3PN!oCJKH_(`WZaO(cD5{ab=o z@Pj|VA0?io-O@p&A9C~FdFP&c&wcOD-(SB09N>`!6YE73uwmgY?pfHxmW3*|P3)Ms zZ{mSKuGJJ+X}4r3bu62wk@|WlPPmr9TZQuN`R9&|-}#+B zk>!yJyV0oGj|M922~?f-nLqSBf22J*l%e)Mq=chneV9nuS%&OVab8R zYw6FyR1k&glbXqVlOa>-<1chZA?qYMj|16KNu#Sr!K~qfq)Qu1sM#pOGO=r84-ZW^ zHtKLqG;Hjn#yMTh6DX(t`hM8+jyq>E&;pxtEw|M`vyoUJ@1(|O>kAYIQlCVzR&362 zJ|>KfxjO0S$nQx#nI+9Q^=!-&kT+PmOuyh6r>ZNl!{=Z^;5xrt;+9V(Sueq6T;}d6 z@f`mp_a}raejw*I7`_qW1Q>6?VBBI{qd=9|Hcv_@PX!)N1QsZ+B&Vw$Ep4y$j(Q_$*8VO* zEBL`5;ExjDwA~^s(hoVweeZMLd(OG}{paT|0Ec*F!@_z2d2HCYhx;}*v1Ox*Z3{aV zb}c**Fj`H4)pkp28Aq}iYAw653iXjd{)N&ieko9KGxqE61)a=Z=it z1)Twv<+0MeaNHb(L#6uyRkwW}i~>Ix$G#j%9s3`qz;W_@lvp`whV0RDwtU4}MnRk? z<(cwY1{s>_hFX18|75;NmAUoF7xqXa`!u|Wy0WE`Lf4MF*IGYJN_DV=nu7vt3wsXs z@z8?npbpPM!@&V+99u@RKxx|PAkcmPq;t+`3T$RJ-&VtzB}D=`HyJ_sS|tL7p^Q(% zC|0c1bk7oOBhzd;N%DOe&qmAg+F;i{1|iPke{rH5k595?Eop1(R`$u|k6?wQcScQJNb(o*R_BZ!mHbgoIRtgiIqLMf9QwB<`GKNw*4XMPw9sJP9Ga1i?8F!AL;>csyr22RrNc7l4nKHFL{le4I$UciM=!scRuoSP1#Ji8}> zLSH6lQJg5YZn_^+c5|lVc(CNVGMP+TV9l*%moO1|)5YubE6zMu9f>{uKo$gU@-fm0 z@aIaum*6libM=(E!FSR73E_z!FuXd$H%bC4jJIGi?l6{VP@%TVogzw8gU3^YlJ^}( zZiHNY1apKNnZpWlbf~iMKJyNkw|bqu!JV|c$nZP?@OA`CUlo~)9THnxjQPZFFUFn_ UyR#U3My$LTdrs``_MNjF*3#v~d|tx1IxVuS<~grW#y4HSY&X=$G~n`sz{v$9T--&Lpz zedrJHM@i2l(ufB3VeibG{qCK6=H5U2`3s56>IxLv zEvco6WH(YeP*?s?9tylVQd*f~fnsgJ|DEpwiPNwz1+s0W<@xBcC!=qEZ%F0!MCpDw zIUR=AN)H4owf2QS_M861H04-o)BG_7&g}lsmdeaCWS=Ex$CJRQv2U!Bn<<~9zd%z# zsMSyPB=hrJc`V(zqDL0;zJ{YHkS%2!T|Wz+TW{D-Gf1PHfs2%jN(S#y7RbM31y-iM zhQ1y&JG~1T7=f*YR@>^@uz^Tmsb&r5p5M!E+%F?#jEu0&Q6<3<@N;Yz9Ak?6G(5&- zp7yCbT(k8%h`P9eQ{QFyMTw8em}d!~%vfYv1#f7AgW)#eb7)lk@-p literal 0 HcmV?d00001 diff --git a/client/EcFenetreSaisie.class b/client/EcFenetreSaisie.class new file mode 100644 index 0000000000000000000000000000000000000000..46284a036f6624751de48bb5a753ea5480be131c GIT binary patch literal 939 zcmaiyUuzRV6vfXZYu0QxP5Q@bt8Mxxt(#5liXsRVL23g+Xdfa9zHO2*PKmp+nI@l0 z&|3(0XV`V2R7F8$YI05eLQfmi7f|ZY}?qe zv1?;bAX9G&6dQFJNu9`MsQOAC3*=s?Na>dX%ifK(>N^4JB<@I)rXqQE`MD*Nw_&SC zr7%=cCmx>k;=YQy0%fmp5e~v29O^(0WTb=lW8l<`kBya^X2=dLC(~DLtp=es%F;x6 zEyEd_YR8fKsQ$}*lPXi|^Dpd;Mou%nOxm)pOrfi%?Q1O`nKE50pyDDA$Hu;k13a|h zxv0XoQFC#K3JbiEC{P-A*bAd>aNfF*Z7r}lv+0KFYnGA-WIfY*;aUX(`M%W6IMIsr zS>6YOY|JzopC0+H)RW^BSn;aqNl!%HV(}{dA7_119f=*j2^#{p`DIMMd@p9a0GF}A z*;DEn{)_$(2w!|h#;-Aar6jP(xD1PNi*bzxWop}8DWWtrcsw;I`QMPqj*zX5V2yAq zby!4}4i#>^&%6WXEnQ`=bH!{gQanchybC_b`Pd<`mHAjeY;`{NgxH<=*fU~l^Ref| J?vDGr_ZNnHu8aTx literal 0 HcmV?d00001 diff --git a/client/EcTimer.class b/client/EcTimer.class new file mode 100644 index 0000000000000000000000000000000000000000..401bdc2e0f036c26ca37fcdf218599940c50410a GIT binary patch literal 531 zcmZvYYfAz_6o%iknrqwI)yyttK^NN~sjo^Pl2C{VS>MNXiiveLwy}O!&;|O?59mil zXSbja$uMUQhxa`5@_v53e*ieZrh^O$lbFC#T#62sv0`J@#+r>1!D@903+0qH)>0>=5XbkZXqe-Uw~3L@<&mMuU*4E3M2ip->qE*t;U6o8dqbX4*>2 z&S=<|QBU-Pcp`kGLfw_obr=ohfKaZqZ^eVCibqqG4^o?IBaxiMeJzGL7vU)KWlO~X z_r&k1p^OgVB^T3Jcag=U3kOp+$}TprPOyJfgxLfh2z^sM@83$_5K3eJYpZ+1VMK&f zCH{5pUo?d5P@2XWyTK-Bn&BvHSbW$32Qwdg;F-(4g&bdEe=}TXc~Vc5K;C-;dGrFy zOT8fF?Q{2(#5%{dz+7M(X%v}R;{6>gV3!&5{Qi)(__bJ-^`2q9BK^1RB=bXdb;O!H IYb-2&1O2;c9RL6T literal 0 HcmV?d00001 diff --git a/client/Espace.class b/client/Espace.class new file mode 100644 index 0000000000000000000000000000000000000000..451ca6bdfbab7366945c6bb10590f053f2a4dcc8 GIT binary patch literal 7773 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 literal 0 HcmV?d00001 diff --git a/client/FenetreChoix.class b/client/FenetreChoix.class new file mode 100644 index 0000000000000000000000000000000000000000..88c232e0202c7fa5bfcac2024676d75e485e7a95 GIT binary patch literal 1809 zcmaJ?-%}e^7(JV0v&p(81_T@#^Ewu=D8rJ5_jL?lS%wu2 zAEZ#xF@%{ERyEw$F(T=P@S%nW8XhW0I^|u@exhKY@|Cr3Jt;H}YXGVmCm8TcGuC>V~gtkrzaaUNK% zkX)95ZA^5zPG+?-*9-#Br6(w(T^ByzW?i@G$Tx!rDerbN8U|{p6YD+NS+aTCa=aY{ zS39-|8~!iLgmcy8sO>}QujZG-!DaK6-U^|2vR1vmX}fjrKu(TxVsDpwN{D^o28C!w zxN)$X)N57gj*+OXqfYIkb;_R0I)Ri2h1(T;mN1EPU?n(Sb! zmTT>Bv+N?yV<|9ua?0M`*PhG5rH*5}+$SLCdww#>E>g+OT_K##(D_j=xbg#I1u5Tb zEwDZJ|Ky8iutD1T5-%|zj+pd0-(u40;gfFXGYN&py2|(_pj?5TyUlDKPrD8IdBsR#UWM^rp+CSXJ#iB+?JB4x*N)cj3NiZU- zj~3H8EthWLIyt$ zyoL!zs!QEt{84jrl!88QRS(fe)c!FuC;9K^-_+_^>K!H(@YZ?M>RD=^)D337jd#wW Rj{kC|>u;I#F0mMH`~x~Zpostg literal 0 HcmV?d00001 diff --git a/client/FenetreConnection.class b/client/FenetreConnection.class new file mode 100644 index 0000000000000000000000000000000000000000..a6ed4d0ef3c6e10a396b644c0f13666a0a75f784 GIT binary patch literal 2427 zcmaJ?Npl-T6#m+lG^4SyNO2a$2~ie;EXz?KghdVnM~;Jn>^QMwM_GW8HE||LGiEfh zv#}&VAne6~13!RM4p2p`6fU?@#eo|)Zrr(XrTBWrR%F?5>7IW5z1QFS`n{fC|M~G} z00;1;icyX8sWAF6CWq4s&ZrpI5X6LBpOwR;9H!)OPUBEia9+bYT#$>4a=4`6RSi+R zrr~wy3Q8)bHFTpa*M^GA3T8CKaYcctBBP-PSLON*6^G=ate~P{w~W|>ssc-etzjR^ zDrObDsUa!1_Ms|yIT~tk71R~X33N{6#soxOU|r6(YOZd%lX|6YbTUD3`|Qw|{1gIV z_wr!bF={nKU|Zp;KBr&H)aFfVCUbJaxaJOr9QK8<6CAG5&34cF=4{(sZ}& zZR><%*JmaAL)KL5_Q^AP*|dF--2X^MyC<-b8RS~_Y7u;lPnJkGZ_4-M*(_zVY&iTH zw5)nXes#$RK7h`jVo1Sf5qyp>1fr|NX%9SP>J@uNV836po=SebuC6Yx2)8T&Tg%R? z2t^jGd4uH;Oy)fcp{vgK+90Zz%TuORw&x3G&1LN{i#;s_j5)({Gb<6E<9Ze;ONuV; zm~P3+TkZmRyK+ZoXF0MD$iZjfU9Fc_bKmbSzYqj^T2A(DBf6!}FpMnp&1>WxK~H~1kGXq*$NzL*F!(2?qVfX-Cl0RpK-1dFlI#_k4` z2T)fo!xE>-p(_;?=_tNlK!lKW#Z&|97qB6r^`R161$BGjD4#hoyND@nQqpM;FmkjO`$|o!LNtJg|VrJj<>I64_vXJm?vA%X9Z+ zL-9a7w1B$0!;&g`bH21*h>F&fs^9;}1;WPfX%3OyO^w<1<_o{KJbVE{JWoD0blz z*&O9b-YsG$XMzxheCQq)NCy$2R1fd&QCga3o#D^?3XwUc;NugV zWoXsEt-kNtqF1?loay=Ky-VmWqN!frL!{g3IE0*_7OR*fD8*tGk+y)51z$0~Y}#barhTB%=ViHpX|}V;?n3F$GVz1> z;1BRe8ShY%)&$}tckV}K&OP_c{QmRv7l000CJa2uBZsFZ%Gfhe!80B08>kw1Vc?}e zE}h7v(G{q8r=%#2$%&MrAeE7FCXt-?1@eO%l};#?0iS;_l}tYfRGXVFv_1)BooGY? zk3FgAYBoa%bE9gSweLd`-Rrh!)$>UeFSVc`%*7LL*6S=V1~^aQ{ZT^1mALO)3; z5h!R#J7mK4`S6lS2^{~2vmSuOj0Luunt6GBKOV^s0!orbugfp+cC(`Yi1bmz^RpE1 zvsf0H?3h;4(a2RJnlCB1cb&T3cLL8hc5+)TYW!mi)?tTjSF6bW0skl3c`FSWlSqiun$@5nB&{rT>qxr999#^)UE QGDrp`9I)3ka_o8i1)0pV%>V!Z literal 0 HcmV?d00001 diff --git a/client/FenetreConnectionChoix$2.class b/client/FenetreConnectionChoix$2.class new file mode 100644 index 0000000000000000000000000000000000000000..ec4a3e408f9acd378eeb21a850b9b1b3df5717a2 GIT binary patch literal 546 zcmZ`$T}uK%6g{(kth-s3eQ6p*NT`8IuSO6{f+W2tR*&m?!7ZDW-O1XY6%<7e{eXT{ zbT^_N+6Lx+aqgLO@4SD!z5!@p+e8X029n5|SjC!-bsYtPw3@gk&T->D|eNvh^4g(p$ajwsB&ck4UUaig|Uytqb0kcEL_7HQ}@wz4Rp z%+ti+6Y+Y&SxeV7qTNr1`{xQqc|qZhLg%t_E?42t(K?n-z!0z<|SZbmRK z!IW`891X#ea8JT}3}GWXXX!PDZTY*}f>ujc7IkwreLk;OoKXg8reN8Q&KcM=gR-C* zylStCatu-D&V*H6;98Yor{BaCUUSBEZj{MR_=Ili&Pj&jNk3@Z*5>)BPj-gi(W-_c z7+kc<+!!66WC&*Ik)b=Un|z`=Kf~=S+KfSx=qz_u2z4cgiDk61CJ82|g?2ZACVkuq zO6X!$TIiVn|=39~JO%D6`t;9wlOq=)p>tXHw%UY?#E0z5tBS#r_CG+FlbZKI3CablYM1!9F5)!M`O3p0>k1Cy zkb*SmlEfsh>W0DZCrVTp72Qr$O`a%O^Y^TZE|@BK3ATb14m0fV)y%5H3=pV_f+IMp zz=0@^v!%`q1ad*aB5DejaGxqs7)@)7PWqg!m-E_^RdocYD&c(vAK*iVnD5@aHp2~u z{_GmbN}{Y+?pdZzHBw1rg!)GeJ$^MRFmdpJq0e_vDA|@_T+&P~jvp%c7-ZoQJ|QnU z`>_8AHAjweX=e?sQsLzJr}&IvQ=-)ziA>`8$`qo{@kPt=)ebyebsWp27Ni2z%iN}? zG1IIX;z^-kX0slG?)nm6Q7$@DTW|J^t{K)W!vU`m-8i>3VcO8B{R@swQ()BXogFP; z`+?gdlIS!2KGjwznR6ur&o5BwsUEFdp3=>-wJ2Jf8h{)bYGc6{xap+*2)FmQP@_?& zkcuOcLaw%2%_T2RG@1%FjTyHt{8DcocvVDQ&~~3EyQrDkEGdhw@9p5KkoSA?mDKnr zQ(v1&w*pP#>6+U~0h*fQ-0%vDB6`*oL#xctMX_K|JFB|WrsV~-ookP(hg8JP1#WmF zV=an@{QSH?cEoz|Buf|g(whEY8xK#p?buZjxf^o_)tc7E-1!lth`sbxQ|ZeXL_o|K zdJ2fi;qEkU+?{3w?NKmlwqvv&2Urauk^ujz2V-5q27)SE22;D15mE!o2&heji!o{I z_68!$h^js8?;d2KHydsd!ibT*(VUBBkPzCpjSCFJ>a~a6D2+GA_B>kK{YU%e0#Gbq7u% zf_>PGB>fsl)5rf9eaPRS_>JKNPScvj1kR#}ad4c2jWdRf43+G&rFo*(Cawa$#h`7>2JvNV?v&ycx*Jy zeptu)djgG7$TmWw>!D95=2@H}2ZV!z=yF|=)PZR#!1a{(Q251Pgi>&>rPA)>1|lm8 W0m_x=iX86H9-}9bZ}B(iZT|zDtA=<0 literal 0 HcmV?d00001 diff --git a/client/FenetrePrincipale.class b/client/FenetrePrincipale.class new file mode 100644 index 0000000000000000000000000000000000000000..7ca023862c525bdbddbaeed0a5bbe464e205753b GIT binary patch literal 29359 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 literal 0 HcmV?d00001 diff --git a/client/FenetreSaisie.class b/client/FenetreSaisie.class new file mode 100644 index 0000000000000000000000000000000000000000..22fa3c0eebd517f8f6ce8dd3a66081798ca761da GIT binary patch literal 1773 zcmaJ>TXWk~5dMyDvK6&WTqn(i(ll*@tvGQhz1nF@n$*R?32hycI?%##eCnzwQb(4P z(gz-x;h87i;2-b+GsI@d3_pN>#0$e7NlC2GVLWp#>u-0z{dSN3`sa^70nFj6B(AGC zhZ_oRCUHwe6vY(YMM=TD3I(_2<&IqLs5;*zjQ@#@`%uLrJXTOsu*RU6HEy&G!H}uGlOZv0ScZFt;Y>E{Qg-;ZDCO1}VvBZ@ z(5I?~C00Az4dJZuhDnxGOSlKIqS+ipOSO+IvFxVw_DliqVLwN~g?~FhGHh zxQ}OZVJiLXy_`Wf%2{DhYj(%k5@kbDN|%KtTu1mi%t@IT#@9v1Fir7hvMoKG$&Mu^ zcep7!j)rM`N^bwvlYu%oje>?roM#vbAr2Wy$hw9pT+nb4mo#kP2}yN-E5t*h>KZoj znTF5tl;O0DR^YpC;elf`tNd%b<4VvI1dVpYL^C*S4sG>)bS&!lBcG zWpzw>8laRlAJEpYg{B4}$v;O+!3zxrUNW2ru{s`p$>65lVweuPB1)m~(U;G+t#FIC$XON=C58-oA7;_s zeq~#fxa1FM5c|N$Ad6bqat+)1zoNnjFP9We&K1c=<@u+~L0$bXhH`l0jMF#xYEVUZh_R1$=rB`^3-p6%p;|AKeiEnTV-=T=_QNj18w_Jlq`Y8+8hJ?mrAvqs1{ zBIV;R1^ATIW2TFV<1SCBnr8&QjQ0bVem1FJjODlH-6c@;krd>~Z>S L0$e3X1lRrrl<$>} literal 0 HcmV?d00001 diff --git a/client/Forme.class b/client/Forme.class new file mode 100644 index 0000000000000000000000000000000000000000..4aaca65e00423254255f58fd647302e4f299320e GIT binary patch literal 416 zcmaKo%}T>S6ot=BCy5!;AM4LX1aTF!XdggvBNPfn7mE9&4ke{YASOPQ8^I#D@Bw@% z@yw8gZrt3TGv~YaGGE^xp8zH}(oh(O=wUy=L4ZSnUfC7`VlLoc=4IYoQHswW1k`o) zXat6fyfim$k(v5F%{EkYyqHyWVJ@u8e=-eUX^-cwUv)i)aHhVi+InebxdRU6`+%Mh(vB7U!7Ys z4#MJMN78EaxZ3e|Bl7_Icxg&H;v<|Ag7z=Ou5DFD&>W N7I)&9al}qy?+2>5G)Mpd literal 0 HcmV?d00001 diff --git a/client/MaDessin.class b/client/MaDessin.class new file mode 100644 index 0000000000000000000000000000000000000000..fab67b06f3f1251fe13cdc2a4138f3da1a6e9575 GIT binary patch literal 6044 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 literal 0 HcmV?d00001 diff --git a/client/MmaDessin.class b/client/MmaDessin.class new file mode 100644 index 0000000000000000000000000000000000000000..8d06b4a3d2456e4098ccebc738869b3c8cb0e19f GIT binary patch literal 1241 zcmZux>r&HD5dKanO&elS1mq%ERJ1Kf1iTlJYqhmS1VrjRg#!jl(rHuR8SrVG(ctKe z58xB|%W*g1HbZ}8&z`;Sw|nyE-_PFwhOn-p3;hvv;)aTwh^t5-$=m>QgG_FzWT&gR zjbY|S6pX59LVp-{_`Iv)9`1)G|87x0K*a+*Wcec|DHUTFXSazk9<$}7f++>l0)h0b zKsYxmt5wrV353Q>%XB6Ln&L;o#EL+0#$J~K%{kMO^R?}wtSlSF5=qo;yH=HXdq=Jd z^u}{r#*U#IyN)h*q~+*&*3L1T;xOuxU8}6gw8^f~{I=oe9bzvHJ($tZjmrvVHOwKc z;E9H($Y{tSt>GDSIph`0Yj}#PwIdVb4YYlJkmWA&$yvGLxA2k>#YFOi7jj@8~lSM%wa$KlDU%dwNwqx4X z)Vfi2IAKGad+n@e=|MqoZc1m>Gt3a=J_v+PRXPliStVUCp7DSuODf?+MVCgBr56O+ z;)z^ZTGFY=1!{QBEE^?BGrVv{NIj6xT(xYh@yy82=Xu~q(#Qsds!}ZKK#ONGiQIy1 zTFxTbuyf8R$`aMpPR`ufo?hK0koBym;6O&XEG^oC!NV;$HHwt)qn{G_(_ue9jfV#9 zV)SH;dBgcc-B#=xhYiMO6Ip?7I{YoG7cA`9{_q7_4+}k=l+v}FEnYw&IvC57611Jb*}w?+7FZh2VnkaIBpM^y zfe3|*;wriJd6WYjAcO`wza+mQFyNxWMevYqbP;0Kh2kR2I{HW$$sbGAUuY^EKx;YY zB0A`zxfSO>|3J$=owkdME?Ql*9hBn(Nh8>& Mz6Gw4E`aO*0dNl(qyPW_ literal 0 HcmV?d00001 diff --git a/client/MwlDessin.class b/client/MwlDessin.class new file mode 100644 index 0000000000000000000000000000000000000000..34b236add7e1a103a014a66eaa92577c6e76ac75 GIT binary patch literal 627 zcmZ{hO)mpc6o%hB%G4NI-{1Z4Ih}?sEQt-8NTvwFdRix3na;@cwi3U^-daK>7Jh&q zCC)9nAQto9d(J)QnfKoF{_*+-U>&Z7B*yw-V%)+6CM`^1+QJNGwal5AH<2-s6)?)X z0!eR|8Vwn43iNHsP^xW#0p}-KI1@DBG@?=N{&3cvMQ@6Yy2cvAzdlc*Wjs4O*PsB#;8Iat@NHf-cK%5#*&1K87xa)k+7P^ zS{j~$ddH{E=e>d%#a)G5<7NA8d-I?jbv9f5UKn+@6zm&e6!vdX<5eFjq_*Sdfx>hn zjDqH%yC3u(wD%8qGV9gr^^*Xpv3Mmp>oxY`FzWAYY0{gZ|A;_O-=#Ww$CuDjidT=B zc*bON*A#yRZ!+JeP7Cs0^`t_UaKfoS4zennQETBbZfzwHbxili%(z9_mJx9Oq38(Xv%JY~V>C4PA ze9NbaFI*(Uw)No)#^PkOIgWls^lR!%6Vc{4`U9nNm}it<;L!E@v2UKZ{z&vED$BSq T(jRqgeI0ZCnW6=r8L0dP2+)DJ literal 0 HcmV?d00001 diff --git a/client/PointListeE.class b/client/PointListeE.class new file mode 100644 index 0000000000000000000000000000000000000000..71fbbc9107fc9dce037be7bf92313da17fdb2eac GIT binary patch literal 845 zcmZuv-)qxg6g^*>HESBzx;l037F&PJv~%ka#fQpZj0%O~#1)5w3F#U}N}7~38R(xQ zKKd|0J5Ugx{iDS5wQ(J?m)o0r?>YC}^Y!_--VoQesQ^Oq{3d{_$D9fxO!(AEf z$#7qW2O8EiJk($b%z5r8as-yzef!j|$C2yRcf!zq-)6lbkbds^ZnQ0svZ`+c)ZL)R z>0I0OotN>T>x3P<>#?HQ{UDBI4MWH8g#=|; z_&3Z|k?neti>q3UuXhdw^!*?XkDV8;Y~&}zQkm1-lzI*1kQXRiq20hWEEuSwW?&sf z1COv_(5JkCIySg%Dv}~Dk#fa^%Cr5G`d+v197hyl_j)wQnmTl;)u>XSI&wcyS~_$F z!6}m^dDH(SG*XY~LMPatOs7tq2o=7O!M7895^80ZX3m2cuk&jQDP};vb`DYd0p;yE zQs1C{nP3(f7dQc|K*cI?CZ`Lyk)YSes<5lqzCv9eWA0#vlYauhLWcHGF>WT9W`e1d zlus~A5;;ctBMLGrjiDV(OY<|TMJ@*(Q}h!o<0;B`MzUMDoltHkl%}LC&M0#UW#$+3 zGjT=^f!RsBHESBzx;l037F&PJv~%ka#fQpZj0uIJ(iMk;3F#U}N}7~38R(xQ zKKd|0J5Ugx{iDS5wQ(J?m)o0r?>YC}^Y!_--VoQesQ^Oq{3d{_$D9fxO!(AEf z$#7qW2O8EiJk($b%z5r8as-xIef!j|$C2yRcf!zq-(tNXkbds^ZnQ0svZ`+c)ZL)R z>0Hb8otN>T>x3P<>#?HQ{UDBsQ9?VUpbeLsl9W9Nk{8~F*bROYldrCtL$>Xg6>T3kIsF8CXZr zz$0uJ^eJzkjty>`ilm53q+Btf@@)U4{;Jz|jw1@Odp#OtO&z+_YE&su9l0MUEgd?8 z;FQUdyy<@u8mUKgp%d&+rc)wL4$n)&tn$4>y8sM|;~?2exy`*n5RUe@HR*MC^pHSTAB*+$j4z?37`Gm= zagEL5tR?=k?tHFAofc%=+Hr+~-5!jGPrHpke5N7`n{rhLi&%270NX(dHnS)@aB#vw z4IW<{NqM)%VA$tbGaS=~+Qlk^OfqT{hMeZe5PW_z z#q`p#3F2S5p>T@zG~%plh+&=B4Famjz}2Yq6xAR~R0WNy3aTb3V*+cISAa$31@bPE zcZs~qSjH9PaaA*yr_4KKCa5fGrYp=Gota)ypn2Pzf@UB|!7xc1<#FS{t$=7h0K^5Ur-&jIAt6pqu!^hHK_M;Q#if-%;sf|7 z#F|6v!|d+t%-H_<{rmbZ2#$PC72}gscY_3*nR4O|gO`F=-*`+f^(`s24dTg9HxnsUCuc{n6aSVwT zp*Pl6H?`g_b&LbIXm1%pcb7iN=elV4>bIBb9VZC*6YdC*3uJ8bbj+2w24@@42RHl{ r#_*qXl0C%SJLv^m1=r3O#N!5DcD{zcvn23%8E|sQ7Rja#&jQIGD(pIY literal 0 HcmV?d00001 diff --git a/client/TexteE.class b/client/TexteE.class new file mode 100644 index 0000000000000000000000000000000000000000..666041ff0eb76572d64f510e246c2325a98b74f4 GIT binary patch literal 846 zcmZvaZ%^7#7{$*m&_e0_gMf3W2>WBH3clQg?2UnhgiI5SiM~T^NR6~fEoL8UCK3`& z_5t>xjOVsx>PASO-g}>Oe)se#f1VzG1E|B&p`)x}Lx+NL1{qY+sLJO@Sw6|*&ls|G4`;F_qJ7^pQzT*zqP+N}c1m6V`X6-~Ex$j-t0`on` zwSSC;=eB>`KfmV5y4ju5{>MmX*6bbIKLfknl)KE09US=1z@?R)IEU=$gQ&v`xG`(f zUgU{#2^7rPw`Ay^YVtJCcq9GD8~GP@$C0tKQKq`o8JNcc-#7|mAPYkP2Hs)LfQg#y z7uk<20;!JY56MWlqai2QMTJw=`6(3sXbx92^QnO|!vgCfcY8>11r)6bg!KsJbb`bf zNh_BcL%m~%AA>cABx{*1J)IMV3jj`gMKx$2z^TQ8I>ih#`@Q2 O^HESBzx;l03R@9vqSRv>qUb_>_AV4;Glg$?8_ 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 literal 0 HcmV?d00001 diff --git a/client/class/CaFenetrePrincipal.class b/client/class/CaFenetrePrincipal.class new file mode 100644 index 0000000000000000000000000000000000000000..9ae0c55173613413c10b1112343bf1a0b6b84709 GIT binary patch literal 468 zcmZ`#%Syvg5Ir}2B#p6;R8!qp6~P#xS-7kSQtYZo(c=ELoy9F_Qes-czY=_a3qQb* z66Y30sJc0GXXZRE^ZxPr2B3v)8wFHL$fIV%Mcu@PiA@2c+ZU+!x)f8EQa@GkNX=wK zZGqycidA+d;Q4>-k8T9=on%Y`m7a>}ay}hWI*`MNC)H6hoh32F*%jTYdm0Pu`@M-= z$WY#8AuV_lcD^|mx@~Ji`#PDYBkC$`(&)(5Z?&|A0}GymB1{tv2V3w2+}~V*=6`|b zV>!zx70CHIwYD0=;iajZ45W%8!X6*3z(?d`=}>+d{I*bHw7EOs-r!mZULXST1S2?R xcvwo-7+p31b{IVtHBrVcOC79#860rc23GJ0;~BXhrM;XVa;VRoGII=6J^{o-Wkvu1 literal 0 HcmV?d00001 diff --git a/client/class/CercleE.class b/client/class/CercleE.class new file mode 100644 index 0000000000000000000000000000000000000000..e3f821115c16ea61919ea52ddde58b0c48d8e370 GIT binary patch literal 767 zcmZvaZ%f-y6vm&MCQX~Bb@q?{tG07nj9PtZZShTMp-@y*2JT($!pN`*#8%jM+KUY= z1%-WpeJJs{X=+6z>?KyCQn9f7%y>p3UG{TJr)fll6R9hWE`^$pBJYyCr;|AjBZ2_J=8ID z$>dg(Smhn;Aseg29bpwU+N=|pMyxJ#KYt%;}Vt`e6g zBR=|2K~qo=pZ!tdxyh0g>C0qxX3n{1&g9SEAHM+XVc&*C&cYoV2672pLtbYE9q#II zPlx+DJg~5B;h_abV9EDJp%Pecblo$zJPtj-d>91ohX(5vf%tQ;?}Y~fF{k)iz^o2B zoK7~pzIr+CwN%h_TRtn6+Z~KU6$nVDQB^_PSG9^pBu3-mFz|Z1Wjb|TvW9``cLJg$ z3-f6{7P_9V+4xwU@zvp50sD9`4%+I4ryHv?YAsIH_OxV)BvJzDE96UD$BIM|C5atm zBpzW`(yEk18N1XG>7SOp;~5f=3I$!m0$aaF#}Si3y9KB7;i2R z`wsK#6tl*-!U5duBPWP|LRx3p39OS@X?a1l#>auj6#WDnc#1rpk?a<3N0bK_|GVvSs zxi}|>z+$B;`D$FO&gup-5m%nS+K}Z)*q1p<8wWHQvvd2L$Ub?cbu$az@dWRQ+9cY* F);}+Rk5&Kx literal 0 HcmV?d00001 diff --git a/client/class/CercleListeR.class b/client/class/CercleListeR.class new file mode 100644 index 0000000000000000000000000000000000000000..f63acd586e8da85af1747612d7e8357b634c19ae GIT binary patch literal 850 zcmZuvU279j5IuLZ%{J?`NgJy+X=CC?-K4fDqWBOglu#iM6w+W(P}n4wvSIVVW>e6g zBR=|2K~qo=pZ!tdxyh0g>C0qxX3n{1&g9SEAHM+XVc&*C&cYoV2672pLtbYE9q#II zPlx+DJg~5B;h_abV9EDJp%PfHcil6$JPtj-d>91ohdS#Of%tQ;?}Y~fF{k)iz^o2B zoKDugzIr+CwN%h_TRtn6+Z~KU6$nVDUR6QcSB;8BBu3-mFz|Z1WjZxovW9``cLJg$ z3-f6{7P_9V+4xwEv2plTz&;*~gSL9%>Bj1eT8mSSJuO)xiIhP43i%S(u_94KNn!^X ziAUI#v??W0#x8Y4I;rC_tw3r@=DYpV@~c)?wL@xgI~}^@%xt>UsuZcw9C;t9E*_}f z;Ec(--s^u7x@m`WqB%I8PRCAFhyo8Kc|gItP%X1KbFRd=%CCLIm;tHM1w`p5j5imE zeTVsVidkb^;RLV=6I;aPIGx6g2)#{KgI&Ay4d%`SOD7AQ{wDwq5;Ta4aWldkMVLa? z_>5duBPWP|LRx3p39OS@X?a1l#>auj6#WDnc#1rpk?a<3N0bK_|GVvSs zxi}|>z+$B;`Hr|)jnxfgBCb4twIR!qurG6zHV$YqX6N=fk$v(?>t+_b;|bmqwMn#r Ft$)VukCy-d literal 0 HcmV?d00001 diff --git a/client/class/CercleR.class b/client/class/CercleR.class new file mode 100644 index 0000000000000000000000000000000000000000..45ee67d2fd4f46978bfa5224a553a817746ad422 GIT binary patch literal 771 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≷#!QaG`Lt?NOA3IpW6D#CdW-d5+`rQ z94Z#j&4eUQNqKUobmlI9iOY3?qvm7lf;E-p{_;S1kh{>}+Z^!1B)+^E)2LlY@Kckh zYjOG0>ipw07^y(e-rrds6ygtb%YPDI(P(>W9>D2IoZ)~Lrvp=*5ttPJ1pPnxOfL5`4FVZyu#d4li?MYp<=5d!wGsQ(-FQkRaX>wZr_~`mqh6!@Fb=8@@EqIN^S%Nc z@|EEQ-*I@+SBrzbQ}K##Dqi!o;B{Xc-taBJo4z<@%W>GZlFuTAIQpEbW9|FN0fl=p zrM<*AzeKIwgZdqmINc(sSKlX1pr4felO4jR`)9DahONzwm#L*6GF~51b7@+CWJ*7e z;rG)dBgEQ-Z>L-(j+SA0%0(qd*_PB-aQo4_QAJ$37%Nh$?rx4}*Us9FIt~FfgqoLl zLL1r8!>RgBZ)hVMdK{t0Q~y#==-h1R)2MoxH*{_`bUmS`Qh%i}IaFQc4V{+_ zJ(tk)sDHU9w3!Wk0adT?hBmXI!-QT!{VP48^RuBP1y_4R=VwD-O6bd|f0ZZnpls+h zRK408dQdj>Izrz-{WZLwoczvAzCczfs9ULYEw3;~buLHA(~-Lh`3V%0+X^#W13=X~(Hv5seCo9t&DKSky1Jxz+eOb*iIS#7e`!%GQGW@dYNi6$>onZKMoObWbA z-lEB2ZL-e8q>v`(WP5p!CerqNciP13g+ABC{S4FgoEJYxPKT7Klct#xRdqU zv(DKnde85?8%E(MIA}WXZv@!9cZc^J6QGAFLN{tW*3N~026gJJJY}jPOX1Aa} zM|||5f~KG#KKrA@bCV@0(wE8X%$#%2oXMZRKYjt&!L9{~qKR7;5-6r|1tp!8b-1m= z9UboKaL>f1iTfsOfd$VUg-T$x)pJgrS`@loZ9fQ{4=vW~0;#9&zzz2Vl6K{_fN|h= zIh|>_1N9>6cT~`JIvy*g)AOTH1p?A;Jqvs{RE@euq({+k7`T1iGVG=c;YvT8mSS9W7ZRgRDUA68REWu_RGJRbmTy zi3ix0v??o6!!~uqI;rC#tw44{<~f6t+RIK)9f#E7bh~uPp4xPwRj*K^F>*grT`Ew0 z|CGt9-s^u7x@m=UqU|3}rjsWsM45+@JfPrRsFqoZIagv_=GQKg%z$k59HROYi8tp+ zeuwdOf>~i);sme`0~^E@Ii16`7`;i>1iM!C8;q?n7LMjP{Z9aFq-hWp<9du~#F%m+ z@fpQ}MvjsCgq+R_W0*(N(&C(Ig^vRdDf$uC@E9dLA=wSwj4AhG%A%&s&nYu8W%@U) zGjT=^f%!@Y5IuLZ%{J?`NgJy+X=75gZc^J6QGAFLO05tG71Cg_ps;B!WkZq;n@vGK zM|||5f~KG#KKoJPxyh0g>C0qxX3n{1&g9SEAHM)>W5&cZz#26749Kwf7B9oBWY zufqc!9$MJ2@W_HAFxT-0p%PfGwcT^KJPf@~c`pdu4>i^+0`V7K&kJ`2VovdmfVuCt zIGwC{J#{$jHdWAYn;ljxx9tx@6$nVD_A>CjP}M6Mkr)j7{lM$$mg!V=$?6BH*9wS| zEKH~QSm=5k&Bn*7jP<<}0sF`w2B+$kryGkCYAsIHx3y%6BvJzDYvfDZ#DYW-C5cUB zBpzc+(yEk18C%p5>7NKPlx7DIc&cvoGtxAy^&4Krk>f(Xw z`sYlR^7X4R-C)H<+6v%pK2g`kw$eNYEfE#_b4m5Mc^g z<1=zujT|BV32B{WN3f13rTH1v5+4ViQ1nx*;2H9GPO>|=8&U2?lsQeAnNcPq%EWKj z7vh2(0<)F&$#=lTs;sUc6LIDFs|}ftgngN!v~fU#F*~)-iR_ctS~s!a9Z&F{s8ym3 Gto;M*{*V*^ literal 0 HcmV?d00001 diff --git a/client/class/DroiteR.class b/client/class/DroiteR.class new file mode 100644 index 0000000000000000000000000000000000000000..763d0a4e04b9af0e316ac936d09e443d0499109f GIT binary patch literal 828 zcmZvZ+fEZv6o&sfbcWUeJXEYLMW_;oL3`;5Vxo)~64DDKMlV~OkTJAPYRhXG6B`pR zd;lNH`0YJSFtrzZt-aU$>syEU{paT|No{Rc6l%S!Kuu#djJapbW~i-DEk{n5lX7~T zGe^OGKFG%}9eMH2dq@7k@Kfe!^*A47ok_o!jZVA03nF2Bl%}bXMDcMt8s_8dWY1=N z$;PipjO|DN+`fQO!{^g$95Lf~9TYEI<=t>HI?E1o1CM6F_UG!=@0{bb0K2ufCY54`K z*@JqM#*5Kgusym6l7~RAdaJN9DP`n0D68~U=$pjNs!9oMeC1N?Ca}Q{c5N}*n@4{D n{Sp10g=lXc-9uVijQ-~r6dxFHI`h0g=I@Okhc-Z*jcq$f@s{Cuw_grouWF!i6V-@jf}zp8pOzx@5< z&j2Rjhdj(gU2i;(1$kJAdWl7OcoB>9umnrx?AEM);$t?S@%i2%er6UJ=Oye9E{*l1n&!I zv+4x;)Xp+J&#JSWY?VN-X|`kgGX(k;b?Gl&CeSnHCM|(}wYFm|$fnm>-V$?NihIn2 zZ@W&t<*j$Uw3QSnEUIlZH=3npi(hJOv>d;5rn1!V_bLvSx7f{k32U~^0s7Y@I+rks z2kNN7VI48VBltka5gervG1qY{6()jXIzGhl2tLyBF-}BqQpX}37RZmcwG($bX(Q`cM$&U_-_miKEyKzl zv=|A?OQgtgMg=K1<~lS-CbvQ(X=OKc#K`D4t1J}{vE+h~lWRLZMLExS@Khs4dG?5n%Q~Iw{ES&|N>EeEq`*1??kJdS)SHi>3cTEq!ZOcV=jE;88^u6S%-L(wQ z-0V6A?aDXoEh_srFRdfpenGvnj!WzxS8gmZod#MCzkk=m7Y_fevR6D{?>LBI`*&7RwR=RLqBi%=V5f80KwRA)*$MOVv6md-&_E49qSroOw@^eKj z=BCr8Lsf2YQE{%!sks)@(Qq25f_9ld*GEOwYR;OejKGkN!q{bXRmH35T6WeyD!eq) zY+4uXZ=K~)c^pFXbad3y90|LLE*MQT;DJucUfjB0|ER#%Pv$1dO&K@k+*EKgg_}xl zrg9UfCeG$Ko8xSbvpLS@IGf{ajBZY#+DdaWSSB+kM@pUdkbybT!;3L zzbwr97)igoGa)dGJ{s3|`c2m8dktn&`vN_c(X&R{ujDF3iMRr-WIQ#Os7qiDwFA+U z+7Z+aMQ=QXz9=Lz7xQufdfdzf&~A=zLyv(y+wjAO&A!yB9DQf=#x+)o2 literal 0 HcmV?d00001 diff --git a/client/class/EcFCButtons.class b/client/class/EcFCButtons.class new file mode 100644 index 0000000000000000000000000000000000000000..19de00b67766119d9a47d93d841ba5ac242e1032 GIT binary patch literal 1208 zcmZuxOH&g;5dJ0vHd$7I@Dv1sh$cY^?}tGY0#PWCR6(J|MTanir8cv1A3*s}`~`UM zLX{%r!HYM4lx5E*RYc&hz0;5B{`#Bg`SbVZF90K0)6s(7D4NlyqaX1I26Q~YppJ(a z((wq7btI5fYD&X!1WzJ(s?)}_GL1$sreR#egoa6mP%g{Rx}FnKc#g>0Qi_6S+A_n? zFmFoJTVUu&+~QB}Fod)AzF=rtH>G&vm-d9S&G#&2;X#tTa1LyzB=#Bl6YEF(n5X%P zmlnrDdg;X=WJRqrDw)1z`%XdROqHN{rI5=m`JQJ>cSLP8(2gkst!UFQZD0no4B8I2 z%zfc#m^1JU84dFWo?}773j;4Pt6|Z=60!!Cu|g0602Y_UbOmgVuyJqYv>?i=Wroom z;hUBvKE(-?Bb>M|Mf{js!grL#{Qbod@iM`TTk7w4)aeHIkGbiJxJ%L$8gd3+;kAKP zOcBIIDSb;g42?A%QGZuhHusK*a)#bp`B^tzkIse?)Fl*4-M2;sEK=5@@G7)s?NW(L z;=L`AtPmgcz2!NkEYjK5)UVj+xWz}GTP{O;^{9d!6?B>8ENM@1P?hxBwm9{2rm*&@V28qe(?bkV1{Fy8uQ*wio+zrOBW3Qmg4AoUs*NO934$xU zEdpTDwFxJ76-k}{726C>H_s&nw77@%$%b%UUKGnFx9lRre9hG)-paOASF(n+DhD-| zYWdY*2oC8EVt~f61q?CzLh72*sD^0Wjt-KYq)m_>qJLBB2Uv=IM<_K+;+#wjT_j@& zlN==3gD6evT?~=u9=fXuzLKYoB0daXpe`1^K>cTAQr{4|K*I&JOGMr(jU3T4bZw}0 ztTATPU*e8h*O9#vefJD~L5`*%N9>ySoa!0$pbSB;A{!@Ny*viS2+cV8rpY@&Pt7E0 aQ#5-sG-7keBZGIC$9pW$&K}wm!u@}nS}Rik literal 0 HcmV?d00001 diff --git a/client/class/EcFCCButtons.class b/client/class/EcFCCButtons.class new file mode 100644 index 0000000000000000000000000000000000000000..50a52e66399569a1956bfdba00aa8490f4d17ec8 GIT binary patch literal 1226 zcmZ`(TTc^F5dKanY`d;p%1uFF5rI;aA_!iJAQURa3M3F7h%ZZfC`-2I;9d&xpP2aI z8_y_@j(-wnU1-G@YKAGv}L`Z)W=I_xB$Frclt)fq^*MF{on*W(>nR?qWp8 zJ&fuY!?-#nbxa@?!(_j$(6Ls`WwR@R?@QrLsh0-2F=wC?T^i;M zJjN3SZO?M-5_dH`HSi1>4GRXIV^PDBffradu!5|HRRe3vJ+sFH+j00ivq*J%wrd80 zn^nuru2**V|uE#q| zd#4mCy`c)AfE_CDE5>@dJKUk_c_}YS{46XoPh=6Gf4C`wDz^fv`CrUke&*+F?vx0) z=L+!O8{(col*-V1#bxV6^>Et~YP7r~dHR}ro>k_nw&ln&!$QM!5{)NPsHtoqvEHyo z%LT1@)u6b?{T=E0Ho-@e`{8OF(O_bj7PbQn3HnCV?9wtv=-iDSlD(wOk{+Sow$xX! z6#IfmYLdh!GSP;TOdv{fgk(SBw8^a)rJLL6y8!q=HwvIMSwmAIT0`@DETujpQbS7( zTI3^!>RPOZ_)jF1lF$=3n!mv~$Fx%E(apL~>p2EPoVE}rbZ)x5z07Kia#8XDGPM zQ+~#){FADRGa*&=Wn5C%eod3vC*dUOiAJCaHtW5H|CaZI@YO^qTA`x?{>C}NNWVBo-I1rv7DaW! z6ZGBozJqzj6ba9q!tmG>rdJ~Km68ls$nGFXwhWWJGzvt%Pm~9gt5C%@p>xXiIc2#t z!%{9egY_9J-Zz-W45=^Jis5t&FKgH&_@YZ5OVs5tt@MNjtkIKyh7w*7_f^6Zxb_Ej C)T+M# literal 0 HcmV?d00001 diff --git a/client/class/EcFChButtons.class b/client/class/EcFChButtons.class new file mode 100644 index 0000000000000000000000000000000000000000..5d92241ce5adc9403814aa27ccac26bfac7af9b9 GIT binary patch literal 1098 zcmZuwTTc^F5dO|m*mhkhRPX`dzc<6NJa%Se6`R4Dx-+urU@lwMGZl;jNl!j@{B$3r{3%51Q zVot*y+)d(M5;+Zd6r^!piu+PLNTR5sq+&tELk6X4FbvnKTyWpzM%%HvWrm?OOIZFo z!)WfjE5FB(Fq|f5NY^aE-vpfl?!Gk-Y-uqYzU7Er?tXCG4sSBdKMbKjts7-Skmzbj~UcG)3%!2 zRk5sN1*8))x1p*%(fzV+tDHSS}w;FRWGfT}!lRH?jJWjn>6K2Bz&XjGxUr)?GQjPY~k! zWk^x6TDWWZB&yOac_&n$^h&l(WkzMU=ZsO4b#4=8-rN>V-VLE`Gh90tymJ)Nz!Y+& zUfVf&%{|X-@lDILofgAdj1`3T$PtnaF|5&CBtza-daF{E6J<#{|J1an=x<%+%zyucQ;+N?fR*285sG*E^bQABf Ojuz3JNJy~?CjSEnO9hw! literal 0 HcmV?d00001 diff --git a/client/class/EcFPButtons.class b/client/class/EcFPButtons.class new file mode 100644 index 0000000000000000000000000000000000000000..ef6979843c594db78d28ac082fd54fb91c26c077 GIT binary patch literal 1092 zcmZuwT~pIQ6g^v764J;=si>$RirSXaDt;goE2Xre7U>kmQQo#;DZw_W=@uOy{QWiaq&Pbi{!5`oc^3m~bD^Ny~$xU|exgY23&96T{ega6KU?7aky^E8yqN@+XxT4IY zfvdQtWgk5z-Sy&vq=k&Z{ED(7RwewoEgOL{9KWpE3Be?v`K}DAjES>2r(xbi3JcW34sS{g_f4enK*OSm43;!xO)Mj4BCpItteAL& zIfkAxZxFKzZ(2LT#AD@sf)(1@@?2X|Z9Fsl{=N>T6tGklHuZsJPLM0l7=3Y zh$uEg|0&AQR}nJTsB??T7?Eh9^G!;Ro|v*N4Yfc~9j&r%t;QV^Gfcrpjjc;MwF;%_ zYPPdSw8X0>uM*|c|Mc&ol8SB;;Gm%ZmC2J3)IN=cL8}t4*Ikbo2c^fIMwLt9y&%CO z%Zi|GRbAQi6ytVi;TY~YCTL#6pu+IcP3J~~>{CbAeiLV$C+`JXrO`tkU?lb(EEa}u zAO0BIM<6yu<|}zfbmd2YY#e@!BZx^1Vw$oi$U8>C0t^sa`qsTTAW z`aWPH-XCwlpeOi}+Tk{zK$={5Y^1R|*Xr#|<7OY+>jyUn~?l#ErEp zcLAyL0rH67Jo>5gS?HJ}w@3nHh>0PWdAF2CZru4Ovo@}Pz;%xbucP6cxs=CQz_>~TXc z3R}UVhG$4C$Y^+uB?T`uyu^ZnWeqD>)v$&vLGS?>+$^PPU~`0xyVOG0zmSDmR2@OO5{XlPzKuf*CX9-*&0eE$&r`EfI5k&J^S{yuxb@>zE~o z%ckiW!e(e`sEF$Ohh_WlL=-5}z^(jj>W)iyLIHwt$x`2~UOtNywItjct*chK%uV9G zGoGjs@7JAoZQU%FBD(dyg9qLs$K({1Y{F>BIp;>$T>fiYS|VRBIIiR!?-6 za!x5nYGYTNxj9`JMM~E#QU7ltekg`?yoPAa^87Apsc_p7f2C`%>V+iM7$S~v^K=(F zwM{5~AW7=EmTud>-5qX{Lx*#0oo)%o;U%%AbHgezWExtNc&k{ZY{>@J>Krs^>gm`0 zAvmTU#4wFv2WU>{3&=L55e?A33*EH#kTgwlfc|aCZ(vFG6@la!Ef=I>=%qD^5UnG$ z_9H?QdIzIqxre@bfX`$JlE=HTO9Z2#OEi5%I{5{GOEh0Xxk7kfN@R$fqjyX0qb*Ub z=?blKA0&Ov`_4HA{TOY2jOY#P1?AJ|AsK~QM>a*Wd~q~P5}GNp&5?DQo|qYuW@+~3 WX~Y(>gEaP$!CNfR$$mN$!2Lg<3@6tB literal 0 HcmV?d00001 diff --git a/client/class/EcFenetreChoix.class b/client/class/EcFenetreChoix.class new file mode 100644 index 0000000000000000000000000000000000000000..cf04872a68b149e67c36d61f5768784777b781d9 GIT binary patch literal 934 zcmah{VQbS+6g{tvjm@&PbvoU2>!#gI)47Nu2opi-3PN!oCJKH_(`WZaO(cD5{ab=o z@Pj|VA0?io-O@p&A9C~FdFP&c&wcOD-(SB09N>`!6YE73uwmgY?pfHxmW3*|P3)Ms zZ{mSKuGJJ+X}4r3bu62wk@|WlPPmr9TZQuN`R9&|-}#+B zk>!yJyV0oGj|M922~?f-nLqSBf22J*l%e)Mq=chneV9nuS%&OVab8R zYw6FyR1k&glbXqVlOa>-<1chZA?qYMj|16KNu#Sr!K~qfq)Qu1sM#pOGO=r84-ZW^ zHtKLqG;Hjn#yMTh6DX(t`hM8+jyq>E&;pxtEw|M`vyoUJ@1(|O>kAYIQlCVzR&362 zJ|>KfxjO0S$nQx#nI+9Q^=!-&kT+PmOuyh6r>ZNl!{=Z^;5xrt;+9V(Sueq6T;}d6 z@f`mp_a}raejw*I7`_qW1Q>6?VBBI{qd=9|Hcv_@PX!)N1QsZ+B&Vw$Ep4y$j(Q_$*8VO* zEBL`5;ExjDwA~^s(hoVweeZMLd(OG}{paT|0Ec*F!@_z2d2HCYhx;}*v1Ox*Z3{aV zb}c**Fj`H4)pkp28Aq}iYAw653iXjd{)N&ieko9KGxqE61)a=Z=it z1)Twv<+0MeaNHb(L#6uyRkwW}i~>Ix$G#j%9s3`qz;W_@lvp`whV0RDwtU4}MnRk? z<(cwY1{s>_hFX18|75;NmAUoF7xqXa`!u|Wy0WE`Lf4MF*IGYJN_DV=nu7vt3wsXs z@z8?npbpPM!@&V+99u@RKxx|PAkcmPq;t+`3T$RJ-&VtzB}D=`HyJ_sS|tL7p^Q(% zC|0c1bk7oOBhzd;N%DOe&qmAg+F;i{1|iPke{rH5k595?Eop1(R`$u|k6?wQcScQJNb(o*R_BZ!mHbgoIRtgiIqLMf9QwB<`GKNw*4XMPw9sJP9Ga1i?8F!AL;>csyr22RrNc7l4nKHFL{le4I$UciM=!scRuoSP1#Ji8}> zLSH6lQJg5YZn_^+c5|lVc(CNVGMP+TV9l*%moO1|)5YubE6zMu9f>{uKo$gU@-fm0 z@aIaum*6libM=(E!FSR73E_z!FuXd$H%bC4jJIGi?l6{VP@%TVogzw8gU3^YlJ^}( zZiHNY1apKNnZpWlbf~iMKJyNkw|bqu!JV|c$nZP?@OA`CUlo~)9THnxjQPZFFUFn_ UyR#U3My$LTdrs``_MNjF*3#v~d|tx1IxVuS<~grW#y4HSY&X=$G~n`sz{v$9T--&Lpz zedrJHM@i2l(ufB3VeibG{qCK6=H5U2`3s56>IxLv zEvco6WH(YeP*?s?9tylVQd*f~fnsgJ|DEpwiPNwz1+s0W<@xBcC!=qEZ%F0!MCpDw zIUR=AN)H4owf2QS_M861H04-o)BG_7&g}lsmdeaCWS=Ex$CJRQv2U!Bn<<~9zd%z# zsMSyPB=hrJc`V(zqDL0;zJ{YHkS%2!T|Wz+TW{D-Gf1PHfs2%jN(S#y7RbM31y-iM zhQ1y&JG~1T7=f*YR@>^@uz^Tmsb&r5p5M!E+%F?#jEu0&Q6<3<@N;Yz9Ak?6G(5&- zp7yCbT(k8%h`P9eQ{QFyMTw8em}d!~%vfYv1#f7AgW)#eb7)lk@-p literal 0 HcmV?d00001 diff --git a/client/class/EcFenetreSaisie.class b/client/class/EcFenetreSaisie.class new file mode 100644 index 0000000000000000000000000000000000000000..46284a036f6624751de48bb5a753ea5480be131c GIT binary patch literal 939 zcmaiyUuzRV6vfXZYu0QxP5Q@bt8Mxxt(#5liXsRVL23g+Xdfa9zHO2*PKmp+nI@l0 z&|3(0XV`V2R7F8$YI05eLQfmi7f|ZY}?qe zv1?;bAX9G&6dQFJNu9`MsQOAC3*=s?Na>dX%ifK(>N^4JB<@I)rXqQE`MD*Nw_&SC zr7%=cCmx>k;=YQy0%fmp5e~v29O^(0WTb=lW8l<`kBya^X2=dLC(~DLtp=es%F;x6 zEyEd_YR8fKsQ$}*lPXi|^Dpd;Mou%nOxm)pOrfi%?Q1O`nKE50pyDDA$Hu;k13a|h zxv0XoQFC#K3JbiEC{P-A*bAd>aNfF*Z7r}lv+0KFYnGA-WIfY*;aUX(`M%W6IMIsr zS>6YOY|JzopC0+H)RW^BSn;aqNl!%HV(}{dA7_119f=*j2^#{p`DIMMd@p9a0GF}A z*;DEn{)_$(2w!|h#;-Aar6jP(xD1PNi*bzxWop}8DWWtrcsw;I`QMPqj*zX5V2yAq zby!4}4i#>^&%6WXEnQ`=bH!{gQanchybC_b`Pd<`mHAjeY;`{NgxH<=*fU~l^Ref| J?vDGr_ZNnHu8aTx literal 0 HcmV?d00001 diff --git a/client/class/EcTimer.class b/client/class/EcTimer.class new file mode 100644 index 0000000000000000000000000000000000000000..401bdc2e0f036c26ca37fcdf218599940c50410a GIT binary patch literal 531 zcmZvYYfAz_6o%iknrqwI)yyttK^NN~sjo^Pl2C{VS>MNXiiveLwy}O!&;|O?59mil zXSbja$uMUQhxa`5@_v53e*ieZrh^O$lbFC#T#62sv0`J@#+r>1!D@903+0qH)>0>=5XbkZXqe-Uw~3L@<&mMuU*4E3M2ip->qE*t;U6o8dqbX4*>2 z&S=<|QBU-Pcp`kGLfw_obr=ohfKaZqZ^eVCibqqG4^o?IBaxiMeJzGL7vU)KWlO~X z_r&k1p^OgVB^T3Jcag=U3kOp+$}TprPOyJfgxLfh2z^sM@83$_5K3eJYpZ+1VMK&f zCH{5pUo?d5P@2XWyTK-Bn&BvHSbW$32Qwdg;F-(4g&bdEe=}TXc~Vc5K;C-;dGrFy zOT8fF?Q{2(#5%{dz+7M(X%v}R;{6>gV3!&5{Qi)(__bJ-^`2q9BK^1RB=bXdb;O!H IYb-2&1O2;c9RL6T literal 0 HcmV?d00001 diff --git a/client/class/Espace.class b/client/class/Espace.class new file mode 100644 index 0000000000000000000000000000000000000000..451ca6bdfbab7366945c6bb10590f053f2a4dcc8 GIT binary patch literal 7773 zcmcIo4Rn;%nSSp5GV^7AGJ*WSH$Xsvg(M)fy8a9i1Vd7S38?{rpcRH;7y}{04ig2% z*7}FCRlDjIfy&x!SJbM2g`_sE)$T5I{b{XLyW8&BvwOP7?w;=USofUv?5Wy)-h02v z3?T?-_iQ-ad*AoI|L=X@d%t=0<8QwNU><%RMl*H?uX=I6{2d74YTPcv=VkbU40p)z zMH%jt;Vv2O4qo*iugl*X!Nn9Kf5EGMV@0^QCyXlGE5jZc?sIX!%zMN5Q+!EQ4}>uR z54w0LjLFy?#+UJDGCVBcBVjy>KX>sJnaMH%`(*W47#Cu{ivwZI5|)F)au8n?@NpN1 z!k8oIzrYhRd`*S{87N^6{xVFPzwY9%!nj1Jo)qRMaah2o!gw0b$nXsp&&o`e1$fTI z^ILWsZ1V;rt=Hdkx-&BaUE@@uXa$VQ@b)B6Z3TmlBMRT@qM?Tq?U!CmjPb=tD zFE`p`aTABlJ7w4<1Mzw@ac(ZTeS0>SR|sC&)7O(mDRV6Y_|JonMvHb z))3QfAr`2t-pDnZ-9B1oA@-SN4ioMw*c~SC2w*5_LnNO|_U-6R=F>TfErBR4cxyJh zt*wu~%c8TNzK3(^RI)eK-50P30()0e!HvSauEbv|Z%*e@ zy~Y>2@|9a)M0p7)1mTt0{#+{E+9RhZVh_%|EyU>Mbv%j_xFL!`+)%)iY6z=cd@G6<@$D#v@g1T3E>#*n8w(dNMe#kX zj^bs!62cq1+flrOlTo}Yp16Kgh54uCD-EQJzZbrL5Wb($ zSQ|%$aT3Y-y~)1J{LYPAm|;1)woJ=dE>c{aKch)-_G z_VZv0-eOx!N3ofp1S$B=Tu+9*hycwQDZUVQtVMGC+X~!gF{_wC3NN7x;+_UKc)Mph7Rzex|)|NP|mB4bp?f1LfZUeb(u9w&CDz`Gqcvr%yKg` zE6&U;I?fkR2FsM=wS>09;R=}FI0V&L1APKzjb$egkRjL@I{{aQ^2W*&2+0tZA##i? z3SAr<5$4#6GSnf$f*(g?YFYi0SohOd_A^=a4J`V3ta(wq(pP*70tk__sZ{Y~Q9MNy zH;7^{Aeuc_RD14}Jy~jQoV=&;I3inV$!H_i`9@q%BW|D(pQ8~s(%<#G*Ee83lDvyk z#)wtE5qHpgO(T|;8ZqZMf?@(^>JP|F3tXAY#U9Qfv50e6;=wsGMo4;mYqp@8QJ#!m z%)mB2Ao}=F$f60`nb$v|9oJ#CZ%rL%$whz;2A<`@MmT7Yw{l#AwHzgF)6D_kOQ}&p zRt!YgxN|pSdk-nQ#}pkLE&4%{t{Yo)aJ1;hD0)BXuV;je zSnV+2V)bkWbhPMaDf&55t{+o$`DoFDB;7E!=2bZE5bS4p~YY|)|7 zqTims=zk*Vrm;nr6qQZmzfttRlRiDB=S)wd8a0hZT|lEQq*2pp)C?N6WyGk3jFXf~orwb-589T-l^>zg ze2z&1RU=|*4yLHNWZlXxVoRyhPw#AL072=Q0TX^Bl)i=p8cXN|$(6bc0d+Yuc?CR` zz$~?ZVz;q1S>cNq>@wOpeHc~Ue!rzSH#NoPk?Zo*5UN*Pbd*%KOPM39T5*9|MogCN z&B{7JSuUyiRL7h_)GX&vn+Po8I2GRHro{;&jaU@RBSjc6$_2_gAVFoE@ z4&jf^%*dCSk%xH#A3?SH3Yygc>{3q{qj&g5|0CZMl98u|F^d_Q?PsKZ0Q)374TBIz zY*H*xnwM>-=jFzcysSDsFD=Xq9kK$AQ|HQ!cxB1Ovq3bP^kmLR&vQ)A5vJ!Drl}V& zSDnC(>P0+3+>=T!qb%~))3R0cv=VTh7{(lWI#(*?BB_*li2%p>3AZ7(?*K9}&&_y& zY$D`^>>+cqcI6*3XM+eJ$EPGYj@>J!hlUHD#KAGPhVbc*!_HJMAgVTts)m9lo^vN) zSX?s8IoH1})nvDdiX30lXgrw%+%lTlwsF;!(pGD|Ihk!E;9W zZqY+R;z=Q#@fb@1JBew=d83}k;w6D)Z}t8Vq7N~@367Om9H+EKUZGWB^KReN=XdPmo) zf6)`wdwP=kK-cL7dZxZpU!)(@^YsyZi5}LM>X-Eu`gPsp)aYjC27QflNOzeI)9-hf zVMO^+1m_RKxP%?%kNsYH>45WV>1CI(-`GaV)x1Q|$IVZadu7rN`eI&r#tUW>VJ|FM zWIs4+SA^txbH2tl%GP6L`R&J$o>mcsgj?Rzwiw_+Tz=SD>jjG%%L*E$11&OKE;ULA za^|0*(e4+e77qPrJSF&TNHpsAN_t7L5ta6xv$Py(M9~sv+n!8BWUHdlgo8aLYBkBc$>Sug`w)3(<~Oo~1j9`|6jY zHN-1VVdE%s&P#0}-lFfU&C2N9aXwxY#4(`3Pj+FZZ!LR|30|eRaB{Q@rGA|~oQ~;k z)OmU@Kd)Hg;2C~>g1B>r3GM$!aS}mWSMo&pa9l|Pdxk&UK(9x+PNGVuFhy^|ES<)u z^i8;2Z^dHWi*B98fbPfBdM94cyYQO6UDfD&Rioacn)H3@T7AFj)n8J(^#ke)`XP0< zepo%KA65JHKJ~QTub$Tj)GCsQ2ja>UZ@?{ht1T{*``B z|6aerpJLv0#_69p>-Eo_=k+g~-|3|Dk^U8bU*NBfOy5s{};qQbnLD$UzzycgkHCQOabjq9s&TzD0eL5m zJDdygkTVlcIkR!xnPVFLPCq`2`O=RwKJS~C{uK<2ydydDrO!ozPf3YJh;DF-5J)BH zxd4@BXS@KZM77zewZKICkYhxuN?(D8u)>p9k9-DI*%cu+=R>&ElV1QNhE;ZDV|WNt zyovrsr(M~N$FX=A3*_nAB$alK&paM$PaD9c*Jf#!RP7}h;m8fa0MAvku3cjrg_GW1_jskLE3Wm`~zGKW!Kbd2KH8 zug$9lR7`sNViQ^a6T|}i1o3wga(VLF;TwJ_e+2@~`4`0VlIdK?M* zAeKm5`S|^kw$h66d}Z8%a%UH+oZA@m-3<8cxXk$?7CLugsdEpmaqdNzb3eMBz1ZM9 efQ<7X`kVuJ%NbA;on5NVd4}P?m4{g4w*LXy>W_H< literal 0 HcmV?d00001 diff --git a/client/class/FenetreChoix.class b/client/class/FenetreChoix.class new file mode 100644 index 0000000000000000000000000000000000000000..88c232e0202c7fa5bfcac2024676d75e485e7a95 GIT binary patch literal 1809 zcmaJ?-%}e^7(JV0v&p(81_T@#^Ewu=D8rJ5_jL?lS%wu2 zAEZ#xF@%{ERyEw$F(T=P@S%nW8XhW0I^|u@exhKY@|Cr3Jt;H}YXGVmCm8TcGuC>V~gtkrzaaUNK% zkX)95ZA^5zPG+?-*9-#Br6(w(T^ByzW?i@G$Tx!rDerbN8U|{p6YD+NS+aTCa=aY{ zS39-|8~!iLgmcy8sO>}QujZG-!DaK6-U^|2vR1vmX}fjrKu(TxVsDpwN{D^o28C!w zxN)$X)N57gj*+OXqfYIkb;_R0I)Ri2h1(T;mN1EPU?n(Sb! zmTT>Bv+N?yV<|9ua?0M`*PhG5rH*5}+$SLCdww#>E>g+OT_K##(D_j=xbg#I1u5Tb zEwDZJ|Ky8iutD1T5-%|zj+pd0-(u40;gfFXGYN&py2|(_pj?5TyUlDKPrD8IdBsR#UWM^rp+CSXJ#iB+?JB4x*N)cj3NiZU- zj~3H8EthWLIyt$ zyoL!zs!QEt{84jrl!88QRS(fe)c!FuC;9K^-_+_^>K!H(@YZ?M>RD=^)D337jd#wW Rj{kC|>u;I#F0mMH`~x~Zpostg literal 0 HcmV?d00001 diff --git a/client/class/FenetreConnection.class b/client/class/FenetreConnection.class new file mode 100644 index 0000000000000000000000000000000000000000..a6ed4d0ef3c6e10a396b644c0f13666a0a75f784 GIT binary patch literal 2427 zcmaJ?Npl-T6#m+lG^4SyNO2a$2~ie;EXz?KghdVnM~;Jn>^QMwM_GW8HE||LGiEfh zv#}&VAne6~13!RM4p2p`6fU?@#eo|)Zrr(XrTBWrR%F?5>7IW5z1QFS`n{fC|M~G} z00;1;icyX8sWAF6CWq4s&ZrpI5X6LBpOwR;9H!)OPUBEia9+bYT#$>4a=4`6RSi+R zrr~wy3Q8)bHFTpa*M^GA3T8CKaYcctBBP-PSLON*6^G=ate~P{w~W|>ssc-etzjR^ zDrObDsUa!1_Ms|yIT~tk71R~X33N{6#soxOU|r6(YOZd%lX|6YbTUD3`|Qw|{1gIV z_wr!bF={nKU|Zp;KBr&H)aFfVCUbJaxaJOr9QK8<6CAG5&34cF=4{(sZ}& zZR><%*JmaAL)KL5_Q^AP*|dF--2X^MyC<-b8RS~_Y7u;lPnJkGZ_4-M*(_zVY&iTH zw5)nXes#$RK7h`jVo1Sf5qyp>1fr|NX%9SP>J@uNV836po=SebuC6Yx2)8T&Tg%R? z2t^jGd4uH;Oy)fcp{vgK+90Zz%TuORw&x3G&1LN{i#;s_j5)({Gb<6E<9Ze;ONuV; zm~P3+TkZmRyK+ZoXF0MD$iZjfU9Fc_bKmbSzYqj^T2A(DBf6!}FpMnp&1>WxK~H~1kGXq*$NzL*F!(2?qVfX-Cl0RpK-1dFlI#_k4` z2T)fo!xE>-p(_;?=_tNlK!lKW#Z&|97qB6r^`R161$BGjD4#hoyND@nQqpM;FmkjO`$|o!LNtJg|VrJj<>I64_vXJm?vA%X9Z+ zL-9a7w1B$0!;&g`bH21*h>F&fs^9;}1;WPfX%3OyO^w<1<_o{KJbVE{JWoD0blz z*&O9b-YsG$XMzxheCQq)NCy$2R1fd&QCga3o#D^?3XwUc;NugV zWoXsEt-kNtqF1?loay=Ky-VmWqN!frL!{g3IE0*_7OR*fD8*tGk+y)51z$0~Y}#barhTB%=ViHpX|}V;?n3F$GVz1> z;1BRe8ShY%)&$}tckV}K&OP_c{QmRv7l000CJa2uBZsFZ%Gfhe!80B08>kw1Vc?}e zE}h7v(G{q8r=%#2$%&MrAeE7FCXt-?1@eO%l};#?0iS;_l}tYfRGXVFv_1)BooGY? zk3FgAYBoa%bE9gSweLd`-Rrh!)$>UeFSVc`%*7LL*6S=V1~^aQ{ZT^1mALO)3; z5h!R#J7mK4`S6lS2^{~2vmSuOj0Luunt6GBKOV^s0!orbugfp+cC(`Yi1bmz^RpE1 zvsf0H?3h;4(a2RJnlCB1cb&T3cLL8hc5+)TYW!mi)?tTjSF6bW0skl3c`FSWlSqiun$@5nB&{rT>qxr999#^)UE QGDrp`9I)3ka_o8i1)0pV%>V!Z literal 0 HcmV?d00001 diff --git a/client/class/FenetreConnectionChoix$2.class b/client/class/FenetreConnectionChoix$2.class new file mode 100644 index 0000000000000000000000000000000000000000..ec4a3e408f9acd378eeb21a850b9b1b3df5717a2 GIT binary patch literal 546 zcmZ`$T}uK%6g{(kth-s3eQ6p*NT`8IuSO6{f+W2tR*&m?!7ZDW-O1XY6%<7e{eXT{ zbT^_N+6Lx+aqgLO@4SD!z5!@p+e8X029n5|SjC!-bsYtPw3@gk&T->D|eNvh^4g(p$ajwsB&ck4UUaig|Uytqb0kcEL_7HQ}@wz4Rp z%+ti+6Y+Y&SxeV7qTNr1`{xQqc|qZhLg%t_E?42t(K?n-z!0z<|SZbmRK z!IW`891X#ea8JT}3}GWXXX!PDZTY*}f>ujc7IkwreLk;OoKXg8reN8Q&KcM=gR-C* zylStCatu-D&V*H6;98Yor{BaCUUSBEZj{MR_=Ili&Pj&jNk3@Z*5>)BPj-gi(W-_c z7+kc<+!!66WC&*Ik)b=Un|z`=Kf~=S+KfSx=qz_u2z4cgiDk61CJ82|g?2ZACVkuq zO6X!$TIiVn|=39~JO%D6`t;9wlOq=)p>tXHw%UY?#E0z5tBS#r_CG+FlbZKI3CablYM1!9F5)!M`O3p0>k1Cy zkb*SmlEfsh>W0DZCrVTp72Qr$O`a%O^Y^TZE|@BK3ATb14m0fV)y%5H3=pV_f+IMp zz=0@^v!%`q1ad*aB5DejaGxqs7)@)7PWqg!m-E_^RdocYD&c(vAK*iVnD5@aHp2~u z{_GmbN}{Y+?pdZzHBw1rg!)GeJ$^MRFmdpJq0e_vDA|@_T+&P~jvp%c7-ZoQJ|QnU z`>_8AHAjweX=e?sQsLzJr}&IvQ=-)ziA>`8$`qo{@kPt=)ebyebsWp27Ni2z%iN}? zG1IIX;z^-kX0slG?)nm6Q7$@DTW|J^t{K)W!vU`m-8i>3VcO8B{R@swQ()BXogFP; z`+?gdlIS!2KGjwznR6ur&o5BwsUEFdp3=>-wJ2Jf8h{)bYGc6{xap+*2)FmQP@_?& zkcuOcLaw%2%_T2RG@1%FjTyHt{8DcocvVDQ&~~3EyQrDkEGdhw@9p5KkoSA?mDKnr zQ(v1&w*pP#>6+U~0h*fQ-0%vDB6`*oL#xctMX_K|JFB|WrsV~-ookP(hg8JP1#WmF zV=an@{QSH?cEoz|Buf|g(whEY8xK#p?buZjxf^o_)tc7E-1!lth`sbxQ|ZeXL_o|K zdJ2fi;qEkU+?{3w?NKmlwqvv&2Urauk^ujz2V-5q27)SE22;D15mE!o2&heji!o{I z_68!$h^js8?;d2KHydsd!ibT*(VUBBkPzCpjSCFJ>a~a6D2+GA_B>kK{YU%e0#Gbq7u% zf_>PGB>fsl)5rf9eaPRS_>JKNPScvj1kR#}ad4c2jWdRf43+G&rFo*(Cawa$#h`7>2JvNV?v&ycx*Jy zeptu)djgG7$TmWw>!D95=2@H}2ZV!z=yF|=)PZR#!1a{(Q251Pgi>&>rPA)>1|lm8 W0m_x=iX86H9-}9bZ}B(iZT|zDtA=<0 literal 0 HcmV?d00001 diff --git a/client/class/FenetrePrincipale.class b/client/class/FenetrePrincipale.class new file mode 100644 index 0000000000000000000000000000000000000000..7ca023862c525bdbddbaeed0a5bbe464e205753b GIT binary patch literal 29359 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 literal 0 HcmV?d00001 diff --git a/client/class/FenetreSaisie.class b/client/class/FenetreSaisie.class new file mode 100644 index 0000000000000000000000000000000000000000..22fa3c0eebd517f8f6ce8dd3a66081798ca761da GIT binary patch literal 1773 zcmaJ>TXWk~5dMyDvK6&WTqn(i(ll*@tvGQhz1nF@n$*R?32hycI?%##eCnzwQb(4P z(gz-x;h87i;2-b+GsI@d3_pN>#0$e7NlC2GVLWp#>u-0z{dSN3`sa^70nFj6B(AGC zhZ_oRCUHwe6vY(YMM=TD3I(_2<&IqLs5;*zjQ@#@`%uLrJXTOsu*RU6HEy&G!H}uGlOZv0ScZFt;Y>E{Qg-;ZDCO1}VvBZ@ z(5I?~C00Az4dJZuhDnxGOSlKIqS+ipOSO+IvFxVw_DliqVLwN~g?~FhGHh zxQ}OZVJiLXy_`Wf%2{DhYj(%k5@kbDN|%KtTu1mi%t@IT#@9v1Fir7hvMoKG$&Mu^ zcep7!j)rM`N^bwvlYu%oje>?roM#vbAr2Wy$hw9pT+nb4mo#kP2}yN-E5t*h>KZoj znTF5tl;O0DR^YpC;elf`tNd%b<4VvI1dVpYL^C*S4sG>)bS&!lBcG zWpzw>8laRlAJEpYg{B4}$v;O+!3zxrUNW2ru{s`p$>65lVweuPB1)m~(U;G+t#FIC$XON=C58-oA7;_s zeq~#fxa1FM5c|N$Ad6bqat+)1zoNnjFP9We&K1c=<@u+~L0$bXhH`l0jMF#xYEVUZh_R1$=rB`^3-p6%p;|AKeiEnTV-=T=_QNj18w_Jlq`Y8+8hJ?mrAvqs1{ zBIV;R1^ATIW2TFV<1SCBnr8&QjQ0bVem1FJjODlH-6c@;krd>~Z>S L0$e3X1lRrrl<$>} literal 0 HcmV?d00001 diff --git a/client/class/Forme.class b/client/class/Forme.class new file mode 100644 index 0000000000000000000000000000000000000000..4aaca65e00423254255f58fd647302e4f299320e GIT binary patch literal 416 zcmaKo%}T>S6ot=BCy5!;AM4LX1aTF!XdggvBNPfn7mE9&4ke{YASOPQ8^I#D@Bw@% z@yw8gZrt3TGv~YaGGE^xp8zH}(oh(O=wUy=L4ZSnUfC7`VlLoc=4IYoQHswW1k`o) zXat6fyfim$k(v5F%{EkYyqHyWVJ@u8e=-eUX^-cwUv)i)aHhVi+InebxdRU6`+%Mh(vB7U!7Ys z4#MJMN78EaxZ3e|Bl7_Icxg&H;v<|Ag7z=Ou5DFD&>W N7I)&9al}qy?+2>5G)Mpd literal 0 HcmV?d00001 diff --git a/client/class/MaDessin.class b/client/class/MaDessin.class new file mode 100644 index 0000000000000000000000000000000000000000..fab67b06f3f1251fe13cdc2a4138f3da1a6e9575 GIT binary patch literal 6044 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 literal 0 HcmV?d00001 diff --git a/client/class/MmaDessin.class b/client/class/MmaDessin.class new file mode 100644 index 0000000000000000000000000000000000000000..8d06b4a3d2456e4098ccebc738869b3c8cb0e19f GIT binary patch literal 1241 zcmZux>r&HD5dKanO&elS1mq%ERJ1Kf1iTlJYqhmS1VrjRg#!jl(rHuR8SrVG(ctKe z58xB|%W*g1HbZ}8&z`;Sw|nyE-_PFwhOn-p3;hvv;)aTwh^t5-$=m>QgG_FzWT&gR zjbY|S6pX59LVp-{_`Iv)9`1)G|87x0K*a+*Wcec|DHUTFXSazk9<$}7f++>l0)h0b zKsYxmt5wrV353Q>%XB6Ln&L;o#EL+0#$J~K%{kMO^R?}wtSlSF5=qo;yH=HXdq=Jd z^u}{r#*U#IyN)h*q~+*&*3L1T;xOuxU8}6gw8^f~{I=oe9bzvHJ($tZjmrvVHOwKc z;E9H($Y{tSt>GDSIph`0Yj}#PwIdVb4YYlJkmWA&$yvGLxA2k>#YFOi7jj@8~lSM%wa$KlDU%dwNwqx4X z)Vfi2IAKGad+n@e=|MqoZc1m>Gt3a=J_v+PRXPliStVUCp7DSuODf?+MVCgBr56O+ z;)z^ZTGFY=1!{QBEE^?BGrVv{NIj6xT(xYh@yy82=Xu~q(#Qsds!}ZKK#ONGiQIy1 zTFxTbuyf8R$`aMpPR`ufo?hK0koBym;6O&XEG^oC!NV;$HHwt)qn{G_(_ue9jfV#9 zV)SH;dBgcc-B#=xhYiMO6Ip?7I{YoG7cA`9{_q7_4+}k=l+v}FEnYw&IvC57611Jb*}w?+7FZh2VnkaIBpM^y zfe3|*;wriJd6WYjAcO`wza+mQFyNxWMevYqbP;0Kh2kR2I{HW$$sbGAUuY^EKx;YY zB0A`zxfSO>|3J$=owkdME?Ql*9hBn(Nh8>& Mz6Gw4E`aO*0dNl(qyPW_ literal 0 HcmV?d00001 diff --git a/client/class/MwlDessin.class b/client/class/MwlDessin.class new file mode 100644 index 0000000000000000000000000000000000000000..34b236add7e1a103a014a66eaa92577c6e76ac75 GIT binary patch literal 627 zcmZ{hO)mpc6o%hB%G4NI-{1Z4Ih}?sEQt-8NTvwFdRix3na;@cwi3U^-daK>7Jh&q zCC)9nAQto9d(J)QnfKoF{_*+-U>&Z7B*yw-V%)+6CM`^1+QJNGwal5AH<2-s6)?)X z0!eR|8Vwn43iNHsP^xW#0p}-KI1@DBG@?=N{&3cvMQ@6Yy2cvAzdlc*Wjs4O*PsB#;8Iat@NHf-cK%5#*&1K87xa)k+7P^ zS{j~$ddH{E=e>d%#a)G5<7NA8d-I?jbv9f5UKn+@6zm&e6!vdX<5eFjq_*Sdfx>hn zjDqH%yC3u(wD%8qGV9gr^^*Xpv3Mmp>oxY`FzWAYY0{gZ|A;_O-=#Ww$CuDjidT=B zc*bON*A#yRZ!+JeP7Cs0^`t_UaKfoS4zennQETBbZfzwHbxili%(z9_mJx9Oq38(Xv%JY~V>C4PA ze9NbaFI*(Uw)No)#^PkOIgWls^lR!%6Vc{4`U9nNm}it<;L!E@v2UKZ{z&vED$BSq T(jRqgeI0ZCnW6=r8L0dP2+)DJ literal 0 HcmV?d00001 diff --git a/client/class/PointListeE.class b/client/class/PointListeE.class new file mode 100644 index 0000000000000000000000000000000000000000..71fbbc9107fc9dce037be7bf92313da17fdb2eac GIT binary patch literal 845 zcmZuv-)qxg6g^*>HESBzx;l037F&PJv~%ka#fQpZj0%O~#1)5w3F#U}N}7~38R(xQ zKKd|0J5Ugx{iDS5wQ(J?m)o0r?>YC}^Y!_--VoQesQ^Oq{3d{_$D9fxO!(AEf z$#7qW2O8EiJk($b%z5r8as-yzef!j|$C2yRcf!zq-)6lbkbds^ZnQ0svZ`+c)ZL)R z>0I0OotN>T>x3P<>#?HQ{UDBI4MWH8g#=|; z_&3Z|k?neti>q3UuXhdw^!*?XkDV8;Y~&}zQkm1-lzI*1kQXRiq20hWEEuSwW?&sf z1COv_(5JkCIySg%Dv}~Dk#fa^%Cr5G`d+v197hyl_j)wQnmTl;)u>XSI&wcyS~_$F z!6}m^dDH(SG*XY~LMPatOs7tq2o=7O!M7895^80ZX3m2cuk&jQDP};vb`DYd0p;yE zQs1C{nP3(f7dQc|K*cI?CZ`Lyk)YSes<5lqzCv9eWA0#vlYauhLWcHGF>WT9W`e1d zlus~A5;;ctBMLGrjiDV(OY<|TMJ@*(Q}h!o<0;B`MzUMDoltHkl%}LC&M0#UW#$+3 zGjT=^f!RsBHESBzx;l037F&PJv~%ka#fQpZj0uIJ(iMk;3F#U}N}7~38R(xQ zKKd|0J5Ugx{iDS5wQ(J?m)o0r?>YC}^Y!_--VoQesQ^Oq{3d{_$D9fxO!(AEf z$#7qW2O8EiJk($b%z5r8as-xIef!j|$C2yRcf!zq-(tNXkbds^ZnQ0svZ`+c)ZL)R z>0Hb8otN>T>x3P<>#?HQ{UDBsQ9?VUpbeLsl9W9Nk{8~F*bROYldrCtL$>Xg6>T3kIsF8CXZr zz$0uJ^eJzkjty>`ilm53q+Btf@@)U4{;Jz|jw1@Odp#OtO&z+_YE&su9l0MUEgd?8 z;FQUdyy<@u8mUKgp%d&+rc)wL4$n)&tn$4>y8sM|;~?2exy`*n5RUe@HR*MC^pHSTAB*+$j4z?37`Gm= zagEL5tR?=k?tHFAofc%=+Hr+~-5!jGPrHpke5N7`n{rhLi&%270NX(dHnS)@aB#vw z4IW<{NqM)%VA$tbGaS=~+Qlk^OfqT{hMeZe5PW_z z#q`p#3F2S5p>T@zG~%plh+&=B4Famjz}2Yq6xAR~R0WNy3aTb3V*+cISAa$31@bPE zcZs~qSjH9PaaA*yr_4KKCa5fGrYp=Gota)ypn2Pzf@UB|!7xc1<#FS{t$=7h0K^5Ur-&jIAt6pqu!^hHK_M;Q#if-%;sf|7 z#F|6v!|d+t%-H_<{rmbZ2#$PC72}gscY_3*nR4O|gO`F=-*`+f^(`s24dTg9HxnsUCuc{n6aSVwT zp*Pl6H?`g_b&LbIXm1%pcb7iN=elV4>bIBb9VZC*6YdC*3uJ8bbj+2w24@@42RHl{ r#_*qXl0C%SJLv^m1=r3O#N!5DcD{zcvn23%8E|sQ7Rja#&jQIGD(pIY literal 0 HcmV?d00001 diff --git a/client/class/TexteE.class b/client/class/TexteE.class new file mode 100644 index 0000000000000000000000000000000000000000..666041ff0eb76572d64f510e246c2325a98b74f4 GIT binary patch literal 846 zcmZvaZ%^7#7{$*m&_e0_gMf3W2>WBH3clQg?2UnhgiI5SiM~T^NR6~fEoL8UCK3`& z_5t>xjOVsx>PASO-g}>Oe)se#f1VzG1E|B&p`)x}Lx+NL1{qY+sLJO@Sw6|*&ls|G4`;F_qJ7^pQzT*zqP+N}c1m6V`X6-~Ex$j-t0`on` zwSSC;=eB>`KfmV5y4ju5{>MmX*6bbIKLfknl)KE09US=1z@?R)IEU=$gQ&v`xG`(f zUgU{#2^7rPw`Ay^YVtJCcq9GD8~GP@$C0tKQKq`o8JNcc-#7|mAPYkP2Hs)LfQg#y z7uk<20;!JY56MWlqai2QMTJw=`6(3sXbx92^QnO|!vgCfcY8>11r)6bg!KsJbb`bf zNh_BcL%m~%AA>cABx{*1J)IMV3jj`gMKx$2z^TQ8I>ih#`@Q2 O^HESBzx;l03R@9vqSRv>qUb_>_AV4;Glg$?8_ zJjA9&pRyKe*yOgUNQ$^b$`unT&l#N5_B%a!98!qW?b0B7>d>WDy+VQd$o)WR$w2n~ zQzlF5rvFK3q#4qMwtq00PMpXPWxkQcw-bC4YGsyW&Vv}Q^J^OkW9}e7*j52 zpHM6)L_hH*G8&CjS7xg2;z(T}l=Cn(`5$!_6xOt}+N78PZFMwy8zQ@>!I zi8FEt%ud=PUxSA=SzSgx<|^@588ROW`+R{?#sO`{!i9ZyY@cHESBzx;l03R@B%iqhH{20O*p*iT`kvqA zbf)PJunazoa|S21mz|zG4k^Uxc4?43b?8#7UZFsJL_hH*G8&CjS7xg2;z(T}l=Cn(`5$!_6xOt}+N78PZFMwy8zQ@>!I zi8FEt%ud=P-#!m(u)2(V%vIvAGGsm$_W1&(j04(?g$w)a*goq@>!udG;S;xmYv&{={7?0^xpfN^Sh@{`T6VV2Y@Cl9Xcu+syY-@GRUBoMqNHPW!aL)Z#BHr z@LoW80_py-=eWU1o7)?KeE-|vcF?*WxWm?I;5+V+4YlLAPViYEVK%-9B=@~5TOikW zT>Ef5y0HDT!NoOCHq73P_CH2Cvu6Lyz6V3M z^&(G{OQ2}Zza>NWOjDqF&Kv2c-q^piyN-;VjWRW*&Oi=JeB&sLfh-IG7+Aof0TT_` zFR>q41X5kkACZx8$0JU#hZ?7>^HV7N(HyR5=2HV_h9%Zz?)H%23Mg4q2SCyUf>Q zo)%W{AtV)IQjcAQs@k7K+mA?2k(Nv@Rf$#RU_a9MiMTzK(PqpJfkl*JY&{$W=-nph zIg YtK}>oeC1vCeNIs4wADY7f*BdC0dQd%lK=n! literal 0 HcmV?d00001 diff --git a/client/class/images/bgauche.gif b/client/class/images/bgauche.gif new file mode 100644 index 0000000000000000000000000000000000000000..de76e0766668f792595ee787782819b77d49fb8e GIT binary patch literal 81 zcmZ?wbhEHb YtK}>oeC1vCeNIs4wADY7f*BdC0dQd%lK=n! literal 0 HcmV?d00001 diff --git a/client/images/bgauche.gif b/client/images/bgauche.gif new file mode 100644 index 0000000000000000000000000000000000000000..de76e0766668f792595ee787782819b77d49fb8e GIT binary patch literal 81 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 z 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 L`spTdFGT$h4o5AS literal 0 HcmV?d00001 diff --git a/serveur/Connexion/Connexion.cpp b/serveur/Connexion/Connexion.cpp new file mode 100755 index 0000000..b3cf1d0 --- /dev/null +++ b/serveur/Connexion/Connexion.cpp @@ -0,0 +1,91 @@ +#include "Connexion.h" +#include +#include +#include + +#include +#include + +#include + +#include "SocketTCP.h" +#include "SocketUDP.h" + +Connexion::Connexion() +:socket_communication(NULL), type_connexion(P_TCP) +{ + socket_connexion = new SocketTCP(); + + socket_connexion->Listen(); + +} + +Connexion::Connexion(const int &t) +:socket_communication(NULL), type_connexion(t) +{ + switch(t) + { + case P_TCP : + socket_connexion = new SocketTCP(); + break; + case P_UDP : + socket_connexion = new SocketUDP(); + break; + } + socket_connexion->Listen(); +} + +Connexion::Connexion(const int &t, const int &port) +:socket_communication(NULL), type_connexion(t) +{ + switch(t) + { + case P_TCP : + socket_connexion = new SocketTCP(port); + break; + case P_UDP : + socket_connexion = new SocketUDP(port); + break; + } + socket_connexion->Listen(); +} + +Connexion::Connexion(const int &t, const char *hote, const int &port) +:socket_communication(NULL), type_connexion(t) +{ + switch(t) + { + case P_TCP : + socket_connexion = new SocketTCP(hote,port); + break; + case P_UDP : + socket_connexion = new SocketUDP(hote,port); + break; + } + socket_connexion->Listen(); +} + +Connexion::~Connexion() +{ + delete socket_communication; +} + +int Connexion::GetPort() const +{ + return socket_connexion->Port(); +} + +int Connexion::GetType() const +{ + return type_connexion; +} + +Socket* Connexion::SockConnexion(void) +{ + return socket_connexion; +} + +Socket* Connexion::AttendConnexion() +{ + return socket_connexion->Accept(); +} diff --git a/serveur/Connexion/Connexion.h b/serveur/Connexion/Connexion.h new file mode 100755 index 0000000..1eace9b --- /dev/null +++ b/serveur/Connexion/Connexion.h @@ -0,0 +1,94 @@ +#ifndef _CONNEXION_ +#define _CONNEXION_ + +#include +#include + +#include "Socket.h" +#include "../Global.h" + +#define P_TCP 0 +#define P_UDP 1 + +//! Classe Connexion. +/*! + Les objets de type Connexions servent à créer une connexion par sochet. Lors de la création on précise le type de connexion : P_TCP ou P_UDP, et éventuellement le port et l'hote. +*/ +class Connexion +{ + public: + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit une socket TCP sur localhost avec un port aléatoire + */ + Connexion(); + //! Constructeur. + /*! + Construction d'une connexion en TCP ou UDP. + \param t : P_TCP pour une socket TCP et P_UDP pour une socket UDP. + \sa AttendConnexion(), SockConnexion(), GetPort(), GetType() + */ + Connexion(const int &t); + //! Constructeur. + /*! + Construction d'une connexion en TCP ou UDP sur un port donné. + \param t : P_TCP pour une socket TCP et P_UDP pour une socket UDP. + \param port : port sur lequel sera connecté la socket + \sa AttendConnexion(), SockConnexion(), GetPort(), GetType() + */ + Connexion(const int &t, const int &port); + //! Constructeur. + /*! + Construction d'une connexion en TCP ou UDP sur un port donné et un hote donné. + \param t : P_TCP pour une socket TCP et P_UDP pour une socket UDP. + \param hote : nom de l'hote de la socket + \param port : port sur lequel sera connecté la socket + \sa AttendConnexion(), SockConnexion(), GetPort(), GetType() + */ + Connexion(const int &t, const char *hote, const int &port); + //! Destructeur. + /*! + Destructeur. On détruit la socket d'écoute. + */ + ~Connexion(); + + //! Fonction qui attend une demande de connexion sur le socket d'écoute. + /*! + \return Une socket vers celui qui s'est connecté. + */ + Socket *AttendConnexion(void); + //! Accesseur. + /*! + \return La socket d'écoute. + */ + Socket *SockConnexion(void); + //! Accesseur. + /*! + \return Le port de la socket. + */ + int GetPort() const; + //! Accesseur. + /*! + \return Le type de socket. + */ + int GetType() const; + + private: + //! Donnée privée. + /*! + Socket de communication vers un client. + */ + Socket *socket_communication; + //! Donnée privée. + /*! + Socket d'écoute. + */ + Socket *socket_connexion; + //! Donnée privée. + /*! + Type de connexion : P_TCP ou P_UDP. + */ + int type_connexion; +}; + +#endif diff --git a/serveur/Connexion/Connexion.o b/serveur/Connexion/Connexion.o new file mode 100644 index 0000000000000000000000000000000000000000..be11326584f234ceb5a08d38cf9a8da891fd5689 GIT binary patch literal 5128 zcmeHKZERCj7=G{8YGp$!l7NwDgMeEM%{ImmO>}H6kPK&Gj88{bx+@H}u55Q~5C~`$ zsr3iHOpM<`;#Z6WG0{X5!xRM*LyS?8AI6Bufc=1kAN*LX&vWlN-EAp@VEl-BlI}Ur z`@GM&=d17Sc7>NLGz>#@Go)0;m`I?^QEF|dkcl!uTGPL_q(&xZ!oDx;C_D8&cF{|R zFQrDxH&qOeX0zGUXa02fB6zm{q7Iy!o(`YSw4Kk7rd8m)ot6n-%(PxgH+YbQF*Eg^ zj6Ze6hi*3M$&_SIVBk#K=&_-F|Gc@(;C49s(ux_EXC&RAFnl_-^R!rH_-k0J&K&qN zcI@0z`w&J74q@2d?%|?`kc$=`!f>W_lsm*7{hEOf9%Ykw57`*@Vz|Px`kFNK%*>6I-?{WHghT~8#Pi0mw z&tpTlkJ+qIKGQ2w=dG8vSw;DjhoDEiYh)lGvfuE&YshiKNxhoX;%$@daJ^-C-#6rh z+cl1~!rLx8;d;;Teq_jZZdVaWWGdFdW^9iv5o3q%28Wh=JbR4*`uwnE@bR#-;AY=b zB@Gk3p;YO*px@R*2tSLDo#QW_vk~E`_+fMj=n3TK461QBhQCDRJWxD`b--6D@*B{z zqIk}?2;YFo+BsW_=h*YW*?2G~4*kFj-&5}o`imTp?`_ve---c(C;qPS7Xx_H8$QKs94n8S{axVtPR!%YO1Pgt81$7 z3sfX~&0e$1jP;q7fr^m1zB87vbLPyhs}u?LZR@sT>w#9UgBx`ZuApTOS`zGtSuqK& z@9UG`hIl+`4#v%-6-9cNDM6;08>5f)#=5~0J(d~7JZASn6&Z$+KeOp)9)C*DR2)~uZlkWT7|`S0i$3$O zmRE%wj*shUH;#8i^$FD27UJX1`xJwJtVL-0xee&M*U^5P$eW099oz%GjtKfLyX=^N zfU9Y(9WmXf%)I&RsHQb+S8lD8K0scl$|2}HqFyWG6%$3O5GY5V^XB~cRcBxC9lEmW z7LkC5qZydPm-0kpDEeu65L30M~Vm{7^yu(E|P>xUO-` zzX0x0^^CmCwZWY4^a4H~T-P?{w}9(9Ms615Tj08mQQrfu>lXPd1^I`-pTT#8_nG=v z;Lo}ES#Vv~sF%6!4CgD2J&A-l*x8c^#*;~jwk8HT6CKfIW?w%FPIOK4{9Hm~O?WFJ ziGfXayrn0;*|e57MjET_ct=-+vfJPY?nq5|SyQLW-Wt+&cUE;S%l&XTTdJcjv-9j? z1M1kA-5yfg$HMk}B296vxEF=69>)nglXZp1#<7QYjgwPC&ZafjIYWdl+Y%jV8r$f3 zi%cuh(`(t=+T5h9wXRTp?(%I()5#r+SI^-CbJMs?p1Z)Z%tS|CLUhC6U^Hp=_VpxU zU7gmp=+-Kkg)35m%QcUPqVzBkHEJCZMTy@Z>O)FDsr0i-UxoWey^{$4E+YK?f%LB-!k;9<|2Pr;7nOdH2>(%~f3NfqY6bmkiBm+j5aEA<2>(k; zKTO1r#N$dorS!#kNzorA!rxDXe-9D<*OdMt5&o~0{*%)0K`ki3%X}^ozSW9vP<%HL zMR^j=%a|@QgNVJGO~f2nf613B-laI}EcJbgKd<;<#XnK}2gQF@d{l8S&X@iG5#v`X O9#XtR;gbpvDEuATM(tSu literal 0 HcmV?d00001 diff --git a/serveur/Connexion/Makefile b/serveur/Connexion/Makefile new file mode 100755 index 0000000..b8c9083 --- /dev/null +++ b/serveur/Connexion/Makefile @@ -0,0 +1,19 @@ +CPPC = g++ +OBJS = Connexion.o Socket.o SocketTCP.o SocketUDP.o + +connexion : $(OBJS) + +Connexion.o : Connexion.h Connexion.cpp + $(CPPC) -c Connexion.cpp + +Socket.o : Socket.h Socket.cpp + $(CPPC) -c Socket.cpp + +SocketTCP.o : Socket.h SocketTCP.h SocketTCP.cpp + $(CPPC) -c SocketTCP.cpp + +SocketUDP.o : Socket.h SocketUDP.h SocketUDP.cpp + $(CPPC) -c SocketUDP.cpp + +clean : + rm *.o diff --git a/serveur/Connexion/Socket.cpp b/serveur/Connexion/Socket.cpp new file mode 100755 index 0000000..f198cab --- /dev/null +++ b/serveur/Connexion/Socket.cpp @@ -0,0 +1,129 @@ +#include "Socket.h" +#include +#include +#include + +#include +#include + +#include + +Socket::Socket() +:sock(-1) +{ + memset(&adresse, 0, sizeof(struct sockaddr_in)); + adresse.sin_family = AF_INET; + adresse.sin_port = htons(0); + adresse.sin_addr.s_addr = htonl(INADDR_ANY); + + memset(&distand, 0, sizeof(struct sockaddr_in)); + distand.sin_family = AF_INET; + distand.sin_port = htons(0); + distand.sin_addr.s_addr = htonl(INADDR_ANY); +} + +Socket::Socket(const int &port) +:sock(-1) +{ + memset(&adresse, 0, sizeof(struct sockaddr_in)); + adresse.sin_family = AF_INET; + adresse.sin_port = htons(port); + adresse.sin_addr.s_addr = htonl(INADDR_ANY); + + memset(&distand, 0, sizeof(struct sockaddr_in)); + distand.sin_family = AF_INET; + distand.sin_port = htons(0); + distand.sin_addr.s_addr = htonl(INADDR_ANY); +} + + +Socket::Socket(const char *hote, const int &port) +:sock(-1) +{ + struct hostent *hostent; + + memset(&adresse, 0, sizeof(struct sockaddr_in)); + adresse.sin_family = AF_INET; + adresse.sin_port = htons(port); + + if (hote == NULL) + adresse.sin_addr.s_addr = htonl(INADDR_ANY); + else + { + if ((hostent = gethostbyname(hote)) == NULL) + { + perror("gethostbyname"); + adresse.sin_addr.s_addr = htonl(INADDR_ANY); + } + else + adresse.sin_addr.s_addr = ((struct in_addr *)(hostent->h_addr))->s_addr; + } + + memset(&distand, 0, sizeof(struct sockaddr_in)); + distand.sin_family = AF_INET; + distand.sin_port = htons(0); + distand.sin_addr.s_addr = htonl(INADDR_ANY); +} +/* +Socket::Socket(const Socket &s) +:sock(-1) +{ + struct hostent *hostent; + + memset(&adresse, 0, sizeof(struct sockaddr_in)); + adresse.sin_family = AF_INET; + adresse.sin_port = htons(s.Port()); + + if (s.Hote() == NULL) + adresse.sin_addr.s_addr = htonl(INADDR_ANY); + else + { + if ((hostent = gethostbyname(s.Hote())) == NULL) + { + perror("gethostbyname"); + adresse.sin_addr.s_addr = htonl(INADDR_ANY); + } + else + adresse.sin_addr.s_addr = ((struct in_addr *)(hostent->h_addr))->s_addr; + } +} +*/ + +Socket::~Socket() +{ + if (sock != -1) + close(sock); +} + +int Socket::GetSock() const +{ + return sock; +} + +void Socket::SetSock(const int &s) +{ + sock = s; +} + +int Socket::Port() const +{ + return ntohs(adresse.sin_port); +} + +char *Socket::Hote() const +{ + return inet_ntoa(adresse.sin_addr); +} + +void Socket::Close() +{ + if (sock != -1) + close(sock); + sock = -1; +} + +void Socket::Listen() +{ + if (sock>=0) + listen(sock,MAX_CONNEXION); +} diff --git a/serveur/Connexion/Socket.h b/serveur/Connexion/Socket.h new file mode 100755 index 0000000..5953138 --- /dev/null +++ b/serveur/Connexion/Socket.h @@ -0,0 +1,113 @@ +#ifndef _SOCKET_ +#define _SOCKET_ + +#include +#include + +#include "../Global.h" + +//! Classe Socket. +/*! + Les objets de type Socket contiennent une socket, une struct sockaddr_in pour la socket et une autre pour le distand qui sert lors d'un Accept. Le rôle de cette classe est d'utiliser une socket TCP ou UDP sans modifier l'algorithme qui l'utilise. +*/ +class Socket +{ + public: + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit une socket sur localhost avec un port aléatoire + */ + Socket(); + //! Constructeur. + /*! + Construction d'une socket sur un port donné. L'hote est localhost. + \param port : port sur lequel la socket sera raccordée. + */ + Socket(const int &port); + //! Constructeur. + /*! + Construction d'une socket sur un port donné et sur un hote donné. + \param hote : hote sur lequel la socket sera raccordée. + \param port : port sur lequel la socket sera raccordée. + */ + Socket(const char *hote, const int &port); + //Socket(const Socket &); + //! Destructeur. + /*! + Le destructeur ferme la socket au cas où elle st ouverte. + */ + ~Socket(); + + //! Accesseur. + /*! + \return Le port de la socket. + */ + int Port() const; + //! Accesseur. + /*! + \return L'hote de la socket. + */ + char *Hote() const; + + //! Fonction. + /*! + Associe la socket à l'hote et au port qui sont dans la struct sockaddr_in. + */ + virtual void Open()=0; + //! Fonction. + /*! + Ferme la socket. + */ + virtual void Close(); + //! Fonction. + /*! + Fais le listen la socket. + */ + virtual void Listen(); + //! Accesseur. + /*! + \return La socket. + */ + int GetSock() const; + //! Accesseur. + /*! + Modifie la socket : ne doit pas être utilisé en théorie. + */ + void SetSock(const int &s); + //! Fonction. + /*! + Attend une connexion sur la socket. + \return une socket vers le client. + */ + virtual Socket *Accept()=0; + //! Fonction. + /*! + Lit une chaine sur la socket. + \return la chaine lue. + */ + virtual char *Lire()=0; + //! Fonction. + /*! + Ecrit une chaine sur la socket. + */ + virtual void Ecrire(const char *)=0; + + protected: + //! Donnée protégée. + /*! + Structure contenant l'adresse et le port de la socket. + */ + struct sockaddr_in adresse; + //! Donnée protégée. + /*! + Structure contenant l'adresse et le port de la socket distante. + */ + struct sockaddr_in distand; + //! Donnée protégée. + /*! + Descripteur de fichier de la socket. + */ + int sock; +}; + +#endif diff --git a/serveur/Connexion/Socket.o b/serveur/Connexion/Socket.o new file mode 100644 index 0000000000000000000000000000000000000000..7ce5e66fd07548235b6b6ad6cddce73edd31e5dd GIT binary patch literal 4448 zcmd^BU1(cn7=F`qGj7?I{Zg6COdD;{9n&uR#f#WBZewLs`{SI}c$%HAY11SmrzMq* zDN$L8!Y+2P3q_a+fCnXeV%i^FF8p&rc5u?7ryg+ z@B6&(`~834IhyEw%;)oo7N7W~riuJ|hs(qqXp>d4LI!7l>@Qz!t|S5%Bmg@r@zyyA ztmC0^8p>yz`!3(0>3j(4=!JN5lT?NS<*UJQ(ZuL%_u@v|Y&U#rS=KaUS+ii4b@Q{d zREBR{Ja_#6($`8NSdqxwoCs#PI%og<1mDj5{yX~|y2(73j|63E?fi`x_^B65GB*{} zyM8uty?o@lOhsTG&gEP60=f6eU-3nJCEhyh+(WDn1}m#(`(VJ_yLm<{@x}Abtz)RR=Jum}Hc*l3 z$-Y?2aFfn*JnpSr?<=L%XnA}|^F^&!^dI%(!Vgz+|QwW z-7NATup0lY5h8aO<;G38li*%KZyo|x;|9^_uI}!g;kI4-2HV4%jhGP&cSfVJj?Rwl z;kJCiDp(oIEL!d1wjOIFZDt*x&6~Eiix|b3N!uI&+65QKbPZ94ZIx^>4w|+p#z?U! zMj_`aBoAe$j7&N^k;|qmqhKTt3=HWBG#2LfRQdU_{Z)>!)>v}1zy&n2IomQYvQ0(X zOihT9%1usMS(`KPr{o@ZahVn?Z~g;(=dP$@!Bji49^X4vozSuZYlOfM>Wrr!_en(Q zSYAhhIYN@(7C8FATph2_<2L+kxJ3T*d%s<2cw= zJ&tEk_vVX()aL+{<44?&;>{Oc>E>cS`s;ip)V=w3H{>HnIf>%+>x18i4G{GEX6 zZ8wT`qp-2vr6{`HQ>g3QsEVk6J*SS3=1zO+4hO#-+R4MAnd+L6-T}YQSW%+$dB;HN z{1TDlSVYDLQP@BBm1EF*096@SCUQtJq?=ot~_}R#v^`b#%l(@U=SYhW5;sLly^~9VN^U%lrYLhwD$lNC7c&SD?sY* zzqxCqz7yp=6rFDm>iaP%9|M{H05FL8*7^i=eJ7JY3SA5Hy`~i)b?z^HN7Mfu==x5k zeg?W0`hSk1?`86rptoUKxfiMb0E|JWFZJJmJnU*tW~EIkLKrZR=M?)f?>`>&q2vcxLU~SdmGq#BRJwAktaOPJ%T(EpF*% z7wYnF?M)YLD+^o3sla=n`W7aWsgjw@PZg}>bh=Ai<4fTv! zEGF%lyp>F6M{@~!RUge{@=&Ri#55IiSu>NiXOh!V_a5@$sJ3HIG~rR{BH~>eB4QKf zl>L~pzpm_`02%kK;(u0r6ZQz>))SF0Mnt~d%6<^YxEB@wmg3JSp6@B+t|H-RzXW956~!;bHOROK5pmmzYejm2KAfG$sjm|;75^#` z?Y&Jz+^5R^4Ul=SDSkDsQ}UaL$Qvgj?*Nc_pQ4VuX~mx)BJcY|#C@Uc-vgQV7wUK6 zsX{FE4M6Ho6E}z)A%;cXRQ9ik_qlJ1uho5beG#?38{Ip{cdy7At{dzv3VF9sr}*wy c@wkZjM)}&@yTpgN>!A)jsPF}a+z+(>0f_Y^+5i9m literal 0 HcmV?d00001 diff --git a/serveur/Connexion/SocketTCP.cpp b/serveur/Connexion/SocketTCP.cpp new file mode 100755 index 0000000..188466e --- /dev/null +++ b/serveur/Connexion/SocketTCP.cpp @@ -0,0 +1,106 @@ +#include "SocketTCP.h" + +#include +#include + +#include +#include +#include + +#include +#include + +#include + +SocketTCP::SocketTCP() +{ + Open(); +} + +SocketTCP::SocketTCP(const int &port) +:Socket(port) +{ + Open(); +} + + +SocketTCP::SocketTCP(const char *hote, const int &port) +:Socket(hote,port) +{ + Open(); +} +/* +SocketTCP::SocketTCP(const SocketTCP &s) +:Socket(s) +{ +}*/ + +SocketTCP::~SocketTCP() +{ +} + +Socket *SocketTCP::Accept() +{ + Socket *sock_temp = new SocketTCP(*this); + + socklen_t longueur = sizeof(struct sockaddr_in); + sock_temp->SetSock(accept(sock, (sockaddr *)&adresse, &longueur)); + + if (sock_temp->GetSock() < 0) + { + perror("accept"); + return NULL; + } + + return sock_temp; +} + +void SocketTCP::Ecrire(const char *chaine) +{ + write(sock, chaine, strlen(chaine)); +} + +char *SocketTCP::Lire() +{ + int nblus; + char *buffer=new char[TAILLE_BUFFER]; + + if ((nblus = read(sock,buffer,TAILLE_BUFFER)) <= 0) + { + delete [] buffer; + return NULL; + } + + if (nblus < TAILLE_BUFFER) + buffer[nblus] = '\0'; + + while ((strlen(buffer)>0) && (buffer[strlen(buffer)-1] == '\n' || buffer[strlen(buffer)-1] == '\r')) + buffer[strlen(buffer)-1] = '\0'; + + if (strlen(buffer) < 0) + { + delete []buffer; + buffer = NULL; + } + + return buffer; +} + +void SocketTCP::Open() +{ + if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) + { + perror("socket"); + sock = -1; + } + + if (bind(sock, (struct sockaddr *) &adresse, sizeof(struct sockaddr_in)) < 0) + { + perror("bind"); + close(sock); + sock=-1; + } + + socklen_t longueur=sizeof(struct sockaddr_in); + getsockname(sock, (struct sockaddr *) &adresse, &longueur); +} diff --git a/serveur/Connexion/SocketTCP.h b/serveur/Connexion/SocketTCP.h new file mode 100755 index 0000000..f8098f9 --- /dev/null +++ b/serveur/Connexion/SocketTCP.h @@ -0,0 +1,63 @@ +#ifndef _SOCKETTCP_ +#define _SOCKETTCP_ + +//! Classe SocketTCP. +/*! + La classe SocketTCP dérive la classe Socket afin de pouvoir créer des sockets TCP. +*/ + +#include "Socket.h" + +class SocketTCP : public Socket +{ + public: + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit une socket TCP sur localhost avec un port aléatoire + */ + SocketTCP(); + //! Constructeur. + /*! + Construction d'une socket TCP sur un port donné. L'hote est localhost. + \param port : port sur lequel la socket sera raccordée. + */ + SocketTCP(const int &port); + //! Constructeur. + /*! + Construction d'une socket TCP sur un port donné et sur un hote donné. + \param hote : hote sur lequel la socket sera raccordée. + \param port : port sur lequel la socket sera raccordée. + */ + SocketTCP(const char *hote, const int &port); + //SocketTCP(const SocketTCP &s); + //! Destructeur. + /*! + Le destructeur ne fait rien. + */ + ~SocketTCP(); + + //! Fonction. + /*! + Associe la socket à l'hote et au port qui sont dans la struct sockaddr_in. Le listen est compris dedans. ! Cas d'une socket client ??? + */ + void Open(); + //! Fonction. + /*! + Attend une connexion sur la socket. Attention, la socket retournée est allouée : penser à la désallouer quelque part ! + \return une socket vers le client. + */ + Socket *Accept(); + //! Fonction. + /*! + Lit une chaine sur la socket. Les '\r' et '\n' à la fin sont supprimés. + \return la chaine lue. + */ + char *Lire(); + //! Fonction. + /*! + Ecrit une chaine sur la socket. Il s'agit d'un simple write. + */ + void Ecrire(const char *); +}; + +#endif diff --git a/serveur/Connexion/SocketTCP.o b/serveur/Connexion/SocketTCP.o new file mode 100644 index 0000000000000000000000000000000000000000..4dcc577ed67a420bb6f881b8ea6f6efbaf1b5883 GIT binary patch literal 5560 zcmcIoUu;{|89&!{z%ZvX5Z1uD)d}uMTY8tICJiu&=Fe>l2_ZC1H?bAZaW09|)VA!K zG~HU2$sn*yrA*VLO^6qsK&mz-?V%4Kg|!eWP17dzp>OLnO#&KeosHt4VF*1MYUM=Lt1U}K)ooolv3B+H;%)XCuFZXu!(AWk z?eZI{%|*Z2Avb3D_V_NXgtth7`s#j_9XZv4G@0p8DOJ9VCP=Zdb;Wfg)3UW1b<->i z@&#*k6rGlqLKL-pTvA)h)~yTHt;!IZ-)Mld zn}2d+UaeTGS1-%luAE@ZGh)V=39JV)5U&ixF?kQd&GelZk+LAD<%4mY1vNI}aj;=g zqG-35?Y3#{fW7n4aI|by>nk0)U{yC==BT?swVDxWZW1EiWQrlk&2SX@hnu>@h_w6h zebDb|N{HvAUB{_(+Ri(om`k6u9Wjx~P70oZZcc2q{oPq)DDIh9c_v)?AXFKTl>QQ` z1jDv~5CD7m8G*}8AGNZ125bERjTn<-i z6Am}nMSMTO7mDGJ#(7Hmd7U!=x}y%p^fTi82b?}hys>~HwnV_qyXde&@(BiLg2Cc(W0?p{B4*o=_H z{$2xTM^K0>e$J2?jY0P|>^ER%{GRcmKgJ{u4-7mW>o`0zzB{(xOqhvScV}m!tGlZ= z){!sR1$)*`746-zjzN1OlghfB{rh@$3t<+|oN`hVkWQg4r&SHDOvheuggKdVQo@`l z7KJ&LPABaJ?t~=hv$ik`xw@J3sqCCNo5`NcWz)9ln91iy8re3`WgQ(FOQON1#GZOu z4s>tDD!|>b;|+hCIC3dZ=@id^T=ST2=1}bE65}t=T4on zvkvC`>lWq{mP*KdB=}xhbQi4dK~=vCD4$fW;nuxEe2j+o1F=1M+_SqR#?rgxigF;a zg3K-Qzlzrh4*eq?-9mpqmvsu-So-nlyg1Io`&>)?kK&C;o{F~@ympPJ`gs~UJ>E+# zLU4aDUS1z6-qWblxAONq{Jj9Iit<;4LihJE{4sv|qh9%Y6Lmd~CHRX$r%Fs#eh;bp z`#b#gLPvk!!l(Q#p|1P80e=zbR3VS$J$$;qFdVf)M}N)ul)rzXuKQboKlY~zZ7cy) zbY2xa=8Gz--!Gxi`;DQ)-$BQIIp3<^i1Y`QTb8&8T2ZcdY{GkN6W%@0sobOabNJh( zoB*pTrCLMsE@AQ((eOK{e;Xgi$8j`V2SH4k#Zp1ofsS5c8eCjTz{bgWvZxb_@R3ZNzeCp1o{e56{ zKNDY5WJvNq!KdzK+POgL9wxpA3#jg0;)j6MJxlz!w!rjvP~vvf+i{YN`|KQxD&!Y^ zxa`A=67$Sy$9lfyv;P5D-Q^t5vd{iEAHD{x?sf7%_1XXH!>d00g%1a`J-~SG^x2I;*vC7w>3JH-q5z8 z)2Lk*;fURJfzgo}Tf|kbE%7A0CalIxuECoM<)bAvuQ!4om&K$lHZN zuHcUwuP;uqq_6 zv$>)zrfjE(QD*tJLbv+6tP#tj1LS(vwP!d}bmUqeJ3i9YnM|e^7E%+L`L1r%iC7`z0}WzorE5ElTis?gh3BaTSt0o_pkdMhV^*l;GWu{Y+jP zBzcbzgV#?9-WVl#c}fiKEF^ia5`*_9C3rlC$onfLc-JAx`!_LopHqT&H})raJ0WS` zLk#_s5{ceM#-)_nu;-{O`ACmeXQ+5jRGG$l&P6=S~ z_#2Ax@eOGFp#F|9x+TVZ@cc9O*ZD>QcMdTwPrk{FJ+l470K|{V_C2!w0p69+_u~H+ zC=okC5(b_JM +#include + +#include +#include +#include +#include + +#include +#include + +#include + +SocketUDP::SocketUDP() +{ + Open(); +} + +SocketUDP::SocketUDP(const int &port) +:Socket(port) +{ + Open(); +} + + +SocketUDP::SocketUDP(const char *hote, const int &port) +:Socket(hote,port) +{ + Open(); +} +/* +SocketUDP::SocketUDP(const Socket &s) +:Socket(s) +{}*/ + +SocketUDP::~SocketUDP() +{ +} + +//FONCTION NON UTILISEE : NE SERT A RIEN ET BLOQUE +Socket *SocketUDP::Accept() +{ + char *h=new char[TAILLE_BUFFER]; + char *reponse = Lire(); + + u_long fromaddr = distand.sin_addr.s_addr; + + h = (gethostbyaddr((char *)&fromaddr,sizeof(fromaddr), AF_INET))->h_name; + + Socket *sock_temp = new SocketUDP(h, ntohs(distand.sin_port)); + + delete []h; + + if (strcmp(reponse,"CONNECT") != 0) + sock_temp->Close(); + + delete []reponse; + + if (sock_temp->GetSock() < 0) + { + printf("Connexion refusée\n"); + return NULL; + } + + return sock_temp; +} + +void SocketUDP::Ecrire(const char *chaine) +{ + socklen_t longueur = sizeof(struct sockaddr_in); + sendto(sock,chaine,strlen(chaine),0, (struct sockaddr *) &distand, longueur); +} + +char *SocketUDP::Lire() +{ + int nblus; + char *buffer=new char[TAILLE_BUFFER]; + + socklen_t longueur = sizeof(struct sockaddr_in); + if ((nblus = recvfrom(sock,buffer,TAILLE_BUFFER,0, (struct sockaddr *)&distand, &longueur)) <= 0) + { + delete [] buffer; + return NULL; + } + + if (nblus < TAILLE_BUFFER) + buffer[nblus] = '\0'; + + while(strlen(buffer)>0 && (buffer[strlen(buffer)-1] == '\n' || buffer[strlen(buffer)-1] == '\r')) + buffer[strlen(buffer)-1] = '\0'; + + if (strlen(buffer) < 0) + { + delete []buffer; + buffer = NULL; + } + + return buffer; +} + +void SocketUDP::Open() +{ + if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) + { + perror("socket"); + sock = -1; + } + if (bind(sock, (struct sockaddr *) &adresse, sizeof(struct sockaddr_in)) < 0) + { + perror("bind"); + close(sock); + sock=-1; + } + + socklen_t longueur=sizeof(struct sockaddr_in); + getsockname(sock, (struct sockaddr *) &adresse, &longueur); +} + +//en UDP on ne fais pas de listen +void SocketUDP::Listen() +{ +} diff --git a/serveur/Connexion/SocketUDP.h b/serveur/Connexion/SocketUDP.h new file mode 100755 index 0000000..0bfa71d --- /dev/null +++ b/serveur/Connexion/SocketUDP.h @@ -0,0 +1,68 @@ +#ifndef _SOCKETUDP_ +#define _SOCKETUDP_ + +//! Classe SocketUDP. +/*! + La classe SocketUDP dérive la classe Socket afin de pouvoir créer des sockets UDP. +*/ + +#include "Socket.h" + +class SocketUDP : public Socket +{ + public: + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit une socket UDP sur localhost avec un port aléatoire + */ + SocketUDP(); + //! Constructeur. + /*! + Construction d'une socket UDP sur un port donné. L'hote est localhost. + \param port : port sur lequel la socket sera raccordée. + */ + SocketUDP(const int &port); + //! Constructeur. + /*! + Construction d'une socket UDP sur un port donné et sur un hote donné. + \param hote : hote sur lequel la socket sera raccordée. + \param port : port sur lequel la socket sera raccordée. + */ + SocketUDP(const char *hote, const int &port); + //SocketUDP(const Socket &s); + //! Destructeur. + /*! + Le destructeur ne fait rien. + */ + ~SocketUDP(); + + //! Fonction. + /*! + Associe la socket à l'hote et au port qui sont dans la struct sockaddr_in. + */ + void Open(); + //! Fonction. + /*! + Empèche de faire le listen la socket en surchargeant la fonction Listen de Socket. + */ + virtual void Listen(); + //! Fonction. + /*! + Attend une connexion sur la socket. Attention, la socket retournée est allouée : penser à la désallouer quelque part ! Il faut regarder encore cette fonction : il doit y avoir des erreurs. + \return une socket vers le client. + */ + Socket *Accept(); + //! Fonction. + /*! + Lit une chaine sur la socket. Les '\r' et '\n' à la fin sont supprimés. + \return la chaine lue. + */ + char *Lire(); + //! Fonction. + /*! + Ecrit une chaine sur la socket. Il y a encore quelques binz là dedans. + */ + void Ecrire(const char *); +}; + +#endif diff --git a/serveur/Connexion/SocketUDP.o b/serveur/Connexion/SocketUDP.o new file mode 100644 index 0000000000000000000000000000000000000000..f7df20f28e8f22bfd2e22c9ac875d8df760e964c GIT binary patch literal 5424 zcmcInZERat8Gh{~BP&UpZ7s`2$DB50X}8|RX%@PHSk~mO?GmL~lT=k9xQ=s^ICZW) z`#MWtrA1!GEU!}d2b&NG4GE-*4-JV538_*Mp%S1WO{hqfD6Eshnjf7Mp&%le=ea(| zzP`y+eypdxdG7PR&w0<+d(SyOXZAlI2n0lzfYeBZi45Lb@^re;CJ#uHjO0HU%B|Gq zRvL=g`sMXvv6%Z^Q^BlXl6t7B&9`>t&9%blTD3K=3~O%f!sz9M;ky$%w^IKxNl;qdJNc1Qtw@t8=AX_gBo9moTaesk%m=XeF0w6e zuF}}uoHuVH6{myKwHM6WgSuKln003TM4|gLdx}LjDa%gRkT;hvj4mVgbepb}H*X-+ zP%*n!%-+yO=I`~w=yf-L%htRyTz6#!^G4oW$(>yjXRE6#r8T;VAy4tcDP~u7z=g}s z4tGc^91>On=ng4&c2(Cei`{4|m8$a(!7|0KOxu>sn{43LJq2?mZ{956zy6xg_>#Ha z1TWr-*>%iE?(+7*=@M;F5gG=OWpEW!t;!O*dIi~?TWMxnzQtHFS5?3Z=IUTMqASD1 zRmaJj>$$V*a_*7Mre?{!?RI?fTW8m?KyvQhg1KH}uKix5V6L4%D9&Mb^yRsP@5uRs zTO3XSn$i)!yA``!k(Id7Vcj_P%9J&s-s7yd%To`$T2u+NWUiH_5m~!dnnr&_cNwt` zqgSL@3^X*>iL}-k(g)m(H^Kf`U04Q`-_IX_eP3Otyr}#>zHQq}B8!2#Hv{tPz&AyD zjtvZ$J;TzIv~6oHp0q=0Ya*NZm$gMQ$=Dgok+HZv&IPwys7`LK-OspZRaTk98shZ^g8b2ZN!O|HKe<`Z~a4d-(c4L`q& zcuwM}4dIVRb5zB7gFb9JuBLr+%`ag7Dl}iAw!2!>uj0H1^Chjp7`<&#vlFH@JllgJ zj{>X4b=+v8zZvyAKgJ(|{~-Ls@E-%#o`%6Qo+GLs?C0AxB438Ps*Q-zaNGz(#_aha?~r?7-7ik zW&~?0GLeqXplLhlSOx~YKjTDWXT*plXJ#zh!6f~kh3k*06_xkG`&AO(rY`PWgK#5K zS1{MreLn!}e;qCv-d9PiZMN!JbyD4@yz%A` zuNgMRqg}^a#JhJK3B>y}Y`W-iyaR(*HwWDxv=ctv?$7b=ZFdpv{tz~{%YN#1e~Wid zb?N5fc#8J@2{!#sH+4^MqGNo$wsg-!_t#ByjHTC>?jz__3Kf}Njd<8UeBJICyzwq= z6M5ZJ(c34;%f)N2m5+GBmrM084EERC0=b^WQk5F1PUf2OSEK#Rj7q7gnt8_at|YlP zQ^>bgD&wt2w&7o;a2`IVD9@Vvu@d|~bfN!QMMA(9WGeGr@0--el%GI-8jn7^=zkUb zBA%0Y$iEBJh5Dc3(PtF>%o}|kk-w+KK2rpBH@H4m$e-~n zAmerW_<)ZO`}ipzkNWtOk0*V6!N=bK*Jm30_hX;`qL04=uFp5>z27Lu^B14~nveh8 z$8Y-hhd%yq@M)weGnMT%s&9mu)`EQ8>G@{Z{*yj_QgLQ#3-Wc+=g;`Kljcb?2%T?8@t!Lp?h7=#dvjadu>OjWzuq{k{M@gJ~}?0 z7TZZqWzcu~jwuyX1MEfl`LWBG88-R$oNg{NwDg1%LKNE2&d>_cT%j8d>U)ack`*HsS(jFp* zJxnx2zD9hqbWaF`OLxiu=8OAXprdpK1=?}ukmH99rd9%b#r+Kw_&f;t0ad?K)qje6 zC+uDLtxLolp$if~TSpXsQSpT0S;ZF>|DNK%Qk?n3`qvcyhvMss@5K7Doi8agiO`=` L{8fcKU#R;ZPdo+A literal 0 HcmV?d00001 diff --git a/serveur/Contraintes/CCercle.cpp b/serveur/Contraintes/CCercle.cpp new file mode 100644 index 0000000..7bca7b4 --- /dev/null +++ b/serveur/Contraintes/CCercle.cpp @@ -0,0 +1,48 @@ +#include "CCercle.h" + +#include "stdlib.h" + +CCercle::CCercle() +:choix(NULL) +{} + +CCercle::CCercle(const CCercle &o) +:Objet(o), choix(new Cercle [o.possibilites]) +{ + int i; + for (i=0 ; i possibilites - 1) + return &(choix[possibilites -1]); + + return &(choix[retenu]); +} + +void CCercle::EnvoyerSolutions(Socket *sock) const +{ + char buffer[TAILLE_BUFFER]; + + //Envoyer le nombre de solutions possibles + sprintf(buffer,"%d\n",possibilites); + sock->Ecrire(buffer); + + //envoi des solutions + int i; + for (i=0 ; iEcrire(buffer); + } +} diff --git a/serveur/Contraintes/CCercle.h b/serveur/Contraintes/CCercle.h new file mode 100644 index 0000000..b2b4437 --- /dev/null +++ b/serveur/Contraintes/CCercle.h @@ -0,0 +1,52 @@ +#ifndef __CCERCLE__ +#define __CCERCLE__ + +#include "../Formes/Cercle.h" +#include "Objet.h" + +//! Classe CCercle. Classe à dériver pour faire un Cercle construit par contraintes. +/*! + On a dérivé la classe Objet pour en hériter les fonctionnalités qui sont communes à toutes les formes. On y rajoute le tableau de Cercle qui correspond aux possibilités de constructions relativement aux contraintes enregistrées. +*/ +class CCercle : public Objet +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Ne fait rien vu qu'il n'y a pas de possibilités de trouver une solution. + */ + CCercle(); + //! Constructeur. + /*! + Constructeur par copie. + param c : cercle à copier. + */ + CCercle(const CCercle &c); + //! Destructeur. + /*! + Détruit le tableau des possibilités. + */ + virtual ~CCercle(); + + //! Fonction + /*! + Retourne un pointeur vers la solution sélectionnée. Si il n'y a pas de solution possible la fonction retourne NULL. + */ + const Cercle *Solution() const; + + //! Fonction + /*! + Envoie la liste des possibilités dans la socket passée en paramètre. On envoie d'abord le nombre de solutions puis les solutions elles mêmes. Pour envoyer une solution on envoit sur une même ligne les coordonnées x et y du centre et le rayon. Voir le code pour les détails. + \param sock : Socket dans laquelle on envoit la liste. + */ + void EnvoyerSolutions(Socket *sock) const; + + protected : + //! Donnée privée. + /*! + Tableau des possibilités. + */ + Cercle *choix; +}; + +#endif diff --git a/serveur/Contraintes/CCercle.o b/serveur/Contraintes/CCercle.o new file mode 100644 index 0000000000000000000000000000000000000000..e8e685e710195e4c5fe7f872d3447eb26555cc70 GIT binary patch literal 5552 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 + + CalculerCoordonnees(); +} + +CCerclePassant1P::~CCerclePassant1P() +{ +} + +void CCerclePassant1P::CalculerCoordonnees() +{ + const Point *pp = p->Solution(); + + delete []choix; + choix = NULL; + + //Si le point n'est pas défini + //alors il n'y a pas de solutions + if (pp == NULL) + { + possibilites = 0; + CalculerDependants(); + return; + } + + //les centres possibles sont sur le cercle de centre pp et de rayon r + //on va projeter le point de coordonnées (x,y) sur ce cercle pour + //avoir le centre du cercle + //si le point donné est le centre, on ne retourne aucune solution + + //si le centre est le point par lequel le cercle doit passer on + //retourne un cercle de rayon 0 + if (fabs(pp->GetX() - x) < EPSILON && fabs(pp->GetY() - y) < EPSILON) + { + possibilites = 1; + choix = new Cercle[possibilites]; + choix[0] = Cercle(Point(x,y),0); + } + else + { + //on calcule le vecteur colinéaire + double vx = x - pp->GetX(); + double vy = y - pp->GetY(); + + //on calcule la norme du vecteur + double norme = sqrt(vx*vx + vy*vy); + + //on change la norme du vecteur pour qu'elle soit egale au rayon + vx *= (r/norme); + vy *= (r/norme); + + //on utilise directement le constructeur de Cercle avec deux Point + possibilites = 1; + choix = new Cercle[possibilites]; + choix[0] = Cercle(Point(pp->GetX()+vx,pp->GetY()+vy),r); + } + + CalculerDependants(); +} diff --git a/serveur/Contraintes/CCerclePassant1P.h b/serveur/Contraintes/CCerclePassant1P.h new file mode 100644 index 0000000..f5bb1bc --- /dev/null +++ b/serveur/Contraintes/CCerclePassant1P.h @@ -0,0 +1,72 @@ +#ifndef __CCERCLEPASSANT1P__ +#define __CCERCLEPASSANT1P__ + +#include "CCercle.h" +#include "CPoint.h" + +//! Classe CCerclePassant1P. +/*! + Définit un cercle de rayon donné passant par un point. Comme il y a une infinité de solutions possibles on demande au client de fournir un centre approximatif. L'ensemble des centres possibles est le cercle de centre le point par lequel doit passer le cercle et de rayon celui qui a été passé en paraètres. On projètera le centre approximatif sur ce cercle. +*/ +class CCerclePassant1P : public CCercle +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit avec des paramètres inconnues. Ne doit pas être utilisé. + */ + CCerclePassant1P(); + //! Constructeur. + /*! + Constructeur par copie. + param c : Cercle à copier. + */ + CCerclePassant1P(const CCerclePassant1P &c); + //! Constructeur. + /*! + Constructeur à partir de trois points. C'est celui qui devra être utilisé. + param p : point par lequel doit passer le cercle. + param r : rayon du cercle. + param x : coordonnée x du centre approximatif. + param y : coordonnée y du centre approximatif. + */ + CCerclePassant1P(CPoint *p, const double &r, const double &x, const double &y); + //! Destructeur. + /*! + Détruit les solutions possibles. + */ + ~CCerclePassant1P(); + + //! Fonction. + /*! + On recalcule les coordonnées de la Cercle. + */ + void CalculerCoordonnees(); + + private : + //! Donnée privée. + /*! + Point du Cercle. + */ + const CPoint *p; + + //! Donnée privée. + /*! + rayon du Cercle. + */ + const double r; + + //! Donnée privée. + /*! + coordonnée x du centre approximatif. + */ + const double x; + + //! Donnée privée. + /*! + coordonnée y du centre approximatif. + */ + const double y; +}; + +#endif diff --git a/serveur/Contraintes/CCerclePassant1P.o b/serveur/Contraintes/CCerclePassant1P.o new file mode 100644 index 0000000000000000000000000000000000000000..a80046f0a67ec5111f08354e6b8dbb23281dfbf8 GIT binary patch literal 6780 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 + if (pp2 != NULL) + pp2->AjouterEnfant(this); + if (pp3 != NULL) + pp3->AjouterEnfant(this); + + CalculerCoordonnees(); +} + +CCerclePassant3P::~CCerclePassant3P() +{ +} + +void CCerclePassant3P::CalculerCoordonnees() +{ + const Point *pp1 = p1->Solution(); + const Point *pp2 = p2->Solution(); + const Point *pp3 = p3->Solution(); + + delete []choix; + choix = NULL; + + //Si un des points n'est pas défini + //alors il n'y a pas de solutions + if (pp1 == NULL || pp2 == NULL || pp3 == NULL) + { + possibilites = 0; + CalculerDependants(); + return; + } + + //Si deux des points sont égaux + //alors il y a une infinité de solutions + if (fabs(pp1 - pp2) < EPSILON || fabs(pp2 - pp3) < EPSILON || fabs(pp3 - pp1) < EPSILON) + { + possibilites = 0; + CalculerDependants(); + return; + } + + //on calcule les deux médiatrices + + //coordonnées du vecteur formé par les deux points + double vx1 = pp2->GetX() - pp1->GetX(); + double vy1 = pp2->GetY() - pp1->GetY(); + double vx2 = pp2->GetX() - pp3->GetX(); + double vy2 = pp2->GetY() - pp3->GetY(); + + //si les vecteurs sont colinéaires il n'y a pas de solutions + if (fabs(vx1*vy2 - vy1*vx2) < EPSILON) + { + possibilites = 0; + CalculerDependants(); + return; + } + + //calcul des coordonnées du milieu des deux points + double mx1 = (pp1->GetX() + pp2->GetX())/2.0; + double my1 = (pp1->GetY() + pp2->GetY())/2.0; + double mx2 = (pp3->GetX() + pp2->GetX())/2.0; + double my2 = (pp3->GetY() + pp2->GetY())/2.0; + + //on calcule les deux médianes + Droite dd1 = Droite(Point(mx1,my1), Point(mx1 + vy1,my1 - vx1)); + Droite dd2 = Droite(Point(mx2,my2), Point(mx2 + vy2,my2 - vx2)); + + //calcul du points d'intersection + double xx = (dd1.C()*dd2.B() - dd2.C()*dd1.B())/(dd2.A()*dd1.B() - dd1.A()*dd2.B()); + double yy; + if (fabs(dd1.B()) > EPSILON) + yy = (-dd1.C() - dd1.A()*xx)/dd1.B(); + else if (fabs(dd2.B()) > EPSILON) + yy = (-dd2.C() - dd2.A()*xx)/dd2.B(); + else + { + possibilites = -1; + CalculerDependants(); + return; + } + + //on calcule le rayon + double rayon = sqrt(PUISS2(xx-pp1->GetX())+PUISS2(yy-pp1->GetY())); + + //on utilise directement le constructeur de Cercle avec deux Point + possibilites = 1; + choix = new Cercle[possibilites]; + choix[0] = Cercle(Point(xx,yy),rayon); + + CalculerDependants(); +} diff --git a/serveur/Contraintes/CCerclePassant3P.h b/serveur/Contraintes/CCerclePassant3P.h new file mode 100644 index 0000000..74c1b0c --- /dev/null +++ b/serveur/Contraintes/CCerclePassant3P.h @@ -0,0 +1,65 @@ +#ifndef __CCERCLEPASSANT3P__ +#define __CCERCLEPASSANT3P__ + +#include "CCercle.h" +#include "CPoint.h" + +//! Classe CCerclePassant3P. +/*! + Définit un cercle passant par trois points. Si les deux points des points sont confondus il y a une infinité de solutions, sinon il y en a une et une seule. Pour calculer ce cercle il suffit de prendre l'intersection des médiatrices formées par les segments formés par deux des points. +*/ +class CCerclePassant3P : public CCercle +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit avec des points inconnues. Ne doit pas être utilisé. + */ + CCerclePassant3P(); + //! Constructeur. + /*! + Constructeur par copie. + param c : Cercle à copier. + */ + CCerclePassant3P(const CCerclePassant3P &c); + //! Constructeur. + /*! + Constructeur à partir de trois points. C'est celui qui devra être utilisé. + param p1 : premier point. + param p2 : deuxier point. + param p3 : deuxier point. + */ + CCerclePassant3P(CPoint *p1, CPoint *p2, CPoint *p3); + //! Destructeur. + /*! + Détruit les solutions possibles. + */ + ~CCerclePassant3P(); + + //! Fonction. + /*! + On recalcule les coordonnées de la Cercle. + */ + void CalculerCoordonnees(); + + private : + //! Donnée privée. + /*! + Premier Point de la Cercle. + */ + const CPoint *p1; + + //! Donnée privée. + /*! + Deuxième Point de la Cercle. + */ + const CPoint *p2; + + //! Donnée privée. + /*! + Troisième Point de la Cercle. + */ + const CPoint *p3; +}; + +#endif diff --git a/serveur/Contraintes/CCerclePassant3P.o b/serveur/Contraintes/CCerclePassant3P.o new file mode 100644 index 0000000000000000000000000000000000000000..0948155a08832e4775c8e60336a95cc81f1ebb1d GIT binary patch literal 8516 zcmd5=ZE#f889uw&m7oz9v)V|}E{ZhKvSvd-uu~gIR=(qw5C^T9bxAG|2)i-6!O($< zt~+I2W9`&9&Xjeq))_jLF+ZA?{)mF2h_z0J(hh2t!n9UsVhx>)LQA`So_o(p?%v#B zr{hd}Cigz){XFmco^#JRn}>s|?s7OBLN$jd662H*_g`&Ds&yzArNSc`(;qe@hh53x zl6+_JnTz>+K6%)a2^Jp_#n57>ri|)(Z{}Ff$6le)(2eQf`ApOKLT*|z&g;H2O&5>8 z{?z|y%;az}{_>snnKl+@f+d-nvhCeOGsp7em@pkv_BsiMqsuj5d<`%nMM=PB-CXHm$Tn33GiZW&9_$DZ;zbix?M z@Dx&P7$2$e>N~;CQIRM~?i>+`%aS{XMd$Up%r$YBID2d=Hj~DYOmMVf;Lv$j=mXd6 z?v~lE_fF^B)PDc$A5MLGIG9+GX+$0)m(-b)X&lW2hcBt)9GX0or3i(&c8;iwa@i9| zTjz}`-r#=na!seKsslEvx;pCa$%p`4q0|H%uvrh`_aUK=Cw%ti-vqp?hL*?l%f z<%6Xbq5bZVVy~#Op@Kf-O9!@G$)-%U0@%@r_)22ZL|rvgJC9Z%ZmFOg-0q$hFr}4CJbh)16vKYqdaa z(k%$5Al(AVP{o9F*O@&VmS=x}?|ove^f1SZp36R^id_(0E=B&yqq*#EdwF)3VKAlgGDAk8hP6ywJG{kva^q#$KzRd?U)CJB@<{0UO)&*qwD^OqP0_ zU01{eaR+qeJJs%9oJ+Av9DJcZxUDQj87IHeMu)|tefgxa!EVY1Q?$lecRn|Bw))C) zSr5#OoOl^QFP)mLdn!RcQ{zgfW`fMA%Bzd`PWO1&*BvfPr%FI1`}xjyy3Zap7DK*|Ix5&?id0#?n_5H1eX*?lR|CRHGnzUDF}2z6P+)S^1E@Y&eD36}b{DyXV+J zkU9h3s^Z}4BxWezK6bIT*)h#Vg$G1|#Kv+RV=2sKs9X=WK*HLL|8BGKv(UzmaYPkJ zhHkU&*`|HdD5X9PoNFU09-ZU+wEn{m(^+yQcJ(FhRiYJWLr7P;h)Fv`RR3 z6eB^l5|?YY!-ozZwm2UB+PrvLamu;mN_Snd=q|rUm)Aj-P&yuTEIRyoz6sA6Ja^$K z@UzPAp?o(UKXw{Bxeu~^coLBJ0bOKR#vtn*Jh$LCimp>NQHSG<;5h}IMZkhM));Yk zFvbjQ$dkz{AzwR*d>MR(Ab%3_S1yNt7DmOnG+DIV?58t=;9-C$4w^v!($pLM{aW@3l(8+rW7Z2@CGg*} z@y4;(>hYNM9)KR#ziLWv1sLXhcld;0EX;Qb9+mHQ^v(Wuz+VY?s;PWC!7%%K$!F{_ z^hdt(w-cf~WcvQ;&OsYDz|PHMf*)1>>(u38?glYHlfBdyNq7Fyy~Juf)UnIFHQ1?C&r( z=w1^;`GZTm<<#$V(YkC$|>IR_Ncd7qFDJM|>1w87E zqP!pU89Y31NWTwMjrt$sQRflmm!rVy{2?7M6`cC@pw-z!c_(Of&XE4TMgJMl>YSmx z7qmK8NWX2-KW(8$Ec9m<`b(z8#`r2M^w%wPy@lRrp*t;f%0l;8=oc;Y&n@(?EcB}u z`dthCk%hh>X@1+Yu>L%zCCz;2Sm=5S{g9-&=gh)-<=Rn=_CK=F!g_V`H@CNoaAWkL z)@Vz3jTZ03F%`bAe&SJ9TNT_!$?ejEq;1bpTL*zfwUM^w&Ni*1HWuq>iAAHD7BBQ! zC&#cEJz!|sNUDNsRyKq!p(&P)eqc=BMpzXLEvOB}TBC`EKp1~?JOA$Wo3%t>-r~)% z&V<$xjBdcCGZ-?)wDA$J@i9?N=GxL0(#vY2Flowll}0gE%1{?J#M(L&t+A-VUSQmg z>kRvrh%tc7VxgLZI;~xcwjdKZ2P^06X;&}R66>V@c8Sw{dcf%mA^O z^db#vy4TuWiX6xEHpH5@XbfuYJ@tXg zaJadvE3&?ITc8U4cx$-14ZlpniS6xLxHY;V7Nnxx?GWtcY8(*`Z|v#{w`(2oSTxes zn%ExRR;iybPTUn{;9GX!gRTWSaW>ye#G$*Hh=cc0BJ`dFQty|fq4ygi^iC3?cbxVc;h$e|UB|c3={a=vu2SnIilz25R+O)4C!hV&+Hi>D8&l10iIugr;7?AXblD+~L zLuUon3lZ{fNV-wdJ0yM&$a?H04S&BSR$yHaVRs#Vml9_KsaHc9dfSN5+au+#5mE2s z#9M^;qr?kD)bko#@ra9vsAHqVF5<01^b@~^^@ju6Iai4NM691AjouterEnfant(this); + if (cc2 != NULL) + cc2->AjouterEnfant(this); + + CalculerCoordonnees(); +} + +CCercleTangent2C::~CCercleTangent2C() +{ +} + +void CCercleTangent2C::CalculerCoordonnees() +{ + const Cercle *cc1 = c1->Solution(); + const Cercle *cc2 = c2->Solution(); + + delete []choix; + choix = NULL; + + //Si l'un des cercles n'est pas défini + //alors il n'y a pas de solutions + if (cc1 == NULL || cc2 == NULL) + { + possibilites = 0; + CalculerDependants(); + return; + } + + //cas de la distance nulle : il y a une infinité de solutions + if (fabs(r) < EPSILON) + { + possibilites = -1; + CalculerDependants(); + return; + } + + Cercle cp1, cp2, cp3, cp4; + + cp1 = Cercle(cc1->GetCentre(),r + cc1->GetRayon()); + cp3 = Cercle(cc2->GetCentre(),r + cc2->GetRayon()); + + //si le rayon du premier cercle est inférieur + //au rayon désiré il y a un seul cercle pour les + //centres possibles + if (fabs(r - cc1->GetRayon()) > EPSILON) + { + cp2 = Cercle(cc1->GetCentre(),r - cc1->GetRayon()); + + //si le rayon du deuxième cercle est inférieur + //au rayon désiré il y a un seul cercle pour les + //centres possibles + if (fabs(r - cc2->GetRayon()) > EPSILON) + { + cp4 = Cercle(cc2->GetCentre(),r - cc2->GetRayon()); + + //il y a 8 solutions max, on va calculer cc1&cc4 et cc2&cc4 + possibilites = 8; + choix = new Cercle[possibilites]; + + choix[4] = Cercle(Point(x5,y5),r); + choix[5] = Cercle(Point(x6,y6),r); + + choix[6] = Cercle(Point(x7,y7),r); + choix[7] = Cercle(Point(x8,y8),r); + } + else + { + //il y a 4 possibilités max + possibilites = 4; + choix = new Cercle[possibilites]; + } + + //on calcule cc2&cc3 + choix[2] = Cercle(Point(x3,y3),r); + choix[3] = Cercle(Point(x4,y4),r); + } + else if (fabs(r - cc2->GetRayon()) > EPSILON) + { + //il y a 4 solutions, on calcule cc1&cc4 + cp4 = Cercle(cc2->GetCentre(),r - cc2->GetRayon()); + choix[2] = Cercle(Point(x3,y3),r); + choix[3] = Cercle(Point(x4,y4),r); + } + else + { + } + + //on calcule cc1&cc3 + choix[0] = Cercle(Point(x1,y1),r); + choix[1] = Cercle(Point(x2,y2),r); + + + + + + CalculerDependants(); +} diff --git a/serveur/Contraintes/CCercleTangent2C.h b/serveur/Contraintes/CCercleTangent2C.h new file mode 100644 index 0000000..28d284c --- /dev/null +++ b/serveur/Contraintes/CCercleTangent2C.h @@ -0,0 +1,66 @@ +#ifndef __CCERCLETANGENT2C__ +#define __CCERCLETANGENT2C__ + +#include "CCercle.h" +#include "CDroite.h" +#include "CPoint.h" + +//! Classe CCercleTangent2C. +/*! + Définit un cercle tangent à deux cercles et de rayon donné. Pour construire ce cercle on va considérer les cercles concentriques aux deux cercles données de rayon + et - r par rapport aux cercles d'origine et faire leur intersection. Il y a 8 solutions dans le cas général et une infinité de solutions si les cercles sont concentriques. +*/ +class CCercleTangent2C : public CCercle +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit avec des paramètres inconnus. Ne doit pas être utilisé. + */ + CCercleTangent2C(); + //! Constructeur. + /*! + Constructeur par copie. + param c : Cercle à copier. + */ + CCercleTangent2C(const CCercleTangent2C &c); + //! Constructeur. + /*! + Constructeur à partir de deux cercles. C'est celui qui devra être utilisé. + param c1 : premier cercle auquel le cercle doit être tangent. + param c2 : deuxième cercle auquel le cercle doit être tangent. + param r : rayon du cercle + */ + CCercleTangent2C(CCercle *c1, CCercle *c2, const double &r); + //! Destructeur. + /*! + Détruit les solutions possibles. + */ + ~CCercleTangent2C(); + + //! Fonction. + /*! + On recalcule les coordonnées de la Cercle. + */ + void CalculerCoordonnees(); + + private : + //! Donnée privée. + /*! + premièr Cercle. + */ + const CCercle *c1; + + //! Donnée privée. + /*! + deuxième Cercle. + */ + const Ccercle *c2; + + //! Donnée privée. + /*! + rayon du cercle. + */ + const double &r; +}; + +#endif diff --git a/serveur/Contraintes/CCercleTangent2D.cpp b/serveur/Contraintes/CCercleTangent2D.cpp new file mode 100644 index 0000000..cda54b6 --- /dev/null +++ b/serveur/Contraintes/CCercleTangent2D.cpp @@ -0,0 +1,184 @@ +#include "CCercleTangent2D.h" + +#include "../Formes/Cercle.h" +#include "../Formes/Droite.h" +#include "../Formes/Point.h" + +#include "math.h" + +CCercleTangent2D::CCercleTangent2D() +:d1(NULL),d2(NULL),r(0) +{ + CalculerCoordonnees(); +} + +CCercleTangent2D::CCercleTangent2D(const CCercleTangent2D &cc) +:CCercle(cc),d1(cc.d1),d2(cc.d2),r(cc.r) +{} + +CCercleTangent2D::CCercleTangent2D(CDroite *dd1, CDroite *dd2, const double &rr) +:d1(dd1),d2(dd2),r(rr) +{ + //on signale à dd1 et dd2 que ce Cercle a été construit par contraintes sur lui. + if (dd1 != NULL) + dd1->AjouterEnfant(this); + if (dd2 != NULL) + dd2->AjouterEnfant(this); + + CalculerCoordonnees(); +} + +CCercleTangent2D::~CCercleTangent2D() +{ +} + +void CCercleTangent2D::CalculerCoordonnees() +{ + const Droite *dd1 = d1->Solution(); + const Droite *dd2 = d2->Solution(); + + delete []choix; + choix = NULL; + + //Si l'une des droites n'est pas définie + //alors il n'y a pas de solutions + if (dd1 == NULL || dd2 == NULL) + { + possibilites = 0; + CalculerDependants(); + return; + } + + + //cas de la distance nulle : il y a une infinité de solutions + if (fabs(r) < EPSILON) + { + possibilites = -1; + CalculerDependants(); + return; + } + + Droite dp1, dp2, dp3, dp4; + + //recherche des points appartenant aux droites + Point p1, p2, p3, p4; + + double aa1 = dd1->A(); + double bb1 = dd1->B(); + double cc1 = dd1->C(); + + double aa2 = dd2->A(); + double bb2 = dd2->B(); + double cc2 = dd2->C(); + + //on regarde si il y a une infinité (ou aucune) solutions + if (fabs(aa2*bb1 - aa1*bb2) < EPSILON) + { + possibilites = -1; + CalculerDependants(); + return; + } + + //cas d'une droite horizontale + if (fabs(aa1) < EPSILON) + { + p1 = Point(0,-cc1/bb1); + p2 = Point(1,-cc1/bb1); + } + //cas d'une droite verticale + else if (fabs(bb1) < EPSILON) + { + p1 = Point(-cc1/aa1,0); + p2 = Point(-cc1/aa1,1); + } + //droite quelconque + else + { + //dans ce cas on prend le point dont le x est égal à 0 + //et son translaté par le vecteur directeur + p1 = Point(0,-cc1/bb1); + //on ne prend pas ce cas car si la droite passe par + //(0,0) on aura deux fois le même point + //p2 = Point(-cc1/aa1,0); + p2 = Point(-bb1,p1.GetY()+aa1); + } + + //cas d'une droite horizontale + if (fabs(aa2) < EPSILON) + { + p3 = Point(0,-cc2/bb2); + p4 = Point(1,-cc2/bb2); + } + //cas d'une droite verticale + else if (fabs(bb2) < EPSILON) + { + p3 = Point(-cc2/aa2,0); + p4 = Point(-cc2/aa2,1); + } + //droite quelconque + else + { + //dans ce cas on prend le point dont le x est égal à 0 + //et son translaté par le vecteur directeur + p3 = Point(0,-cc2/bb2); + //on ne prend pas ce cas car si la droite passe par + //(0,0) on aura deux fois le même point + //p4 = Point(-cc2/aa2,0); + p4 = Point(-bb2,p3.GetY()+aa2); + } + + //calcul de la norme des vecteurs normaux + //inutile car on a normalisé les constantes + /*double norme1 = sqrt(PUISS2(aa1)+PUISS2(bb1)); + double norme2 = sqrt(PUISS2(aa2)+PUISS2(bb2));*/ + + //on construit les quatre droites. + /*dp1 = Droite(Point(p1.GetX() + aa1*r/norme1, p1.GetY() + bb1*r/norme1),Point(p2.GetX() + aa1*r/norme1, p2.GetY() + bb1*r/norme1)); + dp2 = Droite(Point(p1.GetX() - aa1*r/norme1, p1.GetY() - bb1*r/norme1),Point(p2.GetX() - aa1*r/norme1, p2.GetY() - bb1*r/norme1)); + dp3 = Droite(Point(p3.GetX() + aa2*r/norme2, p3.GetY() + bb2*r/norme2),Point(p4.GetX() + aa2*r/norme2, p4.GetY() + bb2*r/norme2)); + dp4 = Droite(Point(p3.GetX() - aa2*r/norme2, p3.GetY() - bb2*r/norme2),Point(p4.GetX() - aa2*r/norme2, p4.GetY() - bb2*r/norme2));*/ + dp1 = Droite(Point(p1.GetX() + aa1*r, p1.GetY() + bb1*r),Point(p2.GetX() + aa1*r, p2.GetY() + bb1*r)); + dp2 = Droite(Point(p1.GetX() - aa1*r, p1.GetY() - bb1*r),Point(p2.GetX() - aa1*r, p2.GetY() - bb1*r)); + dp3 = Droite(Point(p3.GetX() + aa2*r, p3.GetY() + bb2*r),Point(p4.GetX() + aa2*r, p4.GetY() + bb2*r)); + dp4 = Droite(Point(p3.GetX() - aa2*r, p3.GetY() - bb2*r),Point(p4.GetX() - aa2*r, p4.GetY() - bb2*r)); + possibilites = 4; + choix = new Cercle[possibilites]; + //calcul des solutions + + double x1, x2, x3, x4, y1, y2, y3, y4; + //d1 INTER D3 + x1 = (dp1.C()*dp3.B() - dp3.C()*dp1.B())/(dp3.A()*dp1.B() - dp1.A()*dp3.B()); + if (fabs(dp1.B()) > EPSILON) + y1 = (-dp1.C() - dp1.A()*x1)/dp1.B(); + else if (fabs(dp3.B()) > EPSILON) + y1 = (-dp3.C() - dp3.A()*x1)/dp3.B(); + + //d1 INTER D4 + x2 = (dp1.C()*dp4.B() - dp4.C()*dp1.B())/(dp4.A()*dp1.B() - dp1.A()*dp4.B()); + if (fabs(dp1.B()) > EPSILON) + y2 = (-dp1.C() - dp1.A()*x2)/dp1.B(); + else if (fabs(dp4.B() > EPSILON)) + y2 = (-dp4.C() - dp4.A()*x2)/dp4.B(); + + //d2 INTER D3 + x3 = (dp2.C()*dp3.B() - dp3.C()*dp2.B())/(dp3.A()*dp2.B() - dp2.A()*dp3.B()); + if (fabs(dp2.B()) > EPSILON) + y3 = (-dp2.C() - dp2.A()*x3)/dp2.B(); + else if (fabs(dp3.B()) > EPSILON) + y3 = (-dp3.C() - dp3.A()*x3)/dp3.B(); + + //d2 INTER D4 + x4 = (dp2.C()*dp4.B() - dp4.C()*dp2.B())/(dp4.A()*dp2.B() - dp2.A()*dp4.B()); + if (fabs(dp2.B()) > EPSILON) + y4 = (-dp2.C() - dp2.A()*x4)/dp2.B(); + else if (fabs(dp4.B()) > EPSILON) + y4 = (-dp4.C() - dp4.A()*x4)/dp4.B(); + + //on utilise directement le constructeur de Cercle avec deux Point + choix[0] = Cercle(Point(x1,y1),r); + choix[1] = Cercle(Point(x2,y2),r); + choix[2] = Cercle(Point(x3,y3),r); + choix[3] = Cercle(Point(x4,y4),r); + + CalculerDependants(); +} diff --git a/serveur/Contraintes/CCercleTangent2D.h b/serveur/Contraintes/CCercleTangent2D.h new file mode 100644 index 0000000..10d1e31 --- /dev/null +++ b/serveur/Contraintes/CCercleTangent2D.h @@ -0,0 +1,66 @@ +#ifndef __CCERCLETANGENT2D__ +#define __CCERCLETANGENT2D__ + +#include "CCercle.h" +#include "CDroite.h" +#include "CPoint.h" + +//! Classe CCercleTangent2D. +/*! + Définit un cercle tangent à deux droites et de rayon donné. Pour construire ce cercle on va considérer les droites parallèles aux deux droites données distantes de r et faire leur intersection. Il y a 4 solutions dans le cas général et une infinité de solutions si les droites sont parallèles ou confondues. +*/ +class CCercleTangent2D : public CCercle +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit avec des paramètres inconnus. Ne doit pas être utilisé. + */ + CCercleTangent2D(); + //! Constructeur. + /*! + Constructeur par copie. + param c : Cercle à copier. + */ + CCercleTangent2D(const CCercleTangent2D &c); + //! Constructeur. + /*! + Constructeur à partir de deux droites. C'est celui qui devra être utilisé. + param d1 : première droite à laquelle le cercle doit être tangent cercle. + param d2 : pdeuxième droite à laquelle le cercle doit être tangent cercle. + param r : rayon du cercle + */ + CCercleTangent2D(CDroite *d1, CDroite *d2, const double &r); + //! Destructeur. + /*! + Détruit les solutions possibles. + */ + ~CCercleTangent2D(); + + //! Fonction. + /*! + On recalcule les coordonnées de la Cercle. + */ + void CalculerCoordonnees(); + + private : + //! Donnée privée. + /*! + première Droite. + */ + const CDroite *d1; + + //! Donnée privée. + /*! + deuxième Droite. + */ + const CDroite *d2; + + //! Donnée privée. + /*! + rayon du cercle. + */ + const double &r; +}; + +#endif diff --git a/serveur/Contraintes/CCercleTangent2D.o b/serveur/Contraintes/CCercleTangent2D.o new file mode 100644 index 0000000000000000000000000000000000000000..96e679bdeb8cdaa2bb14029bb476857d90be2faf GIT binary patch literal 16584 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 possibilites - 1) + return &(choix[possibilites -1]); + + return &(choix[retenu]); +} + +void CDroite::EnvoyerSolutions(Socket *sock) const +{ + char buffer[TAILLE_BUFFER]; + + //Envoyer le nombre de solutions possibles + sprintf(buffer,"%d\n",possibilites); + sock->Ecrire(buffer); + + //envoi des solutions + int i; + for (i=0 ; iEcrire(buffer); + } +} diff --git a/serveur/Contraintes/CDroite.h b/serveur/Contraintes/CDroite.h new file mode 100644 index 0000000..a8015a3 --- /dev/null +++ b/serveur/Contraintes/CDroite.h @@ -0,0 +1,52 @@ +#ifndef __CDROITE__ +#define __CDROITE__ + +#include "../Formes/Droite.h" +#include "Objet.h" + +//! Classe CDroite. Classe à dériver pour faire un Droite construit par contraintes. +/*! + On a dérivé la classe Objet pour en hériter les fonctionnalités qui sont communes à toutes les formes. On y rajoute le tableau de Droite qui correspond aux possibilités de constructions relativement aux contraintes enregistrées. +*/ +class CDroite : public Objet +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Ne fait rien vu qu'il n'y a pas de possibilités de trouver une solution. + */ + CDroite(); + //! Constructeur. + /*! + Constructeur par copie. + param d : droite à copier. + */ + CDroite(const CDroite &d); + //! Destructeur. + /*! + Détruit le tableau des possibilités. + */ + virtual ~CDroite(); + + //! Fonction + /*! + Retourne un pointeur vers la solution sélectionnée. Si il n'y a pas de solution possible la fonction retourne NULL. + */ + const Droite *Solution() const; + + //! Fonction + /*! + Envoie la liste des possibilités dans la socket passée en paramètre. On envoie d'abord le nombre de solutions puis les solutions elles mêmes. Pour envoyer une solution on envoit les trois constantes de l'équation cartésienne de la droite. Voir le code pour les détails. + \param sock : Socket dans laquelle on envoit la liste. + */ + void EnvoyerSolutions(Socket *sock) const; + + protected : + //! Donnée privée. + /*! + Tableau des possibilités. + */ + Droite *choix; +}; + +#endif diff --git a/serveur/Contraintes/CDroite.o b/serveur/Contraintes/CDroite.o new file mode 100644 index 0000000000000000000000000000000000000000..18c3ce983a37f349a194119dcd498e1f9b6d5698 GIT binary patch literal 5180 zcmeHKU2GIp6uz^&)dg$2>Z(;y7o}Q6CT*=iMI+D-TA{e1EE)(Ix7&d(Y zWFTQ2A!szlC!aK!=!-wm7qx(~A;F|3eW(#*O)wU>F*T{lK2*o=%-p-34v6}sCf;y4 z_dDl1=brmB=Wd@iHRn$Ae%#sH7#^4ZH{PS*RTjnnBN;yVPmS+9t=;;+O}-w^GL=ayF=-~wx%!7qWy07uVb>o#fJ~jGoD)$DWYJF zqj9S{>{p3^N0f@q${$nme6H#tVJ>I#affT|m_2<8C-ncm|6}_e^?o)+Da!Px=w#{i zqsC;&ic}BX>WWGy%pjo*5tRUAf*l;z>*jkomxjJ;+?s!R_JRL&_Q6YJZ%l=7%0?+{>sL5~5ZfOpFBnl~ zsd$t-ol6q7HisT*kB9f)%&(NEXrhD|lMSXaTW%1>aP_Le2#ck-)#1QY11^I*qn!`+ z(+o!rRerPW>iwb;g=!lyPDZ%}HQWl=qj(oa4$Xi{PR_jyt#)wz(GQ@Z%Zl6n3NgI1 zR|6mETT=OE(Gr^cQoL}L_t)a}hb~w{>{4qu;^b_z^X+)+PM>17E!`NYVeEmLF9Xbw zYF?Ju$pDRi3PAg()&<=)S!PKQhx!Mgv2P)3%K)%9<`YLiRQ2ccEX*9)tb~^eyNm zT#$MGokkELocIS}KLfkNxdlMX;o%&Ix--bw$B?1>=W_z<PaT|7K=>Yl}f2vDW&Cg74(e8Ydve*7CKqIN+m@}>W0o&Y=$a#3 z=-o4CByX)>-C0NuVA5<(*JLbrc~MWM_Aoh>8yL{CI&H;YZMTAmt!4bKG5XzT3xKh6 zPatnXUw|&!%vFpXgCm6FPdvKUjU3~8IIZn+KHx&cTLw)0KjSrnL-_^JsZqR?J9Pdh z8?|-lUf!$VQEs9M-XFh;phOj?pyZw_N`yw6~)g-$fF z-aSxwv5t3qytCk~5k?*lg1v?A^*@7o^U%?}l&6^Y zLySG{Y?0T=V;k{|F?4wCG~i9dp!ni!$&^66QO+SDcqGNyl0J4NY628jV~nAbUj&lU z@y45|M{V#pig=*SYhHbb{p`GKf-wItCyMW#fv`9|*CWVKh&(M={c40Ahu~?!c{@+> zuJBk1dv6NiI-kAX*#lB8MZX%mcC&{;`$FFlHM+x#aWhvziZ_7x50jBM;y;Ei-T<=i z7Dh<2KjXs(eE66TzwX0t`tV0S{5i0AUugcXfW=!v_`Hul4J_UfveUm|91FcGgd@QF zaV!~*n}Ef8LH0PXXtch^eYoF;>D?2J_=h>BlUj`Pe8p!!?!%w>@DCi*{auXnpYhpk zA7=dbfSk(bnYwM0DE%F+$`IjuAMM?(=^T096)&}gsEO=T>1?06St}0WsqmUxmCYM^ z)Oo?UBAeVz>J{!!k`5KJl^|4{(wA`~Rn>gHDsFa{ zyg?{d_2e>xdODZ&>04GP*`eHCtsv}0CBC93m)fK0te7vPv-(b2)&`z(O9%HCc%2Wg zb?}zCH(6CvrKFl4ENJRbx}XmxGjqGQvZFtjE~X1uWg6NoTQ{{d6Tg(~O%JuSVq8qC zsZ6q1RQ0`iO-*Na<`g2%z3Kp6?zu8m-Bl{7d96^)Ws{k-zE>S;c4|NXrQrtLAqjPF zB_!bvjy1xl>rZn065%Lg<0P+TY&q^&;5x?Elf0g>S4raWd6y)Do+62Y{S8UPIS)zm zEJS^!IB}AQ^9D)8`Gh3m)T3NdoV!RO&T5i~6Ne=Kmk5LZ7D@0wB?;arN$|er_!p8W zV0HMe$uAB`e!ED*Zy!nc9VH3B*EoKUB>c`ml3yL_0QohNgx_kC@Y_fdevfhdBuV)F z3Mt{Y&I0tnV#az&-p1JTByY$5kX*vp2}t67K^Qzt$D~I0_ltyrOtnG6Z)K_%(j9o0 zNZ#qb?@|l^O={wPDCG1TLqd_JH%>wU#}rJ$o_2EC$K?P?AjouterEnfant(this); + + CalculerCoordonnees(); +} + +CDteHorizPassant1P::~CDteHorizPassant1P() +{ +} + +void CDteHorizPassant1P::CalculerCoordonnees() +{ + const Point *pp = p->Solution(); + + delete []choix; + choix = NULL; + + //Si le point n'est pas défini + //alors il n'y a pas de solutions + if (pp == NULL) + { + possibilites = 0; + CalculerDependants(); + return; + } + + possibilites = 1; + choix = new Droite[possibilites]; + choix[0] = Droite(0, 1, - pp->GetY()); + + CalculerDependants(); +} diff --git a/serveur/Contraintes/CDteHorizPassant1P.h b/serveur/Contraintes/CDteHorizPassant1P.h new file mode 100644 index 0000000..7cebd3d --- /dev/null +++ b/serveur/Contraintes/CDteHorizPassant1P.h @@ -0,0 +1,51 @@ +#ifndef __CDTEHORIZPASSANT1P__ +#define __CDTEHORIZPASSANT1P__ + +#include "CDroite.h" +#include "CPoint.h" + +//! Classe CDteHorizPassant1P. +/*! + Définit une droite horizontale passant par un points. Il y a toujours une seule solution. +*/ +class CDteHorizPassant1P : public CDroite +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit avec un point inconnu. Ne doit pas être utilisé. + */ + CDteHorizPassant1P(); + //! Constructeur. + /*! + Constructeur par copie. + param d : droite à copier. + */ + CDteHorizPassant1P(const CDteHorizPassant1P &d); + //! Constructeur. + /*! + Constructeur à partir d'un point. C'est celui qui devra être utilisé. + param p : point par lequel la droite passera. + */ + CDteHorizPassant1P(CPoint *p); + //! Destructeur. + /*! + Détruit les solutions possibles. + */ + ~CDteHorizPassant1P(); + + //! Fonction. + /*! + On recalcule les coordonnées du point. + */ + void CalculerCoordonnees(); + + private : + //! Donnée privée. + /*! + Point de la Droite. + */ + const CPoint *p; +}; + +#endif diff --git a/serveur/Contraintes/CDteHorizPassant1P.o b/serveur/Contraintes/CDteHorizPassant1P.o new file mode 100644 index 0000000000000000000000000000000000000000..7d166a131c494cc47dc31e9661ff986c747b96f0 GIT binary patch literal 5056 zcmcgvYit}>6+Yu#!xEg-O%_<_%V}D$8!~tu$8`V+H@lMuPQo^uiAtqtyk1Y@P1duk z-PzO$jcB#5>d_>sTY|9EfC36qB>W>kN);-8xNT6Hsy{3t@sM~F@lY!p6d*r>WOez@ z%)Oi0%{l=DT#@zhZGWNe46*H*6 z_{QKb@hYmmOH=dqnnsKNhVR(3?LY1rTB&FH*`+i7x1Z?6lQXqS`}@!PDX3M>$N;O_nOJSl%;IkxZQ9kR z9sN}G1{l}-ZOLZNQqg{0LS59jeQ>V4JWU^x1MrLcps2pc;15ewFD?sdQ zj1-{-jb5ZT&ptl3h-x*ZV|6=`+CE4+a3y(Q-CjBxum|LO)?LP{|3+K;`8IkXR3UmX z-2QTyeiVLyr+SAXj%tq;A50`|b7!HHJCVwi%Nfg#r`X^f%s}NtYBwoQM?U1SsUsYo zR=UvU%EdtSmgr+^BG0vLTiu?lhPJDno;?ZMh~#vl(ZsnIs&UkLR28+s&u+Do?bE1# zS;5`~{RPx}kqV@M!mMZ-gH`XKz9c!lw{m!#Yp9VnqOHJ&IQIE*bfW*Z+t_+S82_r(Xh zx{D>VWaiCG+3e}+PMV{+jOB4QZyM-92Fu4M?93?8F8MevTj-_Q=A=#PSjNtfI$AE1 zdN`Xk%*m`-v<=YnCaFw2Y*o~J&N^DKvZh*6jVJdXXt_jIAn$5TzSV2GHIYLw$Bjd! z%mf0m3bv^t6`RU-CVQ0BY++);v}|PWUoN~Kka`m9m-zeS9~%a;2yFM|58kV8N&y92&hmi{)P&HOv@csa6vEDNu&Ki*Tau#L-h)FAI7c)V_9 z;jy@ELk-U3##$mCgXh6Hkn<>`9rX7O{B=Mli=0ORilD#lb^h7F{&-C3?=0Fuf4_jg zk3lDkoX1rtg1l?sO-dtda@?Pw9UONE<30l&kNZ(nIqpx<4s@sS4?__s()N4kWSh;* z0VR)7zB4wDAgBc>xIgESwV%bWcN9D*3CXVLE!A|yFbLiODs?Q-=$qKLVUIr=`F|j`~ulRsw9V;9+OL9_Wq%&Q} z9yR%O>_4zK-fI}y$;r%U?pVAJ?Q+h@=JCC3*vE^ek+TjJG$ywGs)1pb9El9$@Z_XX zG)v`zmC5Jq>peU)P~2WfXZD&pJN#tOJl^Pa)1$=*J1?k1dw?zungY!8Nqv% z5xfOP{FnR{ka-^nc@@qbmLCDKp8+AKS^fl3h7tarVuZhGM)*6&2>u+9`(I@l{GT&| z&*vNSKVSrZ9nK5p-4A3vpI2>|+#aESLg-6E|Gdz@B=mDa&*xCveK_NBzO>y>)Wi4y z(c_F=`18iNp6G4H2XV&Z;$_|zM)0;XBAyY(4ag7ULqu;eK1}pmM)0pOg10Q>Rk$+Q zKSWYK?SJbi_(%kW6kJ-EGAVfQ-*p9-9sgfay76G_5&a$!{WkI)1^s7<9%96tHZfw1 nokD(G$ax{35;!ODhr+%fAjouterEnfant(this); + if (pp2 != NULL) + pp2->AjouterEnfant(this); + + CalculerCoordonnees(); +} + +CDteMediatrice2P::~CDteMediatrice2P() +{ +} + +void CDteMediatrice2P::CalculerCoordonnees() +{ + const Point *pp1 = p1->Solution(); + const Point *pp2 = p2->Solution(); + + delete []choix; + choix = NULL; + + //Si un des points n'est pas définie + //alors il n'y a pas de solutions + if (pp1 == NULL || pp2 == NULL) + { + possibilites = 0; + CalculerDependants(); + return; + } + + //si les deux points sont les mêmes + //alors il n'y a pas de solutions + if (fabs(pp1 - pp2) < EPSILON) + { + possibilites = 0; + CalculerDependants(); + return; + } + + //coordonnées du vecteur formé par les deux points + double vx = pp2->GetX() - pp1->GetX(); + double vy = pp2->GetY() - pp1->GetY(); + + //calcul des coordonnées du milieu des deux points + double mx = (pp1->GetX() + pp2->GetX())/2.0; + double my = (pp1->GetY() + pp2->GetY())/2.0; + + //on utilise directement le constructeur de Droite avec deux Point : + //le milieu et son translaté par le vecteur directeur + possibilites = 1; + choix = new Droite[possibilites]; + choix[0] = Droite(Point(mx,my), Point(mx + vy,my - vx)); + + CalculerDependants(); +} diff --git a/serveur/Contraintes/CDteMediatrice2P.h b/serveur/Contraintes/CDteMediatrice2P.h new file mode 100644 index 0000000..2abd88a --- /dev/null +++ b/serveur/Contraintes/CDteMediatrice2P.h @@ -0,0 +1,59 @@ +#ifndef __CDTEMEDIATRICE2P__ +#define __CDTEMEDIATRICE2P__ + +#include "CDroite.h" +#include "CPoint.h" + +//! Classe CDteMediatrice2P. +/*! + Définit une droite médiatrice de deux points. Si les deux points sont confondus il n'y a pas de solutions, sinon il y en a une et une seule. + Pour la construire il suffit de calculer le milieu de ces deux points. Ce point appartient à la droite. Ensuite il suffit de déterminer un vecteur directeur de la droite qui est tout simplement un vecteur orthogonal au vecteur formé par les deux points. Il ne reste plus qu'à faire une translation du point milieu par ce vecteur pour avoir un second point de la droite désirée. Le compte est bon. +*/ +class CDteMediatrice2P : public CDroite +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit avec des points inconnues. Ne doit pas être utilisé. + */ + CDteMediatrice2P(); + //! Constructeur. + /*! + Constructeur par copie. + param d : droite à copier. + */ + CDteMediatrice2P(const CDteMediatrice2P &d); + //! Constructeur. + /*! + Constructeur à partir de deux points. C'est celui qui devra être utilisé. + param p1 : premier point. + param p2 : deuxier point. + */ + CDteMediatrice2P(CPoint *p1, CPoint *p2); + //! Destructeur. + /*! + Détruit les solutions possibles. + */ + ~CDteMediatrice2P(); + + //! Fonction. + /*! + On recalcule les coordonnées de la droite. + */ + void CalculerCoordonnees(); + + private : + //! Donnée privée. + /*! + Premier Point de la Droite. + */ + const CPoint *p1; + + //! Donnée privée. + /*! + Deuxième Point de la Droite. + */ + const CPoint *p2; +}; + +#endif diff --git a/serveur/Contraintes/CDteMediatrice2P.o b/serveur/Contraintes/CDteMediatrice2P.o new file mode 100644 index 0000000000000000000000000000000000000000..fbc78deebfc7eb3ff3e6ca4f84b78a2ad9b1645e GIT binary patch literal 6040 zcmc&%eQZ`=|s0O@kHfTK$4)S`U&W})w9r8ch=H)X^^->uir z9sQrql%1}_UumTJs&>>B!u5rYK)y3jP~!#p&IPZZLyjNc^TX;WXVKI7F<16Ty|CuW z9GRxBeD;Xnq4t;672ES)tNH&gD=fTx$SRM{t30vUE8>|m)|^Ubq$qU@W^~t~$c{D$D_YpXRTerLvRAzYe}2+9V@#gC;wfxw zFwW-3Ej(;APjIj{(qPTcp5!pVWuM|m$DF!oPh&@lXf>QKbTr6k^2iNg&B`9RE=KN? zTCdbroSJJt^x!exf$VN9n>>5d8+pgOWPD(W_pLt^ePq9V?e|yyaXxI-Ox-y|KSIb& zxvq049^Z#VrS68-T{=l!vG1yzy1NRMx?i)IT{@a##Y z%!4DH$JE8b1gFbS$OMk_SCTe3NckBx?b6pSLLs-A&XETBUac>NCoh>-i+xAO!$%{< z@Wo5vE5*LC@$gt=Jp6*LaXrVFV>~lmZ=Bbo-?aaZn9?O;>elH3-;6KxPEzG;!I!* z>u2NHZ1;7FD6on=oA!0flcHeQgxeIW=Y4>O_HSO_vp(_DSzi<)U+eo(oj6wOo30hF z)cRhn6@QfDV|CO|)_oQ;+im>4Q!oDWmp}QE5<3)D1wNCyh1$BhEpv-Gkce67MBHqN z2q8ZrKrp@<*({91b+c@8z1KTtG-AxomOz&;uSe$8% zIQ%@>ht7BP!{`-pHV6H*kD<@O!(Ywb2-{2O8(^ORdZ}>DLDg^2FKbTdb`Iycj&9Wm zu@+d7$2L0;Km1?$5PLK1SMOk7iI@@C7hz+cLU3;<6gtoKSvE^BP+Hv1E?q~xq#)wWEC zVCK*PE7lLR(l+kXBX|WZbJP;SftVE&!TwA}1oy_{QFAnI4qH*shfEPnr))Fndy^x< zp+s_jDj7F}>0tE9?K`U+m0)%1#%k2tBlcFKF`~IIx+fhwfRvIc%M79zt1?zBzF!36 zsRIYhq=h>DhmB7N$}iLz7Ofb6w|2%^?l;8GpnqaUEndJ~-Htt-3myH*t3!W4$=FWW zCLOV;(D7DaO#Vmln!#awOeGuR9a3WgZEQR?PF@7Td0cekTx?s>oxI&J$bSW-)y|2- zP3X?`PJUVl=EC)INqW7^#ToA~;?+Z^n_lk-6wY|!Ui&@5c+~57FJkPBH->ogpwo>u zwqK(=dB?yztc|egc`sn>oHu}ZzXl!WWuAK8-(l=<7lFH=a5Qau7dkzrnLNH1bkjD* z*LzFbOlYp8>)O$;F`yA{W9Phz+Hahd;K5`AtcpEUm7KcK|1FfPt^7viMu0qS=v`Ohmmf&3HbgXlWmX^i!qL;l;4btC^hbbaU0 zeisU??-q?-JU73|ZeDl+U~P@3`c@xa9X;@?6JZ zV}6TW@*0=?d6&G&CHJ}HgD!c@C4WcBeD)UNe4KRI&$;9&m)xL^DBlSSah_HgrCX5|*jts`p&g0HL*A zv7z|LkeTjErP2ebWYRP6|bIoJ@gQgW){m5Wy#4^+2#?Mo#xi8Oo@ z%%evi!cbc{c`$XzOzS#iQ2yRje7|Xdw|(cMFwP{R@u65I6SWQv zo6$saPby4ewNERkH|lvrG`e?mG&*diGpS^3C}ACn9&Ev;GA`aD^yB-D*hPfj6GZq865;nWko<2b{SS!v_j>!M!X;2Q3}6D#K-0-Vxtg$A}+*tCoXscAD>Hsl-Cj$39&`t z0C6$usqouMe?sBUfb>7F>=zYYQ~Kq&vTK$I@f;DC=X`LP$2ubN*h$2?zeQXs#LEhQ zPW+q@za=)|+l2@}AFg=f1H@&BqwvcLGep)=$>T(<3+V`Bx&3`<;Bw~s-?-1dgAMEh zKBt9&k78_%FjnG+xJvm2mEVK*cahO71ePQW)EpGSf0s8X`Eex=DfycUUsiZZ*(a6! WmXdEMxq;^eaa$E`SJ+3yJpTq6$eeQk literal 0 HcmV?d00001 diff --git a/serveur/Contraintes/CDteParall1D.cpp b/serveur/Contraintes/CDteParall1D.cpp new file mode 100644 index 0000000..329c477 --- /dev/null +++ b/serveur/Contraintes/CDteParall1D.cpp @@ -0,0 +1,109 @@ +#include "CDteParall1D.h" + +#include "../Formes/Droite.h" +#include "../Formes/Point.h" + +#include "math.h" + +CDteParall1D::CDteParall1D() +:dist(0),d(NULL) +{ + CalculerCoordonnees(); +} + +CDteParall1D::CDteParall1D(const CDteParall1D &cd) +:CDroite(cd),dist(cd.dist),d(cd.d) +{} + +CDteParall1D::CDteParall1D(CDroite *dd, const double &dist) +:dist(dist),d(dd) +{ + //on signale à dd que cette droite a été construite par contraintes sur elle. + if (dd != NULL) + dd->AjouterEnfant(this); + + CalculerCoordonnees(); +} + +CDteParall1D::~CDteParall1D() +{ +} + +void CDteParall1D::CalculerCoordonnees() +{ + const Droite *dd = d->Solution(); + + delete []choix; + choix = NULL; + + //Si lla droite n'est pas définie + //alors il n'y a pas de solutions + if (dd == NULL) + { + possibilites = 0; + CalculerDependants(); + return; + } + + //cas de la distance nulle : il y a une solution et c'est la droite elle même + if (fabs(dist) < EPSILON) + { + possibilites = 1; + choix = new Droite[possibilites]; + choix[0] = Droite(*dd); + CalculerDependants(); + return; + } + //on va récupérer deux points de la droite originale. Pour cela on récupère les coefficients + //de l'équation cartésienne. Au cas ou a ou b est nul c'est facile vu qu'il s'agit d'une droite + //horizontale ou verticale. Sinon il suffit de résoudre a*0+by+c=0 et ax+b*0+c pour avoir deux + //points appartenant à la droite. + //ensuite on calcule un vecteur normal que l'on va normaliser (c'est à dire rendre sa norme à 1) + //puis translater les deux points précédemment récupérés d'un vecteur +- distance * vecteur normal + possibilites = 2; + choix = new Droite[possibilites]; + + //recherche des deux points + Point p1, p2; + + double aa = dd->A(); + double bb = dd->B(); + double cc = dd->C(); + + //cas d'une droite horizontale + if (fabs(aa) < EPSILON) + { + p1 = Point(0,-cc/bb); + p2 = Point(1,-cc/bb); + } + //cas d'une droite verticale + else if (fabs(bb) < EPSILON) + { + p1 = Point(-cc/aa,0); + p2 = Point(-cc/aa,1); + } + //droite quelconque + else + { + //dans ce cas on prend le point dont le x est égal à 0 + //et son translaté par le vecteur directeur + p1 = Point(0,-cc/bb); + //on ne prend pas ce cas car si la droite passe par + //(0,0) on aura deux fois le même point + //p2 = Point(-cc/aa,0); + p2 = Point(-bb,p1.GetY()+aa); + + } + + //calcul de la norme du vecteur normal + //p as besoin : on a normalisé les coordonnées + //double norme = sqrt(aa*aa+bb*bb); + + //on construit les deux solutions. +/* choix[0] = Droite(Point(p1.GetX() + aa*dist/norme, p1.GetY() + bb*dist/norme),Point(p2.GetX() + aa*dist/norme, p2.GetY() + bb*dist/norme)); + choix[1] = Droite(Point(p1.GetX() - aa*dist/norme, p1.GetY() - bb*dist/norme),Point(p2.GetX() - aa*dist/norme, p2.GetY() - bb*dist/norme));*/ + choix[0] = Droite(Point(p1.GetX() + aa*dist, p1.GetY() + bb*dist),Point(p2.GetX() + aa*dist, p2.GetY() + bb*dist)); + choix[1] = Droite(Point(p1.GetX() - aa*dist, p1.GetY() - bb*dist),Point(p2.GetX() - aa*dist, p2.GetY() - bb*dist)); + + CalculerDependants(); +} diff --git a/serveur/Contraintes/CDteParall1D.h b/serveur/Contraintes/CDteParall1D.h new file mode 100644 index 0000000..c723d41 --- /dev/null +++ b/serveur/Contraintes/CDteParall1D.h @@ -0,0 +1,60 @@ +#ifndef __CDTEPARALL1D__ +#define __CDTEPARALL1D__ + +#include "CDroite.h" +#include "CPoint.h" + +//! Classe CDteParall1D. +/*! + Définit une droite parallèle à une autre droite se trouvant à une distance d de celle ci. Il y a une seule solution au cas où la distance est nulle et deux solutions sinon. + Pour la construire on va récupérer deux points de la droite originale. Pour cela on récupère les coefficients de l'équation cartésienne. Au cas ou a ou b est nul c'est facile vu qu'il s'agit d'une droite horizontale ou verticale. Sinon il suffit de résoudre a*0+by+c=0 et ax+b*0+c pour avoir deux points appartenant à la droite. + Ensuite on calcule un vecteur normal que l'on va normaliser (c'est à dire rendre sa norme à 1) puis translater les deux points précédemment récupérés d'un vecteur +- distance * vecteur normal +*/ +class CDteParall1D : public CDroite +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit avec un point inconnu. Ne doit pas être utilisé. + */ + CDteParall1D(); + //! Constructeur. + /*! + Constructeur par copie. + param d : droite à copier. + */ + CDteParall1D(const CDteParall1D &d); + //! Constructeur. + /*! + Constructeur à partir d'une droite. C'est celui qui devra être utilisé. + param d : droite à laquelle la droite doit être parallèle. + param dist : distance entre les deux droites. + */ + CDteParall1D(CDroite *d, const double &dist); + //! Destructeur. + /*! + Détruit les solutions possibles. + */ + ~CDteParall1D(); + + //! Fonction. + /*! + On recalcule les coordonnées du point. + */ + void CalculerCoordonnees(); + + private : + //! Donnée privée. + /*! + Droite perpendiculaire à cette droite. + */ + const CDroite *d; + + //! Donnée privée. + /*! + Distance entre les droites parallèles. + */ + const double dist; +}; + +#endif diff --git a/serveur/Contraintes/CDteParall1D.o b/serveur/Contraintes/CDteParall1D.o new file mode 100644 index 0000000000000000000000000000000000000000..06d39e84f4820c716d18056e64e5a3472e3206bc GIT binary patch literal 8816 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 + //on signale à pp que cette droite a été construite par contraintes sur elle. + if (pp != NULL) + pp->AjouterEnfant(this); + + CalculerCoordonnees(); +} + +CDteParall1DPassant1P::~CDteParall1DPassant1P() +{ +} + +void CDteParall1DPassant1P::CalculerCoordonnees() +{ + const Droite *dd = d->Solution(); + const Point *pp = p->Solution(); + + delete []choix; + choix = NULL; + + //Si la droite ou le point n'est pas défini + //alors il n'y a pas de solutions + if ((dd == NULL) || (dd == NULL)) + { + possibilites = 0; + CalculerDependants(); + return; + } + + possibilites = 1; + choix = new Droite[possibilites]; + + //on construit la solution. + choix[0] = Droite(Point(pp->GetX(), pp->GetY()),Point(pp->GetX() - dd->B(), pp->GetY() + dd->A())); + + CalculerDependants(); +} diff --git a/serveur/Contraintes/CDteParall1DPassant1P.h b/serveur/Contraintes/CDteParall1DPassant1P.h new file mode 100644 index 0000000..b85cd27 --- /dev/null +++ b/serveur/Contraintes/CDteParall1DPassant1P.h @@ -0,0 +1,60 @@ +#ifndef __CDteParall1DPassant1P__ +#define __CDteParall1DPassant1P__ + +#include "CDroite.h" +#include "CPoint.h" + +//! Classe CDteParall1DPassant1P. +/*! + Définit une droite parallèle à une autre droite passant par un point donné. Il y a une seule solution dans tous les cas. + Pour la construire il suffit de trouver un vecteur directeur de la droite d'origine et de déduire le translaté du point donné par ce vecteur et ces deux points peuvent servir à construire la droite voulue. +*/ +class CDteParall1DPassant1P : public CDroite +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit avec un point inconnu. Ne doit pas être utilisé. + */ + CDteParall1DPassant1P(); + //! Constructeur. + /*! + Constructeur par copie. + param d : droite à copier. + */ + CDteParall1DPassant1P(const CDteParall1DPassant1P &d); + //! Constructeur. + /*! + Constructeur à partir d'une droite et d'un point. C'est celui qui devra être utilisé. + param d : droite à laquelle la droite doit être parallèle. + param p : point appartenant à la droite que l'on veut. + */ + CDteParall1DPassant1P(CDroite *d, CPoint *p); + //! Destructeur. + /*! + Détruit les solutions possibles. + */ + ~CDteParall1DPassant1P(); + + //! Fonction. + /*! + On recalcule les coordonnées du point. + */ + void CalculerCoordonnees(); + + private : + //! Donnée privée. + /*! + Droite perpendiculaire à cette droite. + */ + const CDroite *d; + + //! Donnée privée. + /*! + Point par lequel devra passer cette droite. + */ + const CPoint *p; + +}; + +#endif diff --git a/serveur/Contraintes/CDteParall1DPassant1P.o b/serveur/Contraintes/CDteParall1DPassant1P.o new file mode 100644 index 0000000000000000000000000000000000000000..86b8cb0bdc942fc80909756f584b50851a09492c GIT binary patch literal 5932 zcmc&%eQZ$=vMHO;yx+O+ zUg!BGrc*U-SHACe&pE$y?!D*U_wMzp>b~6$hl9!DU@o>IF*bR>X=&%s%pPVBvVP-F z(c+@Jxag}CytnUGDwX18e_8cjVP3GPv9porytRQ^wbX@8hPqrHSgzF?Lb1#vmIv;B zaB1d$+Ea1Si(jR%_N@B7Wz|>S*=Te%mPLDm(Y4`&OBmzl_qH>Cy5FG|TeNK=HP_>^H7DE;z2f_pz(o z6L7p|yf8_&{>jcrKo1m0CmZ=}CuN+4Pt4G!cSNe;b7g0MzlSH5nBGvtv+y|Ay1BMy zr+oT%r+9VUlvdCT^`wmJHcI1o-^={zxZvW5;T12qtKAu;<3yRIXYr!jnAN#x`cd16 z+%1=Qqm<<)dK$ASYV&~IMrjyA@jN{%1<$9~%uH6!5=Ty}SR$#hGEJ<7YewlXuslmo zV|ED7;&}?p^uuP5QBN9?0RM#e_`7{a1oq9Jittc)*_Wj5Mu~Lu z18+~OZ%6PEt`sEQJAbO1)1i}e?~OC0n;)2)R_7wq>N&YcK5Ao-whjkorqvmH*nz2O zbqda}N#{mtPpj`+!|0=zcR73y-3It9oIzPqoWhpB44OGpqWk z&QbXArKskd_qjqLqvZ^vLx(Z!1K&CiV>>)uECyUdUPtzCY)P}S!z8RyZ2RIZygu_z z&yth9?*0yAzwopyG_YG9&pQq5A0AJ!ft_if_9qP<=x6WyGQEoTEOffc(iRMbbuALl z#Z#$ZI1~tZugX<32mxWlBoRU-?iRba(1orgp01- zil5uVu#HHL9}OFaj`U&F>!{D6*2LMT_{lznx*iEw%iaXr9BMc0vp_c~Y<-aGH>fuy zC%BqJ{oFy-@xkf@){LXq9ETtNKfi~)753Y8>~!aez`n`F*soFDT~Nqz?kT!@6u)b$ zQ}JaK@2KJ%QM^&5aS%CVdqSb-nwt0Q@88_CO=(x!o7!4i+k^ z26{?k3ek?H3rZ@PK9)%*G$p6RUhX?kZ@bjt_tfRDjvcMbrLkzku_L+oC`Ojf=$e9@ zwB+@8;uupBnbA=#ts|xXX`wd+%fZB+X0$#xrGPeHf8du;zkn*sp#WoEtTAn6@+Y1b z^=TnvX?Y3UCmI4|yseOl|5?0Na40^y;)UW(h&BP)sO(0y@@Bx}*JN%r`=TaoH|sox z9$}37pn1@=jdu?5OAOF zw(_omH%SUnWWOIlw)T4({hox5`h5UZ_Im?ui#zMHI$3OsmNuH4NAJHZGR8wt$TcI| zG~)eDl7Ny&DA$b4ed~~CIFdi*k;X@3rQulPO+xuQi$cZ&t)^J@ZuXao)mZy)i{e`X zg6QJCuXwl^&KpZ{Ro@0v>EbK7LU1wh2TrJ5JmXe7CTl4!ww}K~QbqILB7`LHVPvgG z8i8a#C}i5h8!?^&P<}Is|5ITnApSe3@_ZrtZy{etrL%(MWuPp?e*g)TX9?L`Aj`9Z zdZSs$WOy7)+ z*nekj_KP-|t$CGE64@+^^`~D+riWs^TE2ioB=++DI;TyjO&ufiv!QSZ%m zzPi`2>Z(2)8qOs1$s7VCX+qW91v}LASY|@Y$sFd@NJli2IHu8_=sU1K*cyu^#>eA> z$+2J?+WBNGk;31Im_Cu!V#)N8j7r41w>#K+frI|v_V?0Lc`82ce1F1tS?Y%=c{&W*T( z;UePPgu4^rllX4qDnPszLh!FG3!}f^-9mmz$SEQJK;UVCXNCQ$ XkpCd$B_RiB{SmiaV4uJNLiF=*N9|l} literal 0 HcmV?d00001 diff --git a/serveur/Contraintes/CDtePassant2P.cpp b/serveur/Contraintes/CDtePassant2P.cpp new file mode 100644 index 0000000..2ec3052 --- /dev/null +++ b/serveur/Contraintes/CDtePassant2P.cpp @@ -0,0 +1,64 @@ +#include "CDtePassant2P.h" + +#include "../Formes/Droite.h" +#include "../Formes/Point.h" +#include "math.h" + +CDtePassant2P::CDtePassant2P() +:p1(NULL),p2(NULL) +{ + CalculerCoordonnees(); +} + +CDtePassant2P::CDtePassant2P(const CDtePassant2P &cd) +:CDroite(cd),p1(cd.p1),p2(cd.p2) +{} + +CDtePassant2P::CDtePassant2P(CPoint *pp1, CPoint *pp2) +:p1(pp1),p2(pp2) +{ + //on signale à pp1 et pp2 que cette droite a été construit par contraintes sur eux. + if (pp1 != NULL) + pp1->AjouterEnfant(this); + if (pp2 != NULL) + pp2->AjouterEnfant(this); + + CalculerCoordonnees(); +} + +CDtePassant2P::~CDtePassant2P() +{ +} + +void CDtePassant2P::CalculerCoordonnees() +{ + const Point *pp1 = p1->Solution(); + const Point *pp2 = p2->Solution(); + + delete []choix; + choix = NULL; + + //Si un des points n'est pas définie + //alors il n'y a pas de solutions + if (pp1 == NULL || pp2 == NULL) + { + possibilites = 0; + CalculerDependants(); + return; + } + + //si les deux point sont les mêmes il y a une infinité de solutions + if (fabs(pp1->GetX() - pp2->GetX()) < EPSILON && fabs(pp1->GetY() - pp2->GetY()) < EPSILON) + { + possibilites = -1; + CalculerDependants(); + return; + } + + //on utilise directement le constructeur de Droite avec deux Point + possibilites = 1; + choix = new Droite[possibilites]; + choix[0] = Droite(*pp1, *pp2); + + CalculerDependants(); +} diff --git a/serveur/Contraintes/CDtePassant2P.h b/serveur/Contraintes/CDtePassant2P.h new file mode 100644 index 0000000..03af0ca --- /dev/null +++ b/serveur/Contraintes/CDtePassant2P.h @@ -0,0 +1,58 @@ +#ifndef __CDTEPASSANT2P__ +#define __CDTEPASSANT2P__ + +#include "CDroite.h" +#include "CPoint.h" + +//! Classe CDtePassant2P. +/*! + Définit une droite passant par deux points. Si les deux points sont confondus il n'y a pas de solutions, sinon il y en a une et une seule. +*/ +class CDtePassant2P : public CDroite +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit avec des points inconnues. Ne doit pas être utilisé. + */ + CDtePassant2P(); + //! Constructeur. + /*! + Constructeur par copie. + param d : droite à copier. + */ + CDtePassant2P(const CDtePassant2P &d); + //! Constructeur. + /*! + Constructeur à partir de deux points. C'est celui qui devra être utilisé. + param p1 : premier point. + param p2 : deuxier point. + */ + CDtePassant2P(CPoint *p1, CPoint *p2); + //! Destructeur. + /*! + Détruit les solutions possibles. + */ + ~CDtePassant2P(); + + //! Fonction. + /*! + On recalcule les coordonnées de la droite. + */ + void CalculerCoordonnees(); + + private : + //! Donnée privée. + /*! + Premier Point de la Droite. + */ + const CPoint *p1; + + //! Donnée privée. + /*! + Deuxième Point de la Droite. + */ + const CPoint *p2; +}; + +#endif diff --git a/serveur/Contraintes/CDtePassant2P.o b/serveur/Contraintes/CDtePassant2P.o new file mode 100644 index 0000000000000000000000000000000000000000..948dc745ae3a147dc7492b572f79a28a5e5b8445 GIT binary patch literal 5332 zcmc&%Z)_aJ6`%E;Q&)Aug}Uvj7 z_hx78y*&piRJ9|IfAik^y*F>(&hE@Tr|o}2Q4}Vd!UAknVyx?{uBC%R3;Q|?v4nlC zzjPy5y3trEHeA15sZ>gHAxCR?k2QcrgRU^q`KXyj)zrn!wsy-Iyj88Wh2j>E=nUTe z;Npq@=}e^?4fv}R*Irek!OuCU!5cEq^Z?r#3zB69rlo}X7oK8u_#gtiB4Bj>3Yx!*_V{_%B6Sa15R&~@{WCA zj%v^)JdGM6I0IM6rXBV8f>AM;tC|` zXlLwr6aSXr6SPz*F2AU~FP9dkF_vG+HOT;rTPR5$#X}5L$HkmpBTr$a%={zESf!#g zuE+E2tnX$za1D7q+4pQWnWMOb8pS=KYjuqMCQyGNz+Mk-VeCq<{<9!^q5eCxQP_(& z-#q=#ch7#03wQWOr-y9O_E?W)#FK?W(zM#*j2|d4DnE|zXUb0-*15#SV6d!2Fs4o| zjn4P=;~N@YsOw%|-%|=ap@z7<2ewhk31Q&l&`~vlei{7{^r|@f)ezas=o_#n*Rn@o zn?-*T_Fn;mr0~r_st?hxN=~$vL-Q=5TPWymU{xM{ZXO}{zwtTtR@krK!QO(Hao9Hp z7&`+_up0_bp1o=)@MxVH##D^$jl~{`wCp{Y*cNG5JJgOyTWf1av@O~hY02e{ypb`I z1!G&JrNWlUI19Zp(FrVbSfOg)-P>BdCL z$XPn*8H1_$tZOFvQM0IK(&n+OnKIP8sy{n$$iGF@wRycYyxLg(H5`g%jOa)5$uVSN zW-UWS4R#c)Wa=1GQ`xaG!?aMg|FqFtfRZz@ZyDXE{)kseHvWtu+=DKzT-@}~-Hgq{ zaU&%1Ctd^kcZG~c$Xiebma@PHfyDnJUMn~hAKQU9ikB2)0Wd4fJgCVljDO> zczHSS_*GC4CGRQ7-t{)(sG?kGy>mA3~8*d8n8ljU-)-Ml*H{N52N8b*LM|v6W z6^y;{P9Yw4`${7lwF~H8-Yj?%(g>TJ_ic>5^A2F%pFv0SQl4^NdiOo7fbWb|MWCwk6z^-RMvMYgJB8#8 zKKotxU9;M#4x5FT2HuS-dTUSiUSX#_y$SgY0_FFV_;j_9jrcF4%d>~=+7SXog%R|ZJg8($9nSFv}Fjn_T;K{jqZ*m zGpS<6$j7qT{BYJZ4Wm#Utw%)nPa1V;es!DHx36FKr6W~-a&(34x3p>TU9osJZCd?N z9&P8-L!*WjZGU_;TeOV4W*)(XO^drz`MsllZy!OdX*d(-h4Wk2URqD9yW)K!vCjT% zrf8+JrmNoN7Qe@J9!|QUMcSRR%socVFo%)4sPev@e32b{4eR?N{Ho?K*OQD;2WoC6i00$pDNiuZ)Rnsqo2z716H;?Os-4hPWFgg8ikNQlE^f)Kptfy8@_Wboc1 z1n>8R;C)K?4fn1~y!-HtAbC5G!U3gx@V7 zkBfJi{B{bA5yI~hZX5=Yw9S&gyM_n_pZVO{O1U@SCKOh-?za+dLaR_k{+=}Cp z;_o3u{5T=jV-jw~J%sQ9oI!-(%?kT(g?xb!aS@IwE$)3z!NEq~R^?vzUZ9{}xY96X zn|q&9wnHEp7fkN=knr2#-YFE7F{H>8)CMX>KO3JE@-srt2zg528G&yK`z0ZNB;;iw TH_>xN+zx?s){#6&hAjouterEnfant(this); + //on signale à dd que cette droite a été construite par contraintes sur eux. + if (dd != NULL) + dd->AjouterEnfant(this); + + CalculerCoordonnees(); +} + +CDtePerp1DPassant1P::~CDtePerp1DPassant1P() +{ +} + +void CDtePerp1DPassant1P::CalculerCoordonnees() +{ + const Point *pp = p->Solution(); + const Droite *dd = d->Solution(); + + delete []choix; + choix = NULL; + + //Si le point ou la droite n'est pas défini + //alors il n'y a pas de solutions + if ((dd == NULL) || (pp == NULL)) + { + possibilites = 0; + CalculerDependants(); + return; + } + + //avec l'équation cartésienne ax+by+c=0 de la droite on extrait un vecteur normal + //de coordonnées (a,b) : pour construire la droite il suffit de la construire à + //partir du point par lequel elle est censée passer et à partir du point qui est + //le translaté du point précédent par le vecteur + possibilites = 1; + choix = new Droite[possibilites]; + choix[0] = Droite(Point(pp->GetX(), pp->GetY()),Point(pp->GetX()+dd->A(), pp->GetY()+dd->B())); + + CalculerDependants(); +} diff --git a/serveur/Contraintes/CDtePerp1DPassant1P.h b/serveur/Contraintes/CDtePerp1DPassant1P.h new file mode 100644 index 0000000..82ad290 --- /dev/null +++ b/serveur/Contraintes/CDtePerp1DPassant1P.h @@ -0,0 +1,58 @@ +#ifndef __CDTEPERP1DPASSANT1P__ +#define __CDTEPERP1DPASSANT1P__ + +#include "CDroite.h" +#include "CPoint.h" + +//! Classe CDtePerp1DPassant1P. +/*! + Définit une droite perpendiculaire à une autre droite passant par un points. Il y a toujours une seule solution. +*/ +class CDtePerp1DPassant1P : public CDroite +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit avec un point inconnu. Ne doit pas être utilisé. + */ + CDtePerp1DPassant1P(); + //! Constructeur. + /*! + Constructeur par copie. + param d : droite à copier. + */ + CDtePerp1DPassant1P(const CDtePerp1DPassant1P &d); + //! Constructeur. + /*! + Constructeur à partir d'un point. C'est celui qui devra être utilisé. + param d : droite à laquelle la droite doit être perpendiculaire. + param p : point par lequel la droite passera. + */ + CDtePerp1DPassant1P(CDroite *d, CPoint *p); + //! Destructeur. + /*! + Détruit les solutions possibles. + */ + ~CDtePerp1DPassant1P(); + + //! Fonction. + /*! + On recalcule les coordonnées du point. + */ + void CalculerCoordonnees(); + + private : + //! Donnée privée. + /*! + Point de la Droite. + */ + const CPoint *p; + + //! Donnée privée. + /*! + Droite perpendiculaire à cette droite. + */ + const CDroite *d; +}; + +#endif diff --git a/serveur/Contraintes/CDtePerp1DPassant1P.o b/serveur/Contraintes/CDtePerp1DPassant1P.o new file mode 100644 index 0000000000000000000000000000000000000000..51bb37fde382c7534c0f6b1d63f2b17df7b3201e GIT binary patch literal 5896 zcmc&%e{5Sv9lsabnc3XV8x{+r+tQXn+LE_8O|xYGkj8%fL9))oNyR22*KuAOr;cse z&m}=AEpja7VIoCHLGVYJ1`{gM$|j(q11fcE(K^H*RaG&NmTHrLc1k3Ih)_Wl=JUOG z=RChS9hwlFa{k=+`~7^sclW(}cb8LI|2{=gm@Eo&u{DXY>H9592Zt8+Fnf>U!~x^eYaAn6tDQpn)fZ{1&bOzO+@FdE!3)|E^RZlJLTa!wOUgs?(m4^;k$2N zp8ucrR9yDruTrQ#t08Y$^Obv=%-*K5Xm2rlx4eBBWBllz_sS#n;;(jxzKSRP%y@{8 z5ySM$%ok7kY-(RsU9&v@wVeO|Mumx2H(Bl0xj;L%_#T_NWNfarSbOM0JsUo`q zfbxd<>#a-KMHTE!AcO_e!fEnPQDM}Xx8 z`ZX6u@mst|fthi{in@yjHA`P68vmsUkVN@iAg=PJxj>5IIr?p~SlxV-#-l<>DL+qU zIgX{@mw9(4@49@32Ea+vHj=rfCOh{nTba>Ln~?xNLVWz&UKN3Ti)SJ{6h8J9se89X zy2atw=Cs!$ID{(&N%tvNC|NPE0D=QXZonrULZ{hP< zZ1Ai$u$SClW9(H=>rx}T(F6U$eNWJ*c+Wz&t1Q9pP}tBT zdM+CbN8JZ%IcF!GBRsC+fj&y;CzqvhapyJwYVw5d`_qVkV_?`ChQp?8xfTy*VI z{oEdgZCrBvXgD}@rH`TBKz#Vd=GmY?6)_t)0-y(`!*M2ze08QLLtYwzvw!s`dzyk zR9{B*PN=?d)f-itMvz0cKNNbVxn=*Mp&iY;)eg0zxxKBeBiJ77YHrEq^qij3<9U5Y zb4yqsNygKhv%9r(2V-h}YQl(*0F9i5W3mM=)zBvmrjEvqI8#URd8QsqBx3qxLeCm8 z&{H~7iFPbqP*chD@k~0Qt2s6H!r|Ze;BU~9Ey*wc%gVxqD??HD*I6Fym|2W^O#$$zNkst%s!8v zPcTM(&^&0`avqdHd%RZ=&j+0>avoVI?D4XQN9P2^qxs2r-$UCT?*ih1S}k%O^j+F{ z*T9>RM%ZM(SJAfjJBwhap`(5uK$ZRe4sDw|8?-ywY=5@3(d0b(?q!iN9)d!y8QJC# z?=O-BlsrPYW@PT)ggnEM{3(w#J{l_x#~yDQ%3sDE)+c8;Nak0(plQx;=-6G^9@L^<4bJ&N3 zOnZ1M#*+ccvy%8PI{2?bmiG$TX&>D{r8|P;WuPq7KP61wA!L6736*yS$^Etj6F&)A z-WO#5He`7>ko;2z{}+(u-9YwtAj`XeUke_$RF^8OX$fq6h zyhHxJL;i_F{5x|(^1p;kdw(lVh9=vVr1`22`LIJiC1g4?wqpN%*J1ymLuPfJ zFlr*3WwD|3SCZ+`*npld-~x%gaH#G*6KdB^kn!nIIG0Hpx{x=z?KTR7*zr`NkkWIZ zOeQy)NvCx^UmH0rda6H+phd24Y}W?*qA|xXrK-M5uRLV>8p|Z} z$sF91G@U+~qF|?%K9QNyb25c_Ez%jyB#!H}69x|-3bw^!iOI?MNb*Fm9qoKFmPp~> zgqSgv)nm!@(TqmK4c>3C9F$$LSnSy3WGt)a@|kozl{BVeC)#i>;~Q_l&!a%)LF@h9 zfJ5Rr(&GX>LWqN8k`TNZAn|@cGI*~Og7+Ij@cu}M_u2}Oc#q@kC3z>1 zLVrc*=}aa4--MpdP>MrmC+Ry0A7ktbgpV`!EkZnKe?-{K*gJ$*) ziVA_`r-Wad@C(xY4}Cjh7&23kL%1;d*ZP2vzbNFCkiRML6@ll4{hE;fAmmjc2Wb5f Nw?p8dz+po4^KWX#PY?hA literal 0 HcmV?d00001 diff --git a/serveur/Contraintes/CDteVertPassant1P.cpp b/serveur/Contraintes/CDteVertPassant1P.cpp new file mode 100644 index 0000000..53de45b --- /dev/null +++ b/serveur/Contraintes/CDteVertPassant1P.cpp @@ -0,0 +1,52 @@ +#include "CDteVertPassant1P.h" + +#include "../Formes/Droite.h" +#include "../Formes/Point.h" +#include "stdlib.h" + +CDteVertPassant1P::CDteVertPassant1P() +:p(NULL) +{ + CalculerCoordonnees(); +} + +CDteVertPassant1P::CDteVertPassant1P(const CDteVertPassant1P &cd) +:CDroite(cd),p(cd.p) +{} + +CDteVertPassant1P::CDteVertPassant1P(CPoint *pp) +:p(pp) +{ + //on signale ? pp que cette droite a ?t? construit par contraintes sur eux. + if (pp != NULL) + pp->AjouterEnfant(this); + + CalculerCoordonnees(); +} + +CDteVertPassant1P::~CDteVertPassant1P() +{ +} + +void CDteVertPassant1P::CalculerCoordonnees() +{ + const Point *pp = p->Solution(); + + delete []choix; + choix = NULL; + + //Si le point n'est pas d?fini + //alors il n'y a pas de solutions + if (pp == NULL) + { + possibilites = 0; + CalculerDependants(); + return; + } + + possibilites = 1; + choix = new Droite[possibilites]; + choix[0] = Droite(1, 0, - pp->GetX()); + + CalculerDependants(); +} diff --git a/serveur/Contraintes/CDteVertPassant1P.h b/serveur/Contraintes/CDteVertPassant1P.h new file mode 100644 index 0000000..3c73b7a --- /dev/null +++ b/serveur/Contraintes/CDteVertPassant1P.h @@ -0,0 +1,51 @@ +#ifndef __CDteVertPassant1P__ +#define __CDteVertPassant1P__ + +#include "CDroite.h" +#include "CPoint.h" + +//! Classe CDteVertPassant1P. +/*! + Définit une droite verticale passant par un points. Il y a toujours une seule solution. +*/ +class CDteVertPassant1P : public CDroite +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit avec un point inconnu. Ne doit pas être utilisé. + */ + CDteVertPassant1P(); + //! Constructeur. + /*! + Constructeur par copie. + param d : droite à copier. + */ + CDteVertPassant1P(const CDteVertPassant1P &d); + //! Constructeur. + /*! + Constructeur à partir d'un point. C'est celui qui devra être utilisé. + param p : point par lequel la droite passera. + */ + CDteVertPassant1P(CPoint *p); + //! Destructeur. + /*! + Détruit les solutions possibles. + */ + ~CDteVertPassant1P(); + + //! Fonction. + /*! + On recalcule les coordonnées du point. + */ + void CalculerCoordonnees(); + + private : + //! Donnée privée. + /*! + Point de la Droite. + */ + const CPoint *p; +}; + +#endif diff --git a/serveur/Contraintes/CDteVertPassant1P.o b/serveur/Contraintes/CDteVertPassant1P.o new file mode 100644 index 0000000000000000000000000000000000000000..097363f2797ed6ef42590737f029e688cf5a4b75 GIT binary patch literal 5032 zcmcgvU2GKB6+Yu#w=OZnfYq#;kSzIW?IcXS#yF;`TElwyk%2BOgHR+itk(l9tY=rd zv&2L}NwkjQ(O|_*9o1?Ri3h6kV5vN$5s4DXA*cx`4}NPa^~aIgD#&g{Tcq-U*nVf` zUNbwaLtC}I^4;&AbH01-IcM(NJAP5ywM|hJl1-rq-I0jKTYO882OYGA?kC;(W4gK+ ztuD6KDlMPis?}=M%WbaK@-Z=)2mLXo*Ao^Vb+nuAp_}zuM<{N3e%wR1u6#84fAC*j zY{6fx(l`UX#noEf{+P2hcI6{P^Y5|0s5YKwxUHUUC403O0!JZ>SYMm}TE+f%t0IG? z2VWojMczf#c^aFwSJhkmCw$MDP5<%C$Z|8&FE38{`w~IdiZNMsN4o(pGVy`XHJ<_=02Q{xI5dG51rjJY}02pr`qlI>c~vY%WOvaS@;a{((IH}L-TQe zyZ1(%zCo3Bo*eb$x>xAh+o+juKJsH2^AwX@1>L_3Rks-F)zg!;O7pc>{SwqFQ!>D+HWjPwo?Q5yqm8@z zxTBw`o}MQA+nD#1HtA?%t~SOCk8vUNY2}imk5xy;Vo-0^rnwShekI1F$Av$*`WZ(b zcMpwwB|0Y!j!=wy3Ks!u=bco$|Au+g8!o1PG!pFjAbWMYeD$l2Ok@7;zmwbP%(df7m z$Cx`e1Kr!6TUNEa(zJDD^FTGSO>Oh+1F#*IoHh(XoQI$~hCYj~qSyJ^rM9ts9Q`lL z*yGTjM}G)qK>8GAMQ9CHeTx3Nr^-=lZNH>y2qPrSRUt0&Q&=!Q;o0+oN8SfY{hjJOq<80i}+ldO6PmS1_A)sCI@t7Q8mTH@$HmSoIJ45PFxlHQO zY}PPGvu4pYK+l_`GVQ2UQS&+LM8V3MYDqPo-G89b_E?6yvmy6xpXr7?Uf(=s94Tc+ z5RFx^O%-+6P_{GK6QpJfBO|6|qjdjjlze~P~cS$zyIYW35{VP%l+_9Qy z8WVZT@_gpCpg$qx2$0*ZfG?J%zo#%}{=Im-71=+wgxA;~zfZEUjoUW#AnyWryk}+O zwYY6X59TqyhKSeTJh%ojj}pc~f1ko%D|E8SJS-@J{@T`(cP_9$UQ_z}5ynA(zk)yS z3WJ`T%;OhgEc0CiZ&Vs#lj~l>IJj;H)_n;&UiUt9x$Ydsf$22-Wheqo+UB8?V>UC7 z-*efd4Uc{4nX&CH@UBS`Q1TdM4s1S%pyr_9`CLbik7MN=$Cbs_obko=vHtcT>ILgu}>9&hf8A^RI4`Gb)BCn57Yy`EOk?U4Pxz!v0q>8{TS zHCrr_pws9LQ2+^_+Q`(c?Hf!Rq41=t(S*d(ghtkGE!CS$6>_-LkjbX+4IMY_ z#KtYh3l-ZeY1R>ZiD@Z+y++d$b<-O#M3%$(lvmP5jOCLZ=<@3@C_?N@7xEQ5SFn6_ zum5-kd*zhw3`kitiGK{06qejszl?zrTpR-RH zC%bTB;{L$T*MQ3XMBii?FOJ5DOXL6}URH|{yyt<;dyQrAe!>XeJB;AXG2-R?4Ul=a zg}egi3d>Id*-x*K(=6lA&M?B?bBype&Io^J8Nr_c^870-ga1oL@c+yR{%uC^*Wx^2 z-orrF_c0>5-9mp*=u1NXs?fhK^fN+#m2n-;betzm4-<7VK0>sYF^+%S7}pbBWqcH8 zIxbq~ZDIs(8zbU5%=j4U!}vJSCyY-J{hks0>x|&t67mXMk?bELDY(4&MpW=o2ns2< zq>wTx_~G+U`G)@uq;x=Fxl_!0Qq050A3nQCd79{PM&z`C5o_!a@?Ih5g?vWfjKH4@ a`<#$}E#w possibilites - 1) + return &(choix[possibilites -1]); + + return &(choix[retenu]); +} + +void CPoint::EnvoyerSolutions(Socket *sock) const +{ + char buffer[TAILLE_BUFFER]; + + //Envoyer le nombre de solutions possibles + sprintf(buffer,"%d\n",possibilites); + sock->Ecrire(buffer); + + //envoi des solutions + int i; + for (i=0 ; iEcrire(buffer); + } +} + +void CPoint::ModifierPoint(const double &x, const double &y) +{ +} diff --git a/serveur/Contraintes/CPoint.h b/serveur/Contraintes/CPoint.h new file mode 100644 index 0000000..8f94974 --- /dev/null +++ b/serveur/Contraintes/CPoint.h @@ -0,0 +1,58 @@ +#ifndef __CPOINT__ +#define __CPOINT__ + +#include "../Formes/Point.h" +#include "Objet.h" + +//! Classe CPoint. Classe à dériver pour faire un Point construit par contraintes. +/*! + On a dérivé la classe Objet pour en hériter les fonctionnalités qui sont communes à toutes les formes. On y rajoute le tableau de Point qui correspond aux possibilités de constructions relativement aux contraintes enregistrées. +*/ +class CPoint : public Objet +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Ne fait rien vu qu'il n'y a pas de possibilités de trouver une solution. + */ + CPoint(); + //! Constructeur. + /*! + Constructeur par copie. + param p : point à copier. + */ + CPoint(const CPoint &p); + //! Destructeur. + /*! + Détruit le tableau des possibilités. + */ + virtual ~CPoint(); + + //! Fonction + /*! + Retourne un pointeur vers la solution sélectionnée. Si il n'y a pas de solution possible la fonction retourne NULL. Cette fonction est virtuelle afin d'être surchargée au cas où il y a un changement de la solution retenue à cause d'une diminution du nombre de solutions. + */ + const Point *Solution() const; + + //! Fonction + /*! + Envoie la liste des possibilités dans la socket passée en paramètre. On envoie d'abord le nombre de solutions puis les solutions elles mêmes. Pour envoyer une solution on envoit sur une même ligne les coordonnées x et y du point. Voir le code pour les détails. + \param sock : Socket dans laquelle on envoit la liste. + */ + void EnvoyerSolutions(Socket *sock) const; + + //! Fonction + /*! + Modifie le point si celui ci est modifiable. Cette fonction doit être surchargée pour faire des modifiacations, sinon rien n'est modifiée. + */ + virtual void ModifierPoint(const double &x, const double &y); + + protected : + //! Donnée privée. + /*! + Tableau des possibilités. + */ + Point *choix; +}; + +#endif diff --git a/serveur/Contraintes/CPoint.o b/serveur/Contraintes/CPoint.o new file mode 100644 index 0000000000000000000000000000000000000000..9d04030aadba79d96a5a664dcab5d7219a3843b8 GIT binary patch literal 5080 zcmeHKZERat89vu`hP!pG*BRDoWw@hd>AGFwG;7mNppfJemTtjn>S`ZEw~lkuxOHsL zz6lA+$|f&Ty}OR_gKZK&5Px6-gb*rh5(t&HQa6c@N#sXBLkl9HfHSE`sbr*pd7gXE zajv~?10*DnIMVTZp7-;7yyrdFUo;;4w5Dl7HBAJ?1`^`On>oAgPth0U%&MHzoa=_UhRV4`qaDmtr%+v>KL1yp3qO1 zLgfpggbH6Vt~$x9<%^+8a@A9ClB<>8b;nq(7%NV4rIK9s_@Aj5OXVk)>h_$wfMw;O zY%E9W4=q)HUojRPW3ghqS$<+g*oQrWcQ@+40_B;gupf7i4hI`8 zuY?@I)Hxbu>eP7L$=abrl$lfWGN-1_w)#7qpPLZ0YovJfPUOEc!YkmrcNNK4^Q@a> zuks?7m&DT->@Ce!{;c?~op<1Wbl$=Dn0I+Kgp)1LgzNTA?jR)21ge{^80)M8)owR2 z!p_mq;GsnL%xx-xSnf~@$}5qIv0mM#*kO+io@3yequM^Tx*dn^MX47;6ZCp+zV`Qe zy^%+(FDRjr^2Ml>pyE1#`WvX?SLWBCN+UP_Lif9P>vKfwZatR*lb!|taO^AbSKMaW3wr4c) z%>akL3V`{3!c7Bh6JlPAxSH<*_Ke*q_GHIn=rFC-om z+FbYs4{r{I&T2a`j!F4mQ0|ua)Rypkp!eps2lNQ#J?M9%Ur!zb{{;Fm^bw>&lYM_V z2p6t@p6K@>cXd7tpknxRUIsf76yg=o(BWpCK#v}Yf%P-=*Obn{^>wa-{Uj#h`r*WU zvFPU>u%ejDOE|h^jGN~Cm>vln*TbWFx?E^!}y|Mjzm);fY?C9u< zcgDM8?S-OMw6a#JWbKW$_gkZxRL<4efA0ZomtLBkv{R#?cG05~Y6L6Ywq|UhkEQIC z&__!pp`T2rO=~7?6>JmgSxe}}yeFpm$=sBl&E!t!b7@O2>gJ=zj;kZquP=X~A%Cas za6?90Yr-5arX~?Fm$xk)YrVH*r_!f|p3YBBTF9b*zI_C$*j^#?Omt!VlmZyL`we8bG`c>eWnzg38C@VH)>xa;8jbLjrKCm`Gmo@#2n zr@-+0OTZuRI{lHa_U{>t{r$2h8~b$km9zn%@f9wmfK#r+1x{3#&k3g(;(X$8&6d_*=Hg1iQGcz_?uxaP% z@1_kQM!}{`A>Ps=-`ddF3&}R@8t}kob0B^;S^c3#=OFH`szd*Mf7vbEq*qY1)5D%6V6I;XJ?EqW|3%e7Oa` zEitdtE}Z{gTjU{M4s(9O`wr04g@Q029g=mwuhW<&yzjH4rz~5djTgnI7^h+~_xVh2 z%sgt9rtnJmq@BjmBg1BsC&|dAPPuINE2Pi$f^aVC_t01>;myHiriNQw^~))$8OIxP z$&m_UScP)l}Al{81(spT&0?nGBp;+^+)9^t= p6%BjXFX@=1lcbp2S&6?a@pmNtfyAt(wEwllYZCuWV*dT3{2z-32{r%# literal 0 HcmV?d00001 diff --git a/serveur/Contraintes/CPointAppart1C.cpp b/serveur/Contraintes/CPointAppart1C.cpp new file mode 100644 index 0000000..99dbd5e --- /dev/null +++ b/serveur/Contraintes/CPointAppart1C.cpp @@ -0,0 +1,88 @@ +#include "CPointAppart1C.h" + +#include "../Formes/Droite.h" +#include "../Formes/Point.h" +#include "../Formes/Cercle.h" + +#include "math.h" + +CPointAppart1C::CPointAppart1C() +:c(NULL),x(0),y(0) +{ + CalculerCoordonnees(); +} + +CPointAppart1C::CPointAppart1C(const CPointAppart1C &cp) +:CPoint(cp),c(cp.c),x(cp.x),y(cp.y) +{} + +CPointAppart1C::CPointAppart1C(CCercle *cc, const double &xx, const double &yy) +:c(cc),x(xx),y(yy) +{ + //on signale à cc que ce point a été construit par contraintes sur eux. + if (cc != NULL) + cc->AjouterEnfant(this); + + CalculerCoordonnees(); +} + +CPointAppart1C::~CPointAppart1C() +{ +} + +//Définit un Point appartenant à un cercle. Pour construire un point on calcule le point +//d'intersection le plus proche entre le cercle et la droite passant par le point dont les +//coordonnées sont fourinies au constructeur et le centre du cercle. +//pour cela on va construire un vecteur colinéaire au vecteur formé par le centre du cercle +//et le point fourni et de norme le rayon. Le point désiré est le translaté du centre par +//ce vecteur. +void CPointAppart1C::CalculerCoordonnees() +{ + delete [] choix; + choix = NULL; + + const Cercle *cc = c->Solution(); + + //si le cercle n'existe pas on ne renvoit pas de possibilités + if (cc == NULL) + { + possibilites = 0; + CalculerDependants(); + return; + } + + Point pc = cc->GetCentre(); + + //si le point donné est le centre, on ne retourne aucune solution + if (fabs(pc.GetX() - x) < EPSILON && fabs(pc.GetY() - y) < EPSILON) + { + possibilites = 0; + CalculerDependants(); + return; + } + + //on calcule le vecteur colinéaire + double vx = x - pc.GetX(); + double vy = y - pc.GetY(); + + //on calcule la norme du vecteur + double norme = sqrt(vx*vx + vy*vy); + + //on change la norme du vecteur pour qu'elle soit egale au rayon + vx *= (cc->GetRayon()/norme); + vy *= (cc->GetRayon()/norme); + + possibilites = 1; + choix = new Point[possibilites]; + choix[0] = Point(pc.GetX()+vx,pc.GetY()+vy); + + CalculerDependants(); +} + +void CPointAppart1C::ModifierPoint(const double &xx, const double &yy) +{ + x = xx; + y = yy; + CalculerCoordonnees(); + CalculerDependants(); +} diff --git a/serveur/Contraintes/CPointAppart1C.h b/serveur/Contraintes/CPointAppart1C.h new file mode 100644 index 0000000..0e0f5a7 --- /dev/null +++ b/serveur/Contraintes/CPointAppart1C.h @@ -0,0 +1,71 @@ +#ifndef __CPOINTAPPART1C__ +#define __CPOINTAPPART1C__ + +#include "CCercle.h" +#include "CPoint.h" + +//! Classe CPointAppart1C. +/*! + Définit un Point appartenant à un cercle. Pour construire un point on calcule le point d'intersection le plus proche entre le cercle et la droite passant par le point dont les coordonnées sont fourinies au constructeur et le centre du cercle. Si le point est le centre il n'y a pas de solutions sinon il y en a une et une seule +*/ +class CPointAppart1C : public CPoint +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit avec des droites inconnues. Ne doit pas être utilisé. + */ + CPointAppart1C(); + //! Constructeur. + /*! + Constructeur par copie. + param p : point à copier. + */ + CPointAppart1C(const CPointAppart1C &p); + //! Constructeur. + /*! + Constructeur à partir d'un cercle. C'est celui qui devra être utilisé. + param c : cercle auquel le point doit appartenir. + param x : coordonnée x du point à projeter sur la droite. + param y : coordonnée y du point à projeter sur la droite. + */ + CPointAppart1C(CCercle *c, const double &x, const double &y); + //! Destructeur. + /*! + Détruit les solutions possibles. + */ + ~CPointAppart1C(); + + //! Fonction. + /*! + On recalcule les coordonnées du point. + */ + void CalculerCoordonnees(); + + //! Fonction + /*! + On change les coordonnées et on recalcule par dépendances les points construit par contraintes. + */ + void ModifierPoint(const double &x, const double &y); + + private : + //! Donnée privée. + /*! + Cercle sur lequel le point doit se trouver. + */ + const CCercle *c; + + //! Donnée privée. + /*! + coordonnée x du point à projeter. + */ + double x; + + //! Donnée privée. + /*! + coordonnée y du point à projeter. + */ + double y; +}; + +#endif diff --git a/serveur/Contraintes/CPointAppart1C.o b/serveur/Contraintes/CPointAppart1C.o new file mode 100644 index 0000000000000000000000000000000000000000..72a765adfb4bb947fa7e913f90938bf84cfcfd63 GIT binary patch literal 6144 zcmd5og(x!HcDQKDo3X@hT>X?M;{my&$ zhUe#Gt)@!bmEZf_bI$Lcd+xdS-Fy9QWy@2NBr#DW=4Q7f#sfMfAUR z7Or~=*Q-l;@70^7QmOEk&rrPYFfUkC3Dy$bX!o8W{29IU);fKg-=V74w>6ZznSM}L zZW!G+%C$OI+%S7Hx^G@Qf9(Gzio$g-ex>}}*@$=zrP>JA>g#GTc&dl}MzC%+9j2zi z2-fSZl#Pq$F|NrTa#rdHC$m%)!}NU-DwV%#w(`2e6BvX8T?i_0z6n*7w3uK&8Fd%l*P&tLx`qC&)l{u-vW8@hlOq+jcivZ>zLYA_raB76?yp6wGS_U{Fb7* zrn~0i)mQQ!nXh|C`)hBwkfexLj~sJY4CPocSa<14v3t_AAFZ$-Ee7k!K7pYWmC330 z$)Ykb)jo0Q+(>WzjbdHB$Vst#9F0r)8KIcUkE6k*i|{>%VS)@3)&OW_ncWYA2$d1^ z=*kg8If5B1jC*GDr7MGmG6;=6bO@U-2*xN?^mR9RWwf94L-f{%G^$6AY|=+Fs1?rA zyOgiG_H%Sc5uGN2h_+zTeWej%O~0oP?FAaUX?u(BDvQ_5tq`{fbkwg+d7uWTX`oiGjxR%;bQqdAJ<7Ldv0w9(lvWKZ zjAM5OmL_p7mj`t5JTg}*N!5$+t#wuHWZweLAul5P(@QdJM6w7KissfdPIhVMD+}3c zE^vO~`mu!i1y5Dc!@j$q1@-q9R81{lFDzVw`ozLJ(K9xKzn>oa=Y=<)G=ok(e|nM^FJ1wy1ZFB(AUx$qVy9r7-)$kiUtu;fRb9x6k4%nhn_v3JO|Zc$ZR z!Tpr%Gwp4#y&yO~R2-Z-sP^Ki#s}H~Ec3HP_K|%U&(3-5e%M~e^Cs-y1A0i|=z~@UH71&?PP6e7;` z1@}SO=bm)Q)z8S@?Q$(TgqdO*M4QY)#@bOYizyGv`cP=CzhV8>$O?b6+#w8`{*KL@Z@;npdt`!I+#I=+k07KrL(GUQt6USyTHpCilj) z7?XQ)IVSIk$D?Y0T+L`v(32{YvuVpr^gXG(oJ^$lr&DoN&dSjpUE3>`lRP(ZVqkLn(;Nx=uUnXc^AdZ zJ%lgfxlJg6wRbb-!UMu8;g2|?kd4aQcfyQ9>cM=^WYzpBIw6bE?d)P-MyRrOVDfzcK1kpX4MXQyYRoR=vF1{LJFJJ8L zvdoh|{>PVlahI(WvSaYJ;%0X+^ODSUl!s-!J_NiAS$u-a1Z1amOT~|8DOPF}DE40B zzX(|r;-A1H&MC5=f-KG?lIi>qh4`27h%<@o|AH*eAd(-jC7k$Qg)Gh=viCq1XAQ~E zIrz^*7H19FPe2xD3(2P({9ifb3l8~`L;l1e-(y>R6mNq=Uh9y*=8(5Lw5X*L(JAWZ2ANg?XNFwl!Mgf6TnGwppy+nB`=%h8t|I+susfKA*)*LHe0>4K>c)u<{4;m&t^4B zxp1%=%#PRq?>80OM@Gv@h!1F1qU;8&?3!bVb86qjjFCHa>m z!_RNHd>i%-7cL$562jj~Lil@<5dLT{BYqE%+P_LN_&*{9|7}9>|40b_G>~{7bG;9H ziwhUUj;-JwwCZg#x@czV{8Xd z!qNLI$@PqVhs&>#4E`xX`1>s(_|t^-jNOCd+qImrhX}vSSdilY;X{o5fv|zG4)~__ z8X@8tBSib362jlRge&lWhVUzleL@KS-8lXUmk}b4AeX;EhAjouterEnfant(this); + + CalculerCoordonnees(); +} + +CPointAppart1D::~CPointAppart1D() +{ +} + +//Définit un Point appartenant à une droite. Pour construire un point on fait le projeté orthogonal du +//point sur la droite. Pour ce faire on construit la droite perpendiculaire à celle passée en paramètres +//passant par le point et on fait l'intersection avec la droite. Il y a toujours une possibilité. +void CPointAppart1D::CalculerCoordonnees() +{ + double diff, xx, yy; + const Droite *dd = d->Solution(); + + delete []choix; + choix = NULL; + + //Si la droite n'est pas définie + //alors il n'y a pas de solutions + if (dd == NULL) + { + possibilites = 0; + CalculerDependants(); + return; + } + + //on calcule la droite perpendiculaire + Droite dperp = Droite(Point(x, y), Point(x+dd->A(), y+dd->B())); + + //on calcule le point d'intersection + diff = dperp.A()*dd->B() - dd->A()*dperp.B(); + + //calcul de la solution + xx = (dd->C()*dperp.B() - dperp.C()*dd->B())/diff; + if (fabs(dd->B()) > EPSILON) + yy = (-dd->C() - dd->A()*xx)/dd->B(); + else if (fabs(dperp.B()) > EPSILON) + yy = (-dperp.C() - dperp.A()*xx)/dperp.B(); + else + { + possibilites = -1; + CalculerDependants(); + return; + } + + possibilites = 1; + choix = new Point[possibilites]; + choix[0] = Point(xx,yy); + + CalculerDependants(); +} + +void CPointAppart1D::ModifierPoint(const double &xx, const double &yy) +{ + x = xx; + y = yy; + CalculerCoordonnees(); + CalculerDependants(); +} diff --git a/serveur/Contraintes/CPointAppart1D.h b/serveur/Contraintes/CPointAppart1D.h new file mode 100644 index 0000000..7530f3e --- /dev/null +++ b/serveur/Contraintes/CPointAppart1D.h @@ -0,0 +1,71 @@ +#ifndef __CPOINTAPPART1D__ +#define __CPOINTAPPART1D__ + +#include "CDroite.h" +#include "CPoint.h" + +//! Classe CPointAppart1D. +/*! + Définit un Point appartenant à une droite. Pour construire un point on fait le projeté orthogonal du point sur la droite. Pour ce faire on construit la droite perpendiculaire à celle passée en paramètres passant par le point et on fait l'intersection avec la droite. Il y a toujours une possibilité. +*/ +class CPointAppart1D : public CPoint +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit avec des droites inconnues. Ne doit pas être utilisé. + */ + CPointAppart1D(); + //! Constructeur. + /*! + Constructeur par copie. + param p : point à copier. + */ + CPointAppart1D(const CPointAppart1D &p); + //! Constructeur. + /*! + Constructeur à partir de deux droites. C'est celui qui devra être utilisé. + param d : droite à laquelle le point doit appartenir. + param x : coordonnée x du point à projeter sur la droite. + param y : coordonnée y du point à projeter sur la droite. + */ + CPointAppart1D(CDroite *d, const double &x, const double &y); + //! Destructeur. + /*! + Détruit les solutions possibles. + */ + ~CPointAppart1D(); + + //! Fonction. + /*! + On recalcule les coordonnées du point. + */ + void CalculerCoordonnees(); + + //! Fonction + /*! + On change les coordonnées et on recalcule par dépendances les points construit par contraintes. + */ + void ModifierPoint(const double &x, const double &y); + + private : + //! Donnée privée. + /*! + Première droite du point. + */ + const CDroite *d; + + //! Donnée privée. + /*! + coordonnée x du point à projeter. + */ + double x; + + //! Donnée privée. + /*! + coordonnée y du point à projeter. + */ + double y; +}; + +#endif diff --git a/serveur/Contraintes/CPointAppart1D.o b/serveur/Contraintes/CPointAppart1D.o new file mode 100644 index 0000000000000000000000000000000000000000..2875af91a07510c37c1e4cbdab7a4cc814672222 GIT binary patch literal 6728 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 OC2p74Lqt1|NclfXw1i{; literal 0 HcmV?d00001 diff --git a/serveur/Contraintes/CPointCentre1C.cpp b/serveur/Contraintes/CPointCentre1C.cpp new file mode 100644 index 0000000..091b0bf --- /dev/null +++ b/serveur/Contraintes/CPointCentre1C.cpp @@ -0,0 +1,51 @@ +#include "CPointCentre1C.h" + +#include "../Formes/Droite.h" +#include "../Formes/Point.h" + +CPointCentre1C::CPointCentre1C() +:c(NULL) +{ + CalculerCoordonnees(); +} + +CPointCentre1C::CPointCentre1C(const CPointCentre1C &cp) +:CPoint(cp),c(cp.c) +{} + +CPointCentre1C::CPointCentre1C(CCercle *cc) +:c(cc) +{ + //on signale à cc que ce point a été construit par contraintes sur eux. + if (cc != NULL) + cc->AjouterEnfant(this); + + CalculerCoordonnees(); +} + +CPointCentre1C::~CPointCentre1C() +{ +} + +void CPointCentre1C::CalculerCoordonnees() +{ + const Cercle *cc = c->Solution(); + + delete []choix; + choix = NULL; + + //Si le cercle n'est pas défini + //alors il n'y a pas de solutions + if (cc == NULL) + { + possibilites = 0; + CalculerDependants(); + return; + } + + possibilites = 1; + choix = new Point[possibilites]; + choix[0] = Point(cc->GetCentre()); + + CalculerDependants(); +} diff --git a/serveur/Contraintes/CPointCentre1C.h b/serveur/Contraintes/CPointCentre1C.h new file mode 100644 index 0000000..9e2567c --- /dev/null +++ b/serveur/Contraintes/CPointCentre1C.h @@ -0,0 +1,51 @@ +#ifndef __CPOINTCENTRE1C__ +#define __CPOINTCENTRE1C__ + +#include "CPoint.h" +#include "CCercle.h" + +//! Classe CPointCentre1C. +/*! + Définit un point comme étant le milieu de deux autres points. +*/ +class CPointCentre1C : public CPoint +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit avec des points inconnus. Ne doit pas être utilisé. + */ + CPointCentre1C(); + //! Constructeur. + /*! + Constructeur par copie. + param p : point à copier. + */ + CPointCentre1C(const CPointCentre1C &p); + //! Constructeur. + /*! + Constructeur à partir d'un cercle. C'est celui qui devra être utilisé. + param c : cercle dont on veut le centre. + */ + CPointCentre1C(CCercle *c); + //! Destructeur. + /*! + Détruit les solutions possibles. + */ + ~CPointCentre1C(); + + //! Fonction. + /*! + On recalcule les coordonnées du point. + */ + void CalculerCoordonnees(); + + private : + //! Donnée privée. + /*! + Cercle dont on veut le centre. + */ + const CCercle *c; +}; + +#endif diff --git a/serveur/Contraintes/CPointCentre1C.o b/serveur/Contraintes/CPointCentre1C.o new file mode 100644 index 0000000000000000000000000000000000000000..0b4339622b292a383d5ff44d7fc7cc57f494c9e4 GIT binary patch literal 4888 zcmcgveP|rV6@RNcrI%E8F3v&S=Id-Ht(?>woutT8`;X$&`lJ5HRnnSb5bM)vZJ%}8 zJ?{1#IgP2?i>bHUkTjH#{FPEjDfIqO!3hdDa7_%3i7BEO(n1L?q>v!Dw8aG#Os>DT zJ0tJyS#ew14x0PTd+#@I-kX`78GT3Fw^LCRl0~5y-IRz@iNG@GLoaQhyGeKdI8nbA zuV3qF)e;}yXti4P3rSB)TqGuQV{{|a+X>5?U2VmiT4~q1Lb2le@uqHEdiTZuga7)q z1pZpJTW6prJgvtY-RSPvcI2$5OJ%#QO>!mU5BDRpCV_!$1|1i zMpN~V;~xF$YTO%7Det)Y71rukMsg`9RiC?(^b@)wJuLqra2oW>Nj3Uh98LKj!l~<2 zd%&0Dogc<0 z*7WqItDi@g-LAG+KegDZb${|bUJCwN&&$~A+WBN_|Kjq8uD0Om3$A{yeyT~%cJzBp zTXeOCr!_czy~*h}>T?Zz;EfTj$@w>e{2S8Q@<*P2&ea#ZsRe(O%hKQq#e%Q!5UaN2 z=2BSt=e6IqYS(2xafmtO-72SK*X1o7ncts{Qr+$mqlJzB;5QE>K1-<8QhL^P6RF+9 zqyyKIhweQhGN=*C)<&?O4}6R*&selfHcn zw!@N>L?gnvAF5-hO;i=N&CfnH$@a6Te_q3$hW_WM_hTArz&I-+W3cKn>PwQ-*U8~= z{(_q5A{qg<#W5blkwpI;pJDHV{n<6_z3`cX{Y}{a4vddN5sGt3v@4ta zTDo`F0ex$FKpj*E)BSyYgPH!!aJsi#F)L=t%va5=>E1DOx|p|o&cL>zt(d{;$vG!K z4Rk629+NHfQXO;NA$2D2Z8^!7Mul=p~a>rX96vYN=?=+E&3-E2?p5 z@?gjIScAByli2BPqLakKn#YVImHZrnux!Uvk^Z)-lP}DYTCnHlurD!V|8n8|k7*{c zXNlhkzwj3|a3P!bLA*0i`M-;p{uj{^;P+=<0`(Cg$ADa}N(X@$>=(2jLuLN$czxh- zeAo_tVSoG`$-*`+J5j^DQJe#5Hi(iIxC0o@WA_H4Vdyvyo&%YOjds}IVfgETP8ONg zEEHjXr{Ry!1NO)HNq;{^JM6CnfA>Hq3){H7jT+{i25(*(VUy#&g?4z{S1|5r=y=@E zqsnnFq8;i^D{`Ts=OS$%gxaiU9)I7mNFK*5*NknM&tZ+ZA&TTN$~9xtM|Tk|LBaib z9yvaam2(LDJGTxog%r{sXl*5|kJDdUVPpI2m;Hwvf*4z!#h_P=Fv+13Tm2fOomcW^ zi4l?sm6$){Hx)5L5}^{K_2j=HgpTvxBHFx{H((XME@TF_e?!P=;3mYwJb5NE{|Ca( z!2DNH52H$dzeKx<%6A3x`CONU`5&UnyMpcifGqC@mcJO9VCD}&miGeN4?>oA0LxZ{ zUxO^~0Jc95S)TbUzaHVg9g*LU$iIome~ZW~5&4eL=HvJujL44*nfKx*e5qp*`=N;Z z-H80ti2S~gd4F%h{kUyI1p{)|uyopiF~-em4ad82=s@%W$o6X|SU)6s z2jVTRom=$HjAZkrLak(0vbJ5Bu`SCqt8MPag!hh7GXbqb->;4DoiN%1l9~>3W|iDw z>eq7HvstrJz|D%tpLlBexanjDo;+^X9J8WXNAi}V<${qqI%nEDN9`i1nNrT5xeoIh zxsCM&Iq#K$4Nusmnp3o`K>vjQ3LFc1&*TH=BJg23(PL)Wv}O=|Fwa*0xSw9|fD{Ao z9SRa3*=34HWq5%6gq*d>&L_j_RBg{5vy0VY1>7Q!0H6LCnIX+OVV^WBGWM#L8=9~S zv!)YTw9LSMd!~4#Xjc4Aa56KI;Z>bHcp%ef7=`)y{B-d|rXTHU(I}Mi)vDo~ESpBr zI$~=~?0l&}xkp4nhH-R$-YA=us%_;^~CnYmD#hOjRQ`FBFTF60#Eo&639oD?|4h;jZ2 Dz-M^m literal 0 HcmV?d00001 diff --git a/serveur/Contraintes/CPointInter1C1D.cpp b/serveur/Contraintes/CPointInter1C1D.cpp new file mode 100644 index 0000000..df147fa --- /dev/null +++ b/serveur/Contraintes/CPointInter1C1D.cpp @@ -0,0 +1,121 @@ +#include "CPointInter1C1D.h" + +#include "../Formes/Cercle.h" +#include "../Formes/Droite.h" +#include "../Formes/Point.h" + +#include "math.h" + +CPointInter1C1D::CPointInter1C1D() +:d(NULL),c(NULL) +{ + CalculerCoordonnees(); +} + +CPointInter1C1D::CPointInter1C1D(const CPointInter1C1D &cp) +:CPoint(cp),c(cp.c),d(cp.d) +{} + +CPointInter1C1D::CPointInter1C1D(CCercle *cc, CDroite *dd) +:c(cc),d(dd) +{ + //on signale à dd et à cc que ce point a été construit par contraintes sur eux. + if (dd != NULL) + dd->AjouterEnfant(this); + if (cc != NULL) + cc->AjouterEnfant(this); + + CalculerCoordonnees(); +} + +CPointInter1C1D::~CPointInter1C1D() +{ +} + +void CPointInter1C1D::CalculerCoordonnees() +{ + const Droite *dd = d->Solution(); + const Cercle *cc = c->Solution(); + + delete []choix; + choix = NULL; + + //Si le cercle ou la droite n'est pas défini + //alors il n'y a pas de solutions + if (dd == NULL || cc == NULL) + { + possibilites = 0; + CalculerDependants(); + return; + } + + //on projète le centre sur la droite + + //on calcule la droite perpendiculaire + Droite dperp = Droite(Point(cc->GetCentre().GetX(), cc->GetCentre().GetY()), Point(cc->GetCentre().GetX()+dd->A(), cc->GetCentre().GetY()+dd->B())); + + //on calcule le point d'intersection + double diff = dperp.A()*dd->B() - dd->A()*dperp.B(); + + //calcul de la solution + double xx = (dd->C()*dperp.B() - dperp.C()*dd->B())/diff; + double yy; + if (fabs(dd->B()) > EPSILON) + yy = (-dd->C() - dd->A()*xx)/dd->B(); + else if (fabs(dperp.B()) > EPSILON) + yy = (-dperp.C() - dperp.A()*xx)/dperp.B(); + else + { + possibilites = -1; + CalculerDependants(); + return; + } + Point proj = Point(xx,yy); + + //on translate le point pour se retrouver dans un cas simple + Point trans = Point(proj.GetX() - cc->GetCentre().GetX() , proj.GetY() - cc->GetCentre().GetY()); + + //on calcule la distance au carré entre les solutions et le point projeté + double dist = (PUISS2(cc->GetRayon()) - (PUISS2(trans.GetX()) + PUISS2(trans.GetY()))); + + //si ce carré est négatif alors il n'y a pas de solutions + if (dist < - EPSILON) + { + possibilites = 0; + CalculerDependants(); + return; + } + //si c'est 0 alors proj est la solution + else if (dist < EPSILON) + { + possibilites = 1; + choix = new Point[possibilites]; + choix[0] = proj; + CalculerDependants(); + return; + } + + //on récupère la vraie distance + dist = sqrt(dist); + + possibilites = 2; + choix = new Point[possibilites]; + + //calcul d'un vecteur directeur de la droite + double vx = - dd->B(); + double vy = dd->A(); + + //on modifie la norme du vecteur pour qu'elle soit égale à dist + //plus besoin de normaliser le cecteur car c'est déjà fait + //double norme = sqrt((vx*vx)+(vy*vy)); + /*vx *= (dist/norme); + vy *= (dist/norme);*/ + vx *= dist; + vy *= dist; + + //calcul de la solution + choix[0] = Point(proj.GetX() + vx , proj.GetY() + vy); + choix[1] = Point(proj.GetX() - vx , proj.GetY() - vy); + + CalculerDependants(); +} diff --git a/serveur/Contraintes/CPointInter1C1D.h b/serveur/Contraintes/CPointInter1C1D.h new file mode 100644 index 0000000..03df9aa --- /dev/null +++ b/serveur/Contraintes/CPointInter1C1D.h @@ -0,0 +1,59 @@ +#ifndef __CPOINTINTER1C1D__ +#define __CPOINTINTER1C1D__ + +#include "CCercle.h" +#include "CDroite.h" +#include "CPoint.h" + +//! Classe CPointInter1C1D. +/*! + Définit un Point construit par intersection d'un cercle et d'une droite. Pour cela on va projeter le centre du cercle sur la droite. Ce point sera le milieu du segment formé par les deux solutions. Au cas où il y a une seule solution ce sera directement la solution. Le cas où il n'y a pas de solutions est repérable par le fait que la distance entre ce point et le centre du cercle sera supérieure au rayon du cercle. +*/ +class CPointInter1C1D : public CPoint +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit avec des droites inconnues. Ne doit pas être utilisé. + */ + CPointInter1C1D(); + //! Constructeur. + /*! + Constructeur par copie. + param p : point à copier. + */ + CPointInter1C1D(const CPointInter1C1D &p); + //! Constructeur. + /*! + Constructeur à partir d'un cercle et d'une droites. C'est celui qui devra être utilisé. + param c : cercle. + param d : droite. + */ + CPointInter1C1D(CCercle *c, CDroite *d); + //! Destructeur. + /*! + Détruit les solutions possibles. + */ + ~CPointInter1C1D(); + + //! Fonction. + /*! + On recalcule les coordonnées du point. + */ + void CalculerCoordonnees(); + + private : + //! Donnée privée. + /*! + droite à laquelle le point doit appartenir point. + */ + const CDroite *d; + + //! Donnée privée. + /*! + cercle auquel le point doit appartenir. + */ + const CCercle *c; +}; + +#endif diff --git a/serveur/Contraintes/CPointInter1C1D.o b/serveur/Contraintes/CPointInter1C1D.o new file mode 100644 index 0000000000000000000000000000000000000000..272d33fea5de689d5ca14b372fd2399072bec51c GIT binary patch literal 9540 zcmc&)eQ?uf9e>g!7$rak)pZQD?6okKHKlZA=L@6FU>jqVj@_7I=t~%3CF#<1D=Ig< z@Kdsw$xd_byo;jK^NlM0(H-nWVN^HN)7``qG}+k1NiEaPp`xPk^Lc*Hll<~aI_J*Q z=lDIJ=llMB-k)ZBFu3L>hr=OsaR{dTJZViNuWLjwvzxcFA>B@6n0xdYL>n zxhE5RR1WG?$rU)d?JeXEAhukT=Ts#t07yE=Y?L$<%&4h1`DW z$5kBGemr@Dyu!vknc$wTOz?nK_OcCkOwL$c%QcxL?Lux7$c(|-OsA=q4Vl^o>8y}8 zth+MC7K^Mwk(uDrTHQB!Rm#|hT+=z$NUhSumy-O+`PGsdmexcnEh{87ELU67thB6< zOkQr!wmi1l>|&;BVb_SpNiB^)MGq?^lh;*6D=i-t4Y7)29656ZF>+Z&CQ=^iLT;}) z#N~zJD;VTGcdU?mv|5(iWAd!?mCulwAEkOB*NBcVh0@CN6>__)jS2>tjIy(aFgIc{ zEne~&^75lp&yO)mA=gk9>*NasH#gwPW51ku{?wnxgNeGyA$vN{`~!>2kahMr+8_NR zEOw@hLAXw36E#9JP(jL{d!dlqQmt`_yh6?gy@{jnW*g_}(y|U?AvaxKn`B=7W>l+5 zK4T_E1txY^4V6P=nwd>5F;6HYX--k;!C^~xViq1B@~mNpuw@y>dT8LFG*7egF;d8N z$>^`^6v>ZLxsda~Z^mFP&yw;M!I`mIx^uneiRsCYQmv2^(h+N9+eFYub&dU5-VSP` znftTMo?K+#W%6V!`83TYK0L#m=t`knZBsft&OX@>9@izFK_1tByD77!T*x)o<{RYG zuBo;>*I1LE&yb%tXq6vj%tG!wYeUv~c1vhQhw!Cv!&eP~+UDjPvYsc}Ax|rVZ9rGkT7qEbHWxu2lA{Bu#y`Q(YI*hHMyT zq=T{DNHG~CZAPPD#tgK&4ZUbM8}*`>Gc}v zG-aFsGc9X5rPSe+lARo7jVUE8m)UVjB~wl*TRJ|clwqo-lpWVfYD!++hU35 zd~$~PMqSI#-Qq8G?k~8-$DE6Q>k>~m7mm8bgwy@1Q#|H!qg`;h!T*e#IzMu|p>ND^ z!}j2ei-b5nBjb8%zLa$e z#&Plz@u@i^zBq>l-<|{8kNezU|K8^|E)q}9orm^|bE)#mT&nDx2bGiasB)ypQ}bziXg+OUnU6Hhl6iS-?_Ykf|2+!7tNE`N zc~9#SSk}=Mi$oJQM-$kX#2KAPcJYLH*t$@!OEWqk0gY@zbDZn{Jld%!hcU+ zUno4%7amN6pgs^5{&>t3Q~jRkuzw&Dy*C!^3;W~#(A{_3S-s@^wKZ?9p;_&(yM`A1 zg|~z@$9uLRpJ*%*_G2Wj9ZK}{-7EZkv2EMJQO?ZkEANCFrckJTAX?Gh$2F~rTr+52 zito*u2|NzNy%2Ka(w=%Ad{-(OOG1`Y7GGp&f7hT*{eP#|3?2H%5|oAhZXiPy-Q?1< z>NU<4_~p1<7>i{sKC9je=rvNHN~6MCfY$yduE3cN9{c+ye7e6QXj}blfTXfMf`qy(y*$(JUY9*l7BkH-OcoPO?4-DC794RtC z&LjI^^*4nDdD_Cz{-9P-tbCVvrDzpa{+9>(w>X5NvowmPl~dq~vlM4(*JwFcM!7gE zMxOp=mW60JD^?2W**5tcq5gA-MQ&&4RdThRo{*C@IXxDYF~7pTu?>OZXH z1nTGT>AQ^b$3Y**$9su1*M%{-fyE1 z+vuO#=$CBtSsVQ~8$Hvqgqe>|(cJ3`u^z9o$=_w8`)u?s8$GIM?$3o-&qrfT>q4XbG;nwL4Uql;%`x2TI!2vX)@i^&K7Ic;7%6jm~&1 zl8~dY?DpQR;Y48Rjay^Gc(Mkgn|q>(V3!%R+D%{@H&vRdv;6~Ia!jk`)AhNt*&K{p zb(Zbjv4P=4Bo;04&2HHE%jCPe({$V4V}@0|Yu8iL86FHr`_V%+Gq<*xzLu{FCpz$k ziHB7X(_1Up8x*I_9J9d6Dvi5r8aJA>>7s*^(%&60C(-mFd8W9#MG9`!-aAZNMXKJc z)oHdPpLIRk)lfuxwsK{Z;>dwEsh)0gDGc2gPeA968c#o3%DKP3V@oVD6p6zkLVpM* zhceI>jNTvH9**nr9}0H0b;tVd4b!FGC4r^4#rh+gBjLC-DtGpdJJ$x9L!rKrk)Gbj z{ec#=ha#cAfu5nEP-6RFI24I)js=-qjTa|VR%wV(=$?_0&|o+|6pQu@L=xLW_czO1 zt8R`E^Km9PaOm(oP=^P=?L-_Dn~1o~`BtLdE+F+DBMrTSMCkpH2tD30b-4JZfYf^j z&UDheTS(tY8h&~ey_+=N4WCyyN`znD74&;^iZbFY%;h*t~oJtFj;SNJ<1^_+Ov(oY)^dK-w)dyt56 zewc_qMD`P#gm{vOaXUrCIR8P>7vb^A@moR!zg^LH6JhrN5##W%!fz`4k;0S2B|^Nc zaMoKu!{3z(gG9vLsBjmM`G1Kt@_d{K|KC@5oQS;70I9ba&&s-Mg?NPM$J-v4J@wm& zSXW`SgugfAc}jl)BF3?gh;jWQ5&4f3 z(XW??7?-~j5%*H;Ioh`?yp0I`7!mr95TXBd;&nI&h|oW+@Q*~~Jr{eB{3Qx+R=7za z{&yAGk53bk^Ik=}1jZ>~{+;8%k0R)vaJ=1o|2nYW`KOMf#r%8Bu~Z2DZsKS~MO8^DpFl&o2M~ literal 0 HcmV?d00001 diff --git a/serveur/Contraintes/CPointInter2C.cpp b/serveur/Contraintes/CPointInter2C.cpp new file mode 100644 index 0000000..1671167 --- /dev/null +++ b/serveur/Contraintes/CPointInter2C.cpp @@ -0,0 +1,117 @@ +#include "CPointInter2C.h" + +#include "../Formes/Cercle.h" +#include "../Formes/Point.h" + +#include "math.h" + +CPointInter2C::CPointInter2C() +:c1(NULL),c2(NULL) +{ + CalculerCoordonnees(); +} + +CPointInter2C::CPointInter2C(const CPointInter2C &cp) +:CPoint(cp),c1(cp.c1),c2(cp.c2) +{} + +CPointInter2C::CPointInter2C(CCercle *cc1, CCercle *cc2) +:c1(cc1),c2(cc2) +{ + //on signale à cc1 et cc2 que ce point a été construit par contraintes sur eux. + if (cc1 != NULL) + cc1->AjouterEnfant(this); + if (cc2 != NULL) + cc2->AjouterEnfant(this); + + CalculerCoordonnees(); +} + +CPointInter2C::~CPointInter2C() +{ +} + +void CPointInter2C::CalculerCoordonnees() +{ + const Cercle *cc1 = c1->Solution(); + const Cercle *cc2 = c2->Solution(); + + delete []choix; + choix = NULL; + + //Si une des cercles n'est pas défini + //alors il n'y a pas de solutions + if (cc1 == NULL || cc1 == NULL) + { + possibilites = 0; + CalculerDependants(); + return; + } + + //on calcule les coordonnées du centre du deuxième cercle par rapport + //aux coordonnées du premier + Point ccc2 = Point(cc2->GetCentre().GetX()-cc1->GetCentre().GetX() , cc2->GetCentre().GetY()-cc1->GetCentre().GetY()); + + //on calcule le carré de la distance entre les deux centres + double d = PUISS2(ccc2.GetX()) + PUISS2(ccc2.GetY()); + + //on regarde si il y a une infinité de solutions + if (fabs(d) < EPSILON) + { + possibilites = -1; + CalculerDependants(); + return; + } + + double x = -(PUISS4(cc1->GetRayon()) + PUISS2(d - PUISS2(cc2->GetRayon())) -2 * PUISS2(cc1->GetRayon()) * (PUISS2(cc2->GetRayon()) + d)); + + //on teste si il n'y a pas de solutions + if (x < - EPSILON) + { + possibilites = 0; + CalculerDependants(); + return; + } + //on regarde si il y a une seule solution + else if (fabs(x) < EPSILON) + { + possibilites = 1; + choix = new Point[possibilites]; + double xx,yy; + + //si les cercles sont emboités + if (d < PUISS2(MAXIMUM(cc1->GetRayon() , cc2->GetRayon()))) + { + xx = ccc2.GetX()*cc1->GetRayon() / (cc1->GetRayon() - cc2->GetRayon()) + cc1->GetCentre().GetX(); + yy = ccc2.GetY()*cc1->GetRayon() / (cc1->GetRayon() - cc2->GetRayon()) + cc1->GetCentre().GetY(); + } + else + { + xx = ccc2.GetX()*cc1->GetRayon() / (cc1->GetRayon() + cc2->GetRayon()) + cc1->GetCentre().GetX(); + yy = ccc2.GetY()*cc1->GetRayon() / (cc1->GetRayon() + cc2->GetRayon()) + cc1->GetCentre().GetY(); + } + choix[0] = Point(xx,yy); + } + //sinon il y a deux solutions + else + { + possibilites = 2; + choix = new Point[possibilites]; + + x = sqrt(x); + + double xx1,yy1,xx2,yy2; + + xx1 = (ccc2.GetX() * (PUISS2(cc1->GetRayon()) - PUISS2(cc2->GetRayon()) + d) - ccc2.GetY() * x) / (2 * d) + cc1->GetCentre().GetX(); + yy1 = (ccc2.GetY() * (PUISS2(cc1->GetRayon()) - PUISS2(cc2->GetRayon()) + d) + ccc2.GetX() * x) / (2 * d) + cc1->GetCentre().GetY(); + + xx2 = (ccc2.GetX() * (PUISS2(cc1->GetRayon()) - PUISS2(cc2->GetRayon()) + d) + ccc2.GetY() * x) / (2 * d) + cc1->GetCentre().GetX(); + yy2 = (ccc2.GetY() * (PUISS2(cc1->GetRayon()) - PUISS2(cc2->GetRayon()) + d) - ccc2.GetX() * x) / (2 * d) + cc1->GetCentre().GetY(); + + choix[0] = Point(xx1,yy1); + choix[1] = Point(xx2,yy2); + + } + + CalculerDependants(); +} diff --git a/serveur/Contraintes/CPointInter2C.h b/serveur/Contraintes/CPointInter2C.h new file mode 100644 index 0000000..c284fdf --- /dev/null +++ b/serveur/Contraintes/CPointInter2C.h @@ -0,0 +1,58 @@ +#ifndef __CPOINTINTER2C__ +#define __CPOINTINTER2C__ + +#include "CCercle.h" +#include "CPoint.h" + +//! Classe CPointInter2C. +/*! + Définit un Point construit par intersection de deux cercles. Dans le cas général il y a deux solutions. Si les cercles sont tangents il y a une seule solution, si les cercles sont confondus il y en a une infinité et si ils ne se croisent pas il y a aucune solution. +*/ +class CPointInter2C : public CPoint +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit avec des droites inconnues. Ne doit pas être utilisé. + */ + CPointInter2C(); + //! Constructeur. + /*! + Constructeur par copie. + param p : point à copier. + */ + CPointInter2C(const CPointInter2C &p); + //! Constructeur. + /*! + Constructeur à partir de deux cercles. C'est celui qui devra être utilisé. + param c1 : premier cercle. + param c2 : deuxième cercle. + */ + CPointInter2C(CCercle *c1, CCercle *c2); + //! Destructeur. + /*! + Détruit les solutions possibles. + */ + ~CPointInter2C(); + + //! Fonction. + /*! + On recalcule les coordonnées du point. + */ + void CalculerCoordonnees(); + + private : + //! Donnée privée. + /*! + Premier cercle du point. + */ + const CCercle *c1; + + //! Donnée privée. + /*! + Deuxième cercle du point. + */ + const CCercle *c2; +}; + +#endif diff --git a/serveur/Contraintes/CPointInter2C.o b/serveur/Contraintes/CPointInter2C.o new file mode 100644 index 0000000000000000000000000000000000000000..bed4d0a433980876226136a4114406ae33957cf8 GIT binary patch literal 10912 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 E1&c3ckpKVy literal 0 HcmV?d00001 diff --git a/serveur/Contraintes/CPointInter2D.cpp b/serveur/Contraintes/CPointInter2D.cpp new file mode 100644 index 0000000..8543372 --- /dev/null +++ b/serveur/Contraintes/CPointInter2D.cpp @@ -0,0 +1,78 @@ +#include "CPointInter2D.h" + +#include "../Formes/Droite.h" +#include "../Formes/Point.h" + +#include "math.h" + +CPointInter2D::CPointInter2D() +:d1(NULL),d2(NULL) +{ + CalculerCoordonnees(); +} + +CPointInter2D::CPointInter2D(const CPointInter2D &cp) +:CPoint(cp),d1(cp.d1),d2(cp.d2) +{} + +CPointInter2D::CPointInter2D(CDroite *dd1, CDroite *dd2) +:d1(dd1),d2(dd2) +{ + //on signale à dd1 et dd2 que ce point a été construit par contraintes sur eux. + if (dd1 != NULL) + dd1->AjouterEnfant(this); + if (dd2 != NULL) + dd2->AjouterEnfant(this); + + CalculerCoordonnees(); +} + +CPointInter2D::~CPointInter2D() +{ +} + +void CPointInter2D::CalculerCoordonnees() +{ + double d, x, y; + const Droite *dd1 = d1->Solution(); + const Droite *dd2 = d2->Solution(); + + delete []choix; + choix=NULL; + + //Si une des droites n'est pas définie + //alors il n'y a pas de solutions + if (dd1 == NULL || dd1 == NULL) + { + possibilites = 0; + CalculerDependants(); + return; + } + + //on regarde si il y a une infinité de solutions + if (fabs(d = dd2->A()*dd1->B() - dd1->A()*dd2->B()) < EPSILON) + { + possibilites = -1; + CalculerDependants(); + return; + } + + possibilites = 1; + choix = new Point[possibilites]; + //calcul de la solution + x = (dd1->C()*dd2->B() - dd2->C()*dd1->B())/d; + if (fabs(dd1->B()) > EPSILON) + y = (-dd1->C() - dd1->A()*x)/dd1->B(); + else if (fabs(dd2->B()) > EPSILON) + y = (-dd2->C() - dd2->A()*x)/dd2->B(); + else + { + possibilites = -1; + CalculerDependants(); + return; + } + + choix[0] = Point(x,y); + + CalculerDependants(); +} diff --git a/serveur/Contraintes/CPointInter2D.h b/serveur/Contraintes/CPointInter2D.h new file mode 100644 index 0000000..588f890 --- /dev/null +++ b/serveur/Contraintes/CPointInter2D.h @@ -0,0 +1,62 @@ +#ifndef __CPOINTINTER2D__ +#define __CPOINTINTER2D__ + +#include "CDroite.h" +#include "CPoint.h" + +//! Classe CPointInter2D. +/*! + Définit un Point construit par intersection de deux droites. Dans le cas général il y a une seule solution. + Dans le cas où les droites sont parallèles il n'y a pas d'intersection. + Dans le cas où les droites sont confondues il y a une infinité de solutions. + Les deux derniers cas arrivent quand d2.A()*d1.B() - d1.A()*d2.B() + IL FAUT DIFFERENCIER LES DEUX CAS : PARALLELES ET CONFONDUES. +*/ +class CPointInter2D : public CPoint +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit avec des droites inconnues. Ne doit pas être utilisé. + */ + CPointInter2D(); + //! Constructeur. + /*! + Constructeur par copie. + param p : point à copier. + */ + CPointInter2D(const CPointInter2D &p); + //! Constructeur. + /*! + Constructeur à partir de deux droites. C'est celui qui devra être utilisé. + param d1 : première droite. + param d2 : deuxième droite. + */ + CPointInter2D(CDroite *d1, CDroite *d2); + //! Destructeur. + /*! + Détruit les solutions possibles. + */ + ~CPointInter2D(); + + //! Fonction. + /*! + On recalcule les coordonnées du point. Selon la solution retenue on va calculer les coordonnées. Dans le cas où il n'y a pas de solutions ou une infinité on ne fait rien. + */ + void CalculerCoordonnees(); + + private : + //! Donnée privée. + /*! + Première droite du point. + */ + const CDroite *d1; + + //! Donnée privée. + /*! + Deuxième droite du point. + */ + const CDroite *d2; +}; + +#endif diff --git a/serveur/Contraintes/CPointInter2D.o b/serveur/Contraintes/CPointInter2D.o new file mode 100644 index 0000000000000000000000000000000000000000..ed8e98d18cc3c7cfc0d7b9fab41869871f1bb51e GIT binary patch literal 5952 zcmc&%Z){sv6~8ZbHp7zE>jH{KI^1rIw4-jErfItmkj8oa-_C2|4#pzSab6pz$+Kra zXDK2q!|9aAOQe2i(FCnlX$2~@p?=szhcs5!(5+}6Kz>bza5HHG3fk7#wyUp#;0 zf7(-i&WFE3Zt+n?eU@5fwbYuewU%htnXPpf&m+fA?|HX*jPiKC7iBKjXF7udaHny*0|aW^@7!D>|_$ zQe)KQ`zQQ-oD(v_>@_>6?H7@1_`KIr!@t0xNoL%W$N$`NuJv+l$sW1!Ly!1WFUtT^ zoo9JRlSPGkcKYH}=NXr_^E6i!{U&#xp6ov}b)p4_gLRnyKh}n}sopfBw@j`vxn_#D zuUwm|q=Y`a@%yWPn^294S&=1t3Osc2ptc|6X|l>i5{sd z#+V!@-Q?@Up3L2x>YORFD_t?ZLuXj`l zpiPxZ5|tlEo0s?wSF~1Fw&gurf_`pqgRNI`{Ajp1^t|Xny@dKWYDt`3K|k3?QJ3JX zSj--P?KJ8(*pC6dq;T~?st-`7B_~wQp?+?n8kp2gz>+-n+Ijfl|FgT;8(^QggS{Rx zBe1W;LVXj#y{%BlJh$dO+k<}3A3VWYbj8@#aQN{+{nkCvRe^QEreIT`v7wH{YJbCXk={cku7)y4QU79=m+#%urH|}Oz8@hSP1cAf4zge()!(n_2Bz&lE%YH^%9+@=jNZUQ_bzzzHHP>F z)XyxaSpYX~1nYP|bmUJwAL^Hcj3wmd4M!|e$as&TP5e*dHGo6$(G@QguS>KE$VP>> zij!B1;1pjL+1>+%lNW#?AW1;k-hsAryy?&5EP{^4OGA?59YEU|uLbd{pp!+8Hv@$; z-f6_6vxDN1UdH3%b>mG1*fs}S0KfA1O(AjoJHHq!*I_yil_M1NPFpK_ms>$#k?Equm^xEuv4D_%JY=?F9|yV@##L0cMsWL zgDmeEk}p7(h4`0I7pRZ-*@J50ZOb{O2Ic`-AMGkmY?r z@+&U>&t3AbUGfJmdCn!zyW}dzW~BU=x#WOLZg9zAm)s#_TIm(o4?QmXcUHw*mZC@dl zUu@-`p-tgxLS!yK=jS%G_NHF{tjo2%k5%b@8#a zHP}PmDO20np6bgP$&_yE*YkH~o9)~kw?m7(H_B;l)6$yWjoig7?`*b*8QLs@OSzTH zdc2qB(heOKc@=%a&W>T-yR%zP7tbZ$E@!x-?D0ZT`J8SD_oR~9WCqkE^|e#%qENG{ z52Oxh89BPYC_A(EnBF|0VRbI8%t@>$WyaPL)-$$+5cxet zh`bU)evS})41+1F?DwaFA5C=jE6eTsR>At<>CBYX_WMu4LzsS7DPO@q!ZpG_DE!yj zZy}`t?;WyNFa`>vpS*O}ll-KR`-D6u@HK&N3j1$`d_~B&giLof#c2}QA+VDW{rnpe C-d;EW literal 0 HcmV?d00001 diff --git a/serveur/Contraintes/CPointIsole.cpp b/serveur/Contraintes/CPointIsole.cpp new file mode 100644 index 0000000..9b5b48c --- /dev/null +++ b/serveur/Contraintes/CPointIsole.cpp @@ -0,0 +1,41 @@ +#include "CPointIsole.h" + +CPointIsole::CPointIsole() +:x(0),y(0) +{ + CalculerCoordonnees(); +} + +CPointIsole::CPointIsole(const CPointIsole &cp) +:CPoint(cp),x(cp.x),y(cp.y) +{ +} + +CPointIsole::CPointIsole(const double &xx, const double &yy) +:x(xx),y(yy) +{ + CalculerCoordonnees(); +} + +CPointIsole::~CPointIsole() +{ +} + +void CPointIsole::CalculerCoordonnees() +{ + delete [] choix; + + possibilites = 1; + choix = new Point[possibilites]; + choix[0] = Point(x,y); + + CalculerDependants(); +} + +void CPointIsole::ModifierPoint(const double &xx, const double &yy) +{ + x = xx; + y = yy; + CalculerCoordonnees(); + CalculerDependants(); +} diff --git a/serveur/Contraintes/CPointIsole.h b/serveur/Contraintes/CPointIsole.h new file mode 100644 index 0000000..5ca3279 --- /dev/null +++ b/serveur/Contraintes/CPointIsole.h @@ -0,0 +1,63 @@ +#ifndef __CPOINTISOLE__ +#define __CPOINTISOLE__ + +#include "CPoint.h" + +//! Classe CPointIsole. Définit un Point construit par contraintes. +/*! + Il n'y a aucun cas particulier : dans tous les cas il y a une et une seule possibilité. +*/ +class CPointIsole : public CPoint +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit un Point de coordonnées nulles. + */ + CPointIsole(); + //! Constructeur. + /*! + Constructeur par copie. + param p : point à copier. + */ + CPointIsole(const CPointIsole &p); + //! Constructeur. + /*! + Constructeur à partir de deux réels. + param x : coordonnée x du point. + param y : coordonnée y du point. + */ + CPointIsole(const double &x, const double &y); + //! Destructeur. + /*! + Destructeur. On détruit les possibilités créées. + */ + ~CPointIsole(); + + //! Fonction. + /*! + On recalcule les coordonnées du point. il n'y a aucun changement en théorie vu que l'objet est construit qu'à partir de constantes. + */ + void CalculerCoordonnees(); + + //! Fonction + /*! + On change les coordonnées et on recalcule par dépendances les points construit par contraintes. + */ + void ModifierPoint(const double &x, const double &y); + + private : + //! Donnée privée. + /*! + coordonnée X du point. + */ + double x; + + //! Donnée privée. + /*! + coordonnée Y du point. + */ + double y; +}; + +#endif diff --git a/serveur/Contraintes/CPointIsole.o b/serveur/Contraintes/CPointIsole.o new file mode 100644 index 0000000000000000000000000000000000000000..015c27bebcb5c9a79bfe16cbbd501884182b4d6c GIT binary patch literal 4916 zcmc&%U2Ggz6+W}OhNU>k60MLM0&LP09IA}Gj*})lR8Ds%ZJIc2Vs9iO+|hVFi8oo# zy1V0K4K77Y5Sb3G5Gn{&q7M~9NJOX)MJkm++s0B75g|WBYLNoCl0lIis{TFX!Rq!q zv-f&uCUJ@?Dz1F@-0z(4oO|y7_$lqsennA87KP%}K}7S(wq?K-sr8c))k6d zejncG%9V>h{Xh5Z+)U!HHNDozJ+0d-Z1x6wRtN5Dwt0gYcOQ@Y%0-Oee-q{IYvA{r z@H#8tX(_MZD?Ziv|MdFBtgUXc@J4xscdWBW=bHBVu%*3YKGrk#i9O?Md17_)NY`nk z$sY2GoVqudc5Yw=URz9fN7KsdZgGjV#ihN4w4HV)mr{Q6OY%r9zXiPNSCDFGE)6Dl z$Y{CRq9i3;?M+X66VaV!VwLS`*S+F(=kDqJ3Qwadef_R23o$4^Yo(yh^cUV^c^(%sdO$fdC%~!8N#~ZMBnusApwt^CT<1D z)&lOraKI}UF{!PV(!H*W=&`O5dIEASyuYhJlL31GZ+hr4qKit`HHBV{JwWtctZOAk z&&R)t@SnJd>)rRyW^;vV*|HDRs}&QP9uZafZs8Cqv&ql2ad#qdUdf=%mCN@~6WrLh zKKY~A!|S^8PJF+b^6h!3XHk7l>UPd%s3uTvq3%Zw#W|#=*nS@MA?)`%*)y>H7WEwL zXCV`;xI-RSp)k2<=cV(;z&O%Y8G``^e$q_RLOoKpn{R_w@~A`?Gs8 zy;C)_W>!q2Zf?)?=FPFPVfmb$J9cj;QtLC5wlM~2*V=MIw&11OX2T|R+^`K&$Le)b zPnJr$*(jM)whlTrh03&(*0fqFTc@j5$y95qethIucX(T?ELO;PIIBMY<9NI+IX*dR(q z$cG_=@ICu`^I4WodpH-jo8meFah!&yH@*uoxnw21u1D+Pb}A+P+M(#-d@bKm8E zmI=zZ;k#SLDNes_$_ejP)XAW&GKN=&vFlr7r%XG$N6u#6oHDI(!?ML>hSJLJ9IB3& zPn6A?pF(G3Baz3PQ}F{on474U>*X4#Wlr#*Smo?)%{o(^F>Axs%CudsT6L|kd$?LU zZQ7uX96Oxt)AdrLVT_f}Wc$&sm-SM`sMmFSX3Esd)`_ad#K-fhBl<680+szrk`VQ7@htmVl&eYkwOkn0$mH1s_)!A}RR6 z6q0g(`x`>}8u{P7%6(9>{_DcOSNLz|w*&fb5FsQf7~2k(=<88|j|f~5_$NYM5b_Vg dz98`51pYu^e?1YG?{|(rBIGDb^z#FOKLS{qcoF~r literal 0 HcmV?d00001 diff --git a/serveur/Contraintes/CPointMilieu2P.cpp b/serveur/Contraintes/CPointMilieu2P.cpp new file mode 100644 index 0000000..d7373b3 --- /dev/null +++ b/serveur/Contraintes/CPointMilieu2P.cpp @@ -0,0 +1,54 @@ +#include "CPointMilieu2P.h" + +#include "../Formes/Droite.h" +#include "../Formes/Point.h" +#include "stdlib.h" + +CPointMilieu2P::CPointMilieu2P() +:p1(NULL),p2(NULL) +{ + CalculerCoordonnees(); +} + +CPointMilieu2P::CPointMilieu2P(const CPointMilieu2P &cp) +:CPoint(cp),p1(cp.p1),p2(cp.p2) +{} + +CPointMilieu2P::CPointMilieu2P(CPoint *pp1, CPoint *pp2) +:p1(pp1),p2(pp2) +{ + //on signale à pp1 et pp2 que ce point a été construit par contraintes sur eux. + if (pp1 != NULL) + pp1->AjouterEnfant(this); + if (pp2 != NULL) + pp2->AjouterEnfant(this); + + CalculerCoordonnees(); +} + +CPointMilieu2P::~CPointMilieu2P() +{ +} + +void CPointMilieu2P::CalculerCoordonnees() +{ + const Point *pp1 = p1->Solution(); + const Point *pp2 = p2->Solution(); + + delete []choix; + choix = NULL; + + //Si un des points n'est pas définie + //alors il n'y a pas de solutions + if (pp1 == NULL || pp2 == NULL) + { + possibilites = 0; + CalculerDependants(); + return; + } + + possibilites = 1; + choix = new Point[possibilites]; + choix[0] = Point((pp1->GetX()+pp2->GetX())/2, (pp1->GetY()+pp2->GetY())/2); + CalculerDependants(); +} diff --git a/serveur/Contraintes/CPointMilieu2P.h b/serveur/Contraintes/CPointMilieu2P.h new file mode 100644 index 0000000..3fd6a0d --- /dev/null +++ b/serveur/Contraintes/CPointMilieu2P.h @@ -0,0 +1,57 @@ +#ifndef __CPOINTMILIEU2P__ +#define __CPOINTMILIEU2P__ + +#include "CPoint.h" + +//! Classe CPointMilieu2P. +/*! + Définit un point comme étant le milieu de deux autres points. +*/ +class CPointMilieu2P : public CPoint +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit avec des points inconnus. Ne doit pas être utilisé. + */ + CPointMilieu2P(); + //! Constructeur. + /*! + Constructeur par copie. + param p : point à copier. + */ + CPointMilieu2P(const CPointMilieu2P &p); + //! Constructeur. + /*! + Constructeur à partir de deux points. C'est celui qui devra être utilisé. + param p1 : premier point. + param p2 : deuxier point. + */ + CPointMilieu2P(CPoint*p1, CPoint *p2); + //! Destructeur. + /*! + Détruit les solutions possibles. + */ + ~CPointMilieu2P(); + + //! Fonction. + /*! + On recalcule les coordonnées du point. Selon la solution retenue on va calculer les coordonnées. Dans le cas où il n'y a pas de solutions ou une infinité on ne fait rien. + */ + void CalculerCoordonnees(); + + private : + //! Donnée privée. + /*! + Premier Point. + */ + const CPoint *p1; + + //! Donnée privée. + /*! + Deuxième Point. + */ + const CPoint *p2; +}; + +#endif diff --git a/serveur/Contraintes/CPointMilieu2P.o b/serveur/Contraintes/CPointMilieu2P.o new file mode 100644 index 0000000000000000000000000000000000000000..011b2c2258bc3821bd6cac1df3f9a9464b5547be GIT binary patch literal 5352 zcmc&&Z)hCH6`#F3xfgm?F3FXOT1n4#+{jM7)k(4~r5~#3w6R_P$wktc#vnGQ)5<#e zw0F7NbEFax(@jB}t*QH=Ed@aYF+~NpsE~jS{vgLHO+s)DaUuO6HH8!$i_OQaR$uG8SCHf9_x!9nIa^fDNBdbuYR zGh*iCa@1MmvWT$uCpW0;mlA3!R&UIC{bp`6W0N^^i&Y+Vw4uhA@)IheYouyoWGPD` zZpczD*vbVYWG;nj6IjY6JAKJ~J7lHbw9_EGX{GMcUuDrwFIwsIa5-Qp3+Bv1wbJy- z_vj(fraUh)G?nww>XC)DRZE$-)ALsPoH?_|jD7HXQdzK+Ia`^dBBU3o2y^D-96mF1 zJ<1|gVa~0>oCvn|v7J6=rRVM8d1sbO!eDX5yrZy@tFmOJV$Mq&ao(oeoEljfKI8nzT@QO0)b$REE@=ofE@}a0&3yo3T zYB44fT-#3Tce3;lqxE@XO_+xDYzycIVE-{NL<-*=qyp}0zJL7Hr+DI;=JDkqldv`J>m!~I<%m~mZ zxi~IH@RAK}%3$(n#>g;vq+Dk5iELKYrm|YmP(jaYOfD5%Gtp1z6*-^NPZsp7CYNOO z_|UP2?ILeXJlIHVj5gRvqG;N_a#{1d05K7e?Q~Wjs!&z3+)d3K8!~jER3g z9_Dnpkfc3U9m=;?Z}6;*nm&o5R=}FOPV{5shrreuM7iod)l;Fv2G0 zy^OJU-f_%(8aj$ed5U>|hq1@KzIYznA3b9X9UgrbL=!P6zIe7|>%jxKAxJ>MBNWe; z%&n9Z9I?IFW^~Gr-g#PsH(u+5jBWQQL_E;ynpYoUf313r^}iY@z9%4v!CDnvuOO@6 z%)#1QBkZ&@)?2Wy@)Ylj>qd-%bvuRRW}p2*hR0QFREOZ}AkI_}!4j z`9k*Nki}U-a>>V^hAhq!vi}IOI6FxGg^$1Fldt;Z-}~f$_~d{3OWYL9m*-v?{&SoxWRF@fp4NGnaO7>d99Qz6iTB7UDvd7UATT8y2MhU%kt^t~dXIDA?020Sxm?#IpZAa}cJ0@U=lP85n(ufggU7(3QBfpk{>-4L>rmrmg{E>!xi2|h z$dz*?aC4M^SW;rIqMs^EYbCL?GHN+k$ez>;&tpw=9x06G#&TN8nQ}dcp<_oA?W&rc zn#zpiP9-`pF6Y#2K2t8M#&l6rbNX08L8PI^I}(%!d10BVo|u|ai(08%&@=g*F|D3z z$2)`fCV=zfD?kY^5uINFykO4~;^29K5QoncA$YF>iT4J{;9VpH?>$2BJ|_HzJBhbF=~4Gwlu#!+OQoIey-V7Ky9UX05heUO z_utL^W%mvueFOiWNOsf)CPqI&4{-T8F6X)Y1CHl8zQyg=xcmn$-{x|Ro-5*ZaU9|} IOo(~@4eu5Mi2wiq literal 0 HcmV?d00001 diff --git a/serveur/Contraintes/Objet.cpp b/serveur/Contraintes/Objet.cpp new file mode 100644 index 0000000..0bf3c32 --- /dev/null +++ b/serveur/Contraintes/Objet.cpp @@ -0,0 +1,45 @@ +#include "Objet.h" + +#include "stdlib.h" + +Objet::Objet() +:possibilites(0), retenu(-1) +{} + +Objet::Objet(const Objet &o) +:possibilites(o.possibilites), retenu(o.retenu) +{ +} + +Objet::~Objet() +{ + //il faut détruire les objets dépendant de celui ci + list::iterator itliste; + + for (itliste=enfants.begin();itliste!=enfants.end();++itliste) + delete *itliste; + +} + +void Objet::Choisir (const int &i) +{ + if (i<=0) + retenu = 0; + else if (i>possibilites-1) + retenu = possibilites-1; + else + retenu=i; +} + +void Objet::AjouterEnfant (Objet *o) +{ + enfants.push_front(o); +} + +void Objet::CalculerDependants() +{ + list::iterator itliste; + + for (itliste=enfants.begin();itliste!=enfants.end();++itliste) + (*itliste)->CalculerCoordonnees(); +} diff --git a/serveur/Contraintes/Objet.h b/serveur/Contraintes/Objet.h new file mode 100644 index 0000000..b8c712b --- /dev/null +++ b/serveur/Contraintes/Objet.h @@ -0,0 +1,87 @@ +#ifndef __OBJET__ +#define __OBJET__ + +#include "../Connexion/Socket.h" +#include "stdio.h" + +#include "list" +using namespace std; + +//! Classe Objet. Classe à dériver pour faire un objet construit par contraintes. +/*! + Un Objet est ce que l'on va créer par l'intermédiaire du client. Ceci contient les contraintes. Ainsi on mémorise le nombre de possibilités qu'offrent les contraintes saisies et le choix retenu par l'utilisateur. Le tableau des choix possibles quand les possibilités sont finies sera contenu dans une sous classe pour être spécifique à une Forme : Point, Cercle ou Droite. +*/ +class Objet +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. les possibilités sont nulles, aucun choix n'est proposé et aucun n'est retenu (-1). + */ + Objet(); + //! Constructeur. + /*! + Constructeur par copie. + param p : objet à copier. + */ + Objet(const Objet &o); + //! Destructeur. + /*! + Ne fait rien. + */ + virtual ~Objet(); + + //! Fonction. + /*! + Cette fonction abstraite devra être définie dans la classe finale pour calculer les possibilités en fonction des contraintes de l'Objet. + */ + virtual void CalculerCoordonnees()=0; + + //! Fonction. + /*! + Cette fonction permet de choisir une des solutions proposées. Elle est virtuelle car si il y a plusieurs solutions possibles on utilise deux variables pour stocker le choix désiré : le choix entré et le choix réel qui peut être différent si le nombre de solutions a diminué depuis et que la solution n'est plus possible. + \param i : solution qu l'on choisit + */ + virtual void Choisir (const int &i); + + //! Fonction + /*! + Envoie la liste des possibilités dans la socket passée en paramètre. On envoie d'abord le nombre de solutions puis les solutions elles mêmes. Selon la forme le format d'envoi est différent. + \param sock : Socket dans laquelle on envoit la liste. + */ + virtual void EnvoyerSolutions(Socket *sock) const=0; + + //! Fonction. + /*! + Ajoute un objet dépendant de cet objet. + \param o : pointeur sur l'objet dépendant de cet objet à rajouter. + */ + void AjouterEnfant (Objet *o); + + protected : + //! Donnée protégée. + /*! + Nombre de possibilités de construction selon le dernier calcul de coordonnées. + */ + int possibilites; + //! Donnée protégée. + /*! + Indice de la solution retenue. + */ + int retenu; + + //! Fonction. + /*! + Fonction qui va recalculer les coordonnées des objets dépendants de celui ci. + */ + void CalculerDependants(); + + private : + //! Donnée privée. + /*! + Liste des objets construits par contraintes sur cet objet. + */ + list enfants; +}; + +#endif diff --git a/serveur/Contraintes/Objet.o b/serveur/Contraintes/Objet.o new file mode 100644 index 0000000000000000000000000000000000000000..689900f6e07c954378dfa501a14f143fb89ec8f8 GIT binary patch literal 22376 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 YC)c}qLagR^z{or+_Q46CBE@9>ZyCa0ng9R* literal 0 HcmV?d00001 diff --git a/serveur/Contraintes/makefile b/serveur/Contraintes/makefile new file mode 100755 index 0000000..72c76fb --- /dev/null +++ b/serveur/Contraintes/makefile @@ -0,0 +1,96 @@ +CPPC = g++ +OBJS = Objet.o CPoint.o CDroite.o CCercle.o CPointIsole.o CPointAppart1D.o CPointAppart1C.o CPointInter2D.o CPointInter2C.o CPointInter1C1D.o CPointMilieu2P.o CPointCentre1C.o CDtePassant2P.o CDteHorizPassant1P.o CDteVertPassant1P.o CDtePerp1DPassant1P.o CDteParall1D.o CDteParall1DPassant1P.o CDteMediatrice2P.o CCerclePassant3P.o CCerclePassant1P.o CCercleTangent2D.o + +contraintes : $(OBJS) + +Objet.o : Objet.h ../Connexion/Socket.h + $(CPPC) -c Objet.cpp + +CPoint.o : CPoint.h CPoint.cpp ../Formes/Point.h Objet.h + $(CPPC) -c CPoint.cpp + +CDroite.o : CDroite.h CDroite.cpp ../Formes/Droite.h Objet.h + $(CPPC) -c CDroite.cpp + +CCercle.o : CCercle.h CCercle.cpp ../Formes/Cercle.h Objet.h + $(CPPC) -c CCercle.cpp + +#Point 1 +CPointIsole.o : CPointIsole.h CPointIsole.cpp CPoint.h + $(CPPC) -c CPointIsole.cpp + +#Point 2 +CPointAppart1D.o : CPointAppart1D.h CPointAppart1D.cpp CPoint.h CDroite.h + $(CPPC) -c CPointAppart1D.cpp + +#Point 3 +CPointAppart1C.o : CPointAppart1C.h CPointAppart1C.cpp CPoint.h CCercle.h + $(CPPC) -c CPointAppart1C.cpp + +#Point 4 +CPointInter2D.o : CPointInter2D.h CPointInter2D.cpp CDroite.h CPoint.h + $(CPPC) -c CPointInter2D.cpp + +#Point 5 +CPointInter2C.o : CPointInter2C.h CPointInter2C.cpp CDroite.h CPoint.h + $(CPPC) -c CPointInter2C.cpp + +#Point 6 +CPointInter1C1D.o : CPointInter1C1D.h CPointInter1C1D.cpp CDroite.h CPoint.h + $(CPPC) -c CPointInter1C1D.cpp + +#Point 7 +CPointMilieu2P.o : CPointMilieu2P.h CPointMilieu2P.cpp CPoint.h + $(CPPC) -c CPointMilieu2P.cpp + +#Point 8 +CPointCentre1C.o : CPointCentre1C.h CPointCentre1C.cpp CPoint.h CCercle.h + $(CPPC) -c CPointCentre1C.cpp + + +#Droite 1 +CDtePassant2P.o : CDtePassant2P.h CDtePassant2P.cpp CDroite.h CPoint.h + $(CPPC) -c CDtePassant2P.cpp + +#Droite 2 +CDteHorizPassant1P.o : CDteHorizPassant1P.h CDteHorizPassant1P.cpp CDroite.h CPoint.h + $(CPPC) -c CDteHorizPassant1P.cpp + +#Droite 3 +CDteVertPassant1P.o : CDteVertPassant1P.h CDteVertPassant1P.cpp CDroite.h CPoint.h + $(CPPC) -c CDteVertPassant1P.cpp + +#Droite 4 +CDtePerp1DPassant1P.o : CDtePerp1DPassant1P.h CDtePerp1DPassant1P.cpp CDroite.h CPoint.h + $(CPPC) -c CDtePerp1DPassant1P.cpp + +#Droite 5 +CDteParall1D.o : CDteParall1D.h CDteParall1D.cpp CDroite.h CPoint.h + $(CPPC) -c CDteParall1D.cpp + +#Droite 6 +CDteParall1DPassant1P.o : CDteParall1DPassant1P.h CDteParall1DPassant1P.cpp CDroite.h CPoint.h + $(CPPC) -c CDteParall1DPassant1P.cpp + +#Droite 7 +CDteMediatrice2P.o : CDteMediatrice2P.h CDteMediatrice2P.cpp CDroite.h CPoint.h + $(CPPC) -c CDteMediatrice2P.cpp + +#Cercle 1 +CCerclePassant3P.o : CCerclePassant3P.h CCerclePassant3P.cpp CPoint.h CDroite.h CCercle.h + $(CPPC) -c CCerclePassant3P.cpp + +#Cercle 2 et 3 +CCerclePassant1P.o : CCerclePassant1P.h CCerclePassant1P.cpp CPoint.h CCercle.h + $(CPPC) -c CCerclePassant1P.cpp + +#Cercle 4 +CCercleTangent2D.o : CCercleTangent2D.h CCercleTangent2D.cpp CPoint.h CDroite.h CCercle.h + $(CPPC) -c CCercleTangent2D.cpp + +#Cercle 5 +#Cercle 6 +#Cercle 7 + +clean : + rm *.o diff --git a/serveur/Doxyfile b/serveur/Doxyfile new file mode 100644 index 0000000..6c4e051 --- /dev/null +++ b/serveur/Doxyfile @@ -0,0 +1,207 @@ +# Doxyfile 1.3.5 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +PROJECT_NAME = Dessin +PROJECT_NUMBER = 0 +OUTPUT_DIRECTORY = /home/tom/public_html/ +OUTPUT_LANGUAGE = French +USE_WINDOWS_ENCODING = NO +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = +ALWAYS_DETAILED_SEC = YES +INLINE_INHERITED_MEMB = YES +FULL_PATH_NAMES = NO +STRIP_FROM_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = NO +INHERIT_DOCS = NO +DISTRIBUTE_GROUP_DOC = NO +TAB_SIZE = 8 +ALIASES = +OPTIMIZE_OUTPUT_FOR_C = YES +OPTIMIZE_OUTPUT_JAVA = NO +SUBGROUPING = YES +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = YES +EXTRACT_PRIVATE = YES +EXTRACT_STATIC = YES +EXTRACT_LOCAL_CLASSES = YES +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = YES +SHOW_INCLUDE_FILES = YES +INLINE_INFO = NO +SORT_MEMBER_DOCS = YES +GENERATE_TODOLIST = NO +GENERATE_TESTLIST = NO +GENERATE_BUGLIST = NO +GENERATE_DEPRECATEDLIST= NO +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = YES +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = +FILE_PATTERNS = +RECURSIVE = YES +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_SOURCE_FILES = NO +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = YES +INLINE_SOURCES = YES +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES +VERBATIM_HEADERS = YES +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = YES +COLS_IN_ALPHA_INDEX = 4 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +BINARY_TOC = NO +TOC_EXPAND = NO +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = NO +TREEVIEW_WIDTH = 250 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4 +EXTRA_PACKAGES = +LATEX_HEADER = +PDF_HYPERLINKS = NO +USE_PDFLATEX = YES +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = NO +XML_OUTPUT = xml +XML_SCHEMA = +XML_DTD = +XML_PROGRAMLISTING = YES +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = NO +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::addtions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +HIDE_UNDOC_RELATIONS = NO +HAVE_DOT = NO +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +UML_LOOK = YES +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DOT_IMAGE_FORMAT = png +DOT_PATH = +DOTFILE_DIRS = +MAX_DOT_GRAPH_WIDTH = 1024 +MAX_DOT_GRAPH_HEIGHT = 1024 +MAX_DOT_GRAPH_DEPTH = 0 +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::addtions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO diff --git a/serveur/Formes/Cercle.cpp b/serveur/Formes/Cercle.cpp new file mode 100644 index 0000000..8177dd1 --- /dev/null +++ b/serveur/Formes/Cercle.cpp @@ -0,0 +1,53 @@ +#include "Cercle.h" + +Cercle::Cercle() +:centre(0,0),rayon(0) +{} + +Cercle::Cercle(const Cercle &c) +:centre(c.centre),rayon(c.rayon) +{} + +Cercle::Cercle(const Point &c, const double &r) +:centre(c),rayon(r) +{} + +Cercle::~Cercle() +{} + +Point Cercle::GetCentre() const +{ + return centre; +} + +void Cercle::SetCentre(const Point &c) +{ + centre = Point(c); +} + +double Cercle::GetRayon() const +{ + return rayon; +} + +void Cercle::SetRayon(const double &r) +{ + rayon = r; +} + +Cercle &Cercle::operator =(const Cercle &c) +{ + rayon = c.rayon; + centre = c.centre; + return *this; +} + +bool Cercle::operator==(const Cercle &c) const +{ + return rayon == c.rayon && centre == c.centre; +} + +bool Cercle::operator!=(const Cercle &c) const +{ + return rayon != c.rayon && centre != c.centre; +} diff --git a/serveur/Formes/Cercle.h b/serveur/Formes/Cercle.h new file mode 100644 index 0000000..c6ec9e2 --- /dev/null +++ b/serveur/Formes/Cercle.h @@ -0,0 +1,78 @@ +#ifndef __CERCLE__ +#define __CERCLE__ + +#include "Point.h" + +#include "../Global.h" + +//! Classe Cercle. +/*! + Définit un Cercle à partir d'un centre et d'un rayon. +*/ +class Cercle +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit un cercle avec un centre à (0,0) et un rayon 0. Ce constructeur ne devrait pas être appelé en théorie. + */ + Cercle(); + //! Constructeur. + /*! + Constructeur par copie. + \param c : cercle à copier. + */ + Cercle(const Cercle &c); + //! Constructeur. + /*! + Constructeur à partir d'un point et d'un entier. + \param centre : Point qui représente le centre du cercle. + \param rayon : rayon du cercle à créer. + */ + Cercle(const Point ¢re, const double &rayon); + //! Destructeur. + /*! + Destructeur. On ne fait rien dedans. + */ + ~Cercle(); + + //! Accesseur. + /*! + \return Le centre du cercle. + */ + Point GetCentre() const; + //! Accesseur. + /*! + Modifie le centre du cercle. + */ + void SetCentre(const Point &); + //! Accesseur. + /*! + \return Le rayon du cercle. + */ + double GetRayon() const; + //! Accesseur. + /*! + Modifie le rayon du cercle. + */ + void SetRayon(const double &); + + Cercle &operator=(const Cercle &c); + + bool operator==(const Cercle &c) const; + bool operator!=(const Cercle &c) const; + + protected : + //! Donnée protégée. + /*! + Centre du cercle. + */ + Point centre; + //! Donnée protégée. + /*! + Rayon du cercle. + */ + double rayon; +}; + +#endif diff --git a/serveur/Formes/Cercle.o b/serveur/Formes/Cercle.o new file mode 100644 index 0000000000000000000000000000000000000000..3c630850bb6e0223ce073dd5ad8fd70d37268bb1 GIT binary patch literal 3188 zcmcIl&u<$=6n>5!x)cYwRSQ+Az=D91qOOuOjS{3vY3yxE6I#cXFG#85INLNLv0Zyp zlByDsTtuxUsQd%KAqNgQfZ%|*P-q3@))V4~B60{Ks5umq}fRV;; z-uu4y=DnHm+qaD2(>|Y%)bNp?>Kf5fvp~8X(MBz_my+e*N}GpDn}ILb_$B|8jjeLB zvS@6@+_wAWRPKC-N2Uc$1{GTFfrA@6m8}x2(8$mmE z!0r!~J-h!0+>jj$*rdWbHSH30XQn&RmD|dHn>B%xw?}2{zO^>%z?o@)q*8G~3YRIXZX0YHT?<=7@y!#%$@vi z!Tu6XYBzihcntVckRJb6#s1tRF7ASd;S&aS4fFX%|7gj7Ru54t>`~w!V5WEEXy-vA zKC5YPI+}>|M&1RH%e%lY06*J^=LEhC{Nr748jM6<3AYWNOSXrP>)m>HxT~Y1yR)ma zH{6ylm<4m%Oc%}ea9h+IpGs#P&hcYC?Z~D$KVzlGA+3Utm(&Vgx@FE;q)()+H0k5T zBI%QvOv;?gn0YG&`m{+p)67e$i-q(Iv~12Yb>wlZXr(i6ke)>E`u<_q_svsX7L*cGpos0duf%9ef6=ju_T1cOv;sgV`Ah8-u3S z4gg-Cvk*TD!{5JFDgvzS*&v`)uUMd47wT|?`ureqZsGdswc6& zp~#TT{|8g`BgPN94w!M?n=kY*1mh>6ABN67lJz8X)u&jWgs%D$>sQ%d4vxotOZ6qj zKWxB1ZO|!V7BbVOp2_Da_4>IUp+>rlE3BS~<)*S$q|=BGO(Z%~ZbqkI)E(kO35VeF z5e7x!C|*k!EP{^s-rzd}QBPh`Zw^Wwk{k97npOneu3&Pi$?Tg`*@;x#EY6}c)=TY6 z)L3fIdgbXvEoT+A7g6Ks`CQghe=nj4tGALJ0+^TUF-7rii_AT1Hj-+V)a2Y;DsL8w zxomoR%9>AI>A=08z--z}^p2FDvuq(+lQM{VXT3+tQI`9Oic-EO?Vm{b70aiIevtU@ zEDsX>E%i9wDC6(5#0T{kme2B=MQ_1Jqm?CWQ7I>+ye{REly{_Dmok9(?AI#g87W6t Pq9^91ep5=$m-+t!+M=Yz literal 0 HcmV?d00001 diff --git a/serveur/Formes/Droite.cpp b/serveur/Formes/Droite.cpp new file mode 100644 index 0000000..49d9a03 --- /dev/null +++ b/serveur/Formes/Droite.cpp @@ -0,0 +1,98 @@ +#include "Droite.h" + +#include "values.h" +#include "math.h" +#include "../Global.h" + +Droite::Droite() +:a(0),b(0),c(0) +{} + +Droite::Droite(const Droite &d) +:a(d.a),b(d.b),c(d.c) +{} + +Droite::Droite(const double &aa, const double &bb, const double &cc) +:a(aa),b(bb),c(cc) +{ + //on va normaliser les coordonnées pour avoir des constantes plus petites + double norme = sqrt(a*a + b*b); + if (fabs(norme) > EPSILON) + { + a /= norme; + b /= norme; + c /= norme; + } +} + +Droite::Droite(const Point &p1, const Point &p2) +:a(p2.GetY() - p1.GetY()),b(p1.GetX() - p2.GetX()),c(p1.GetY()*(p2.GetX() - p1.GetX()) - p1.GetX()*(p2.GetY() - p1.GetY())) +{ + //on va normaliser les coordonnées pour avoir des constantes plus petites + double norme = sqrt(a*a + b*b); + if (fabs(norme) > EPSILON) + { + a /= norme; + b /= norme; + c /= norme; + } +} + +Droite::~Droite() +{} + +double Droite::A() const +{ + return a; +} + +void Droite::SetA(const double &aa) +{ + a = aa; +} + +double Droite::B() const +{ + return b; +} + +void Droite::SetB(const double &bb) +{ + b = bb; +} + +double Droite::C() const +{ + return c; +} + +void Droite::SetC(const double &cc) +{ + c = cc; +} + +double Droite::GetPente() const +{ + if (fabs(b) < EPSILON) + return MAXDOUBLE; + else + return -a/b; +} + +Droite &Droite::operator =(const Droite &d) +{ + a = d.a; + b = d.b; + c = d.c; + return *this; +} + +bool Droite::operator==(const Droite &d) const +{ + return (fabs(a - d.a) < EPSILON && fabs(b - d.b) < EPSILON && fabs(c - d.c) < EPSILON); +} + +bool Droite::operator!=(const Droite &d) const +{ + return !(d == *this); +} diff --git a/serveur/Formes/Droite.h b/serveur/Formes/Droite.h new file mode 100644 index 0000000..993f2ca --- /dev/null +++ b/serveur/Formes/Droite.h @@ -0,0 +1,110 @@ +#ifndef __DROITE__ +#define __DROITE__ + +#include "Point.h" + +#include "../Global.h" + +//! Classe Droite. +/*! + Définit une Droite par son équation cartésienne. +*/ +class Droite +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit une droite d'équation 0x + 0y +0 = 0. Cela ne doit pas être appelé en théorie. + */ + Droite(); + //! Constructeur. + /*! + Constructeur par copie. + param d : droite que l'on veut copier. + */ + Droite(const Droite &d); + //! Constructeur. + /*! + Constructeur à partir de trois réels. Ces réels représentent les constants a, b et c de l'équation cartésienne : ax + by + c = 0 + param a : première constante. + param b : deuxième constante. + param c : troisième constante. + */ + Droite(const double &a, const double &b, const double &c); + //! Constructeur. + /*! + Constructeur à partir de deux points. Les deux points sont deux points par lesquels passent la droite. + param p1 : premier point. + param p2 : deuxième point. + */ + Droite(const Point &p1, const Point &p2); + //Droite(const Point *, const double &pente); + //! Destructeur. + /*! + Destructeur. On ne fait rien dedans. + */ + ~Droite(); + + //! Accesseur. + /*! + \return La constante a de l'équation cartésienne de la droite. + */ + double A() const; + //! Accesseur. + /*! + Modifie la constante a de l'équation cartésienne de la droite. + */ + void SetA(const double &a); + //! Accesseur. + /*! + \return La constante b de l'équation cartésienne de la droite. + */ + double B() const; + //! Accesseur. + /*! + Modifie la constante b de l'équation cartésienne de la droite. + */ + void SetB(const double &b); + //! Accesseur. + /*! + \return La constante c de l'équation cartésienne de la droite. + */ + double C() const; + //! Accesseur. + /*! + Modifie la constante c de l'équation cartésienne de la droite. + */ + void SetC(const double &c); + + //! Fonction. + /*! + Cette fonction retourne la pente de la droite. En cas de pente infinie (droite de type x = c) on retourne DBL_MAX + \return La pente de la droite. + */ + double GetPente() const; + + + Droite &operator=(const Droite &d); + + bool operator==(const Droite &d) const; + bool operator!=(const Droite &d) const; + + protected : + //! Donnée protégée. + /*! + constante a de l'équation cartésienne de la droite. + */ + double a; + //! Donnée protégée. + /*! + constante b de l'équation cartésienne de la droite. + */ + double b; + //! Donnée protégée. + /*! + constante c de l'équation cartésienne de la droite. + */ + double c; +}; + +#endif diff --git a/serveur/Formes/Droite.o b/serveur/Formes/Droite.o new file mode 100644 index 0000000000000000000000000000000000000000..fae989b92002413250b9c9f0e6086dfc4ce25190 GIT binary patch literal 3860 zcmeHJU1%It6uz5m?6lp4F+@q*P!~xhv2@9wHHr!O*=Z^dX z>6G+AUx7;22dlyhZ{LgAhT<~@yhc8I3orpoA$^-fpZe>gL>T8(UqC(HIS zHlkK>1qDs5Vuob0v?V&E^kM1d<@4jU>t;>uayFOCrLM?kc->IejZjusGJ0suR5CYy zG|OmLZ!CWQ^AAgZTv4==mHkGDyP94%cXI%TKqHcXvIXVE1?=#Dyk5E_|7yL%snsJ! zSW2z>a?|q0-Yi=RpHQS@%jOl6zh{wqzcYHsM`&^UUzILjTuH<@(J>DYX_?@~H;)jTHO-MMEBC1ZrvbY)HteQGLmbnf!j`dx zW5B9fTl4L5X1#IQ;@kcm)x(d>H)_XDv#bsZ6q=P9i%)ekUu>43N>53!Zkdh9?(ga= zyzm^nUn^OJV-zanL-Bi*4}FjGh1Gv)Mntnrpw4L^VeH?X2L@?V;v*b%1%!NLEE=KCky2BG*9g zM;|C*td~~OSs}eq(p6p-OqD(zkS%)$)bE#WZf8B+-B0@Kdiq24{^meSpvB+R(9qJ@ z)Y$5;n@Xq&^@JKts`dW5pgKAcja!`N0|)CF3nWj+wCE_Lmaye8Cp9&I=m(NobnF!t7@Lg6)VPKf-(7nMG)ntEPN)A3 zJ`w<9FW2vZ+|I`&R?8WaF>xoxG@p3%%dwARY?sy24qv1Y{`O-`{5$dJvXOrrkJXmo zua%EUkPm84p*wli+ZcPnve+LHm*zV2$W|~$_k;4FrHVWbVNCu+)8Nn9gzZ@<#hC2G zd%{5!w)>$Ixsv$;c#%zb#22}exoQXY844f9v~F4-{j$*5>8}=qFGVoe97CXu=G1%H z@ASIz&HdjZ`FBPjEOybJQp)V7Bpj6HZ;`Nz(-C;Pl?S0V^h&If?p3=3KZ@}gblO9* z)46``!2K9!(C5&}u0o1N`|>jSERq!V*MP;_CjNVZ3`zWt3-Co?@z#m|9q=;Jrc4R{ z1o^82-v(X--o@=@h+P5l103%Ht_9xBaXoN5@Piz;0UvSL`+(yPdldL};O97h1~?5& z`$Fq^6Sx`|mtH*K4}jkSrhO$m2P_)p%Yuo?36zYnsVNp2=|5=0?k44w6E?bGlQPsh z9B~s0HN+VoZj9iMB~K=_LbkBEf)4dQHZVC6*M^%c?;N%CsM=9`1rE*g?lm!g*_a`T+7B2HHkr@M&LUC3!g9s?-Gs*4&O2G8D25l}r@ zq>8It6?ti9CNiZal9Tc1i3#m=`Pde~Zg3*O%jMkbWW!bQYQ)jA3~D!>`aNV7 literal 0 HcmV?d00001 diff --git a/serveur/Formes/Point.cpp b/serveur/Formes/Point.cpp new file mode 100644 index 0000000..36f8325 --- /dev/null +++ b/serveur/Formes/Point.cpp @@ -0,0 +1,53 @@ +#include "Point.h" + +Point::Point() +:x(0),y(0) +{} + +Point::Point(const Point &p) +:x(p.x), y(p.y) +{} + +Point::Point(const double &cx, const double &cy) +:x(cx), y(cy) +{} + +Point::~Point() +{} + +double Point::GetX() const +{ + return x; +} + +void Point::SetX(const double &cx) +{ + x =cx; +} + +double Point::GetY() const +{ + return y; +} + +void Point::SetY(const double &cy) +{ + y=cy; +} + +Point &Point::operator =(const Point &p) +{ + x = p.x; + y = p.y; + return *this; +} + +bool Point::operator==(const Point &p) const +{ + return x == p.x && y == p.y; +} + +bool Point::operator!=(const Point &p) const +{ + return x != p.x || y != p.y; +} diff --git a/serveur/Formes/Point.h b/serveur/Formes/Point.h new file mode 100644 index 0000000..bddf857 --- /dev/null +++ b/serveur/Formes/Point.h @@ -0,0 +1,78 @@ +#ifndef __POINT__ +#define __POINT__ + +#include "../Global.h" + +//! Classe Point. +/*! + Définit un Point en 2D. +*/ +class Point +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Dans ce cas on contruit un point de coordonnées (0,0). + */ + Point(); + //! Constructeur. + /*! + Constructeur par copie. + param p : point à copier. + */ + Point(const Point &p); + //! Constructeur. + /*! + Constructeur à partir de deux réels. + param x : coordonnée X du point. + param y : coordonnée Y du point. + */ + Point(const double &x, const double &y); + //! Destructeur. + /*! + Destructeur. On ne fait rien dedans. + */ + ~Point(); + + //! Accesseur. + /*! + \return La coordonnée X du point. + */ + double GetX() const; + //! Accesseur. + /*! + Modifie la coordonnée X du point. + param x : Coordonnée x à mettre. + */ + void SetX(const double &x); + //! Accesseur. + /*! + \return La coordonnée Y du point. + */ + double GetY() const; + //! Accesseur. + /*! + Modifie la coordonnée Y du point. + param y : Coordonnée y à mettre. + */ + void SetY(const double &y); + + Point &operator=(const Point &p); + + bool operator==(const Point &p) const; + bool operator!=(const Point &p) const; + + protected : + //! Donnée protégée. + /*! + coordonnée X du point. + */ + double x; + //! Donnée protégée. + /*! + coordonnée Y du point. + */ + double y; +}; + +#endif diff --git a/serveur/Formes/Point.o b/serveur/Formes/Point.o new file mode 100644 index 0000000000000000000000000000000000000000..71b0b8d7d6a9d2e4a6896ade52bd9b2ab9524737 GIT binary patch literal 1706 zcmbVLO=}ZT6n*(oA?QK{X%`A2Sp@XlnfIDEQ?crUn|sf_=bd}sO>$Q|I~E88 zm^c9zVjaZTo1j}sIWER}SvM?cDP^9~hZV4 zd&xEvVK1FMpuMx(m5uNVtxaD64OECUSu^-{?cJC6AC^CA%k8uoTp!?-w9-7S_-Z}4 zOy9MwwcYvutoJ>A{lM?lPzkPk)ELWUGAE+3++-mh9Z^$iDw-S~P9>6w(P*qzH|oY! zLvI-IXe?_Km-LFm85uejXH0F}Dw}!{-mJU+vWQIMrpeSr-PD;{Y&4i!shWn09zzXN zFI{13sah@@6_YmdmuEkCw1aNWr{DPi|IJe>%<~7~i5KE{M&eLP@D3wZVB7Hq!67|y z{Cc8x5(E(wmw3m;C8@RxvFJ(V2jFQG@FO(H%cG|;_$4H1<{lWmqYu^#ll2~TF}6d9 zpeBVtog?SN?Ay;yh4kbqVR;h5a!0~qtFB6jb+MgX@Cf{F=!Sj_tw_#W^%UT?v_2A<%UO;wjFrdq1i*uurhqYla>wHp#jcu-P1Kb~Lklzj +#include +#include +#include + +ListeCercles::ListeCercles() +:courant(0) +{ + pthread_rwlock_init(&verrou,NULL); +} + +ListeCercles::~ListeCercles() +{ + map::iterator itliste; + + //on va détruire tous les Cercles de la liste + pthread_rwlock_wrlock(&verrou); + + for (itliste=liste.begin();itliste!=liste.end();++itliste) + delete (*itliste).second; + + pthread_rwlock_unlock(&verrou); + + pthread_rwlock_destroy(&verrou); +} + +int ListeCercles::AjouterCercle(CCercle *c) +{ + pthread_rwlock_wrlock(&verrou); + + int r = courant; + liste[r]=c; + courant++; + + pthread_rwlock_unlock(&verrou); + + return r; +} + +void ListeCercles::SupprCercle(const int &i) +{ + map::iterator itliste; + + pthread_rwlock_wrlock(&verrou); + + //recherche de l'élément à supprimer + for (itliste=liste.begin() ; itliste!=liste.end(), (*itliste).first != i ; ++itliste); + + //si l'élément i se trouve dans la liste + if (itliste!=liste.end()) + { + liste.erase(itliste); + } + + pthread_rwlock_unlock(&verrou); +} + +CCercle *ListeCercles::GetCercle(const int &i) +{ + map::iterator itliste; + + pthread_rwlock_rdlock(&verrou); + + //recherche de l'élément à supprimer + for (itliste=liste.begin();itliste!=liste.end();++itliste) + { + if ((*itliste).first == i) + { + pthread_rwlock_unlock(&verrou); + return (*itliste).second; + } + } + + pthread_rwlock_unlock(&verrou); + + return NULL; +} + +int ListeCercles::NbCercles() +{ + map::size_type nb; + nb = liste.size(); + return int(nb); +} + +void ListeCercles::EnvoyerListe(Socket *sock) +{ + char buffer[TAILLE_BUFFER]; + map::iterator itliste; + map::size_type nb; + + pthread_rwlock_rdlock(&verrou); + + //envoi du nombre d'éléments dans la liste + nb = liste.size(); + sprintf(buffer,"%d\n",int(nb)); + sock->Ecrire(buffer); + + //parcours de la liste pour envoyer les objets à afficher + for (itliste=liste.begin();itliste!=liste.end();++itliste) + { + const Cercle *sol = ((*itliste).second)->Solution(); + //Si il y a une solution retenue on l'envoie + if (sol != NULL) + { + //numéro de Cercle, coordonnée X et Y du centre et rayon + sprintf(buffer,"%d %lf %lf %lf\n", (*itliste).first, sol->GetCentre().GetX(), sol->GetCentre().GetY(), sol->GetRayon()); + sock->Ecrire(buffer); + } + else + { + //on dit que l'objet n'a pas de solutions + sprintf(buffer,"%d -1\n", (*itliste).first); + sock->Ecrire(buffer); + } + } + + pthread_rwlock_unlock(&verrou); +} diff --git a/serveur/Listes/ListeCercles.h b/serveur/Listes/ListeCercles.h new file mode 100755 index 0000000..418a8a6 --- /dev/null +++ b/serveur/Listes/ListeCercles.h @@ -0,0 +1,82 @@ +#ifndef _LISTECERCLES_ +#define _LISTECERCLES_ + +#include "../Connexion/Socket.h" +#include "../Contraintes/CCercle.h" + +#include +#include +using namespace std; + +//! Classe ListeCercles. +/*! + Cette classe sert à modéliser une liste qui fait la correspondance entre le numéro d'un Cercle et l'objet contraintes sur ce Cercle. +*/ +class ListeCercles +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Le verrou d'accès à la liste est initialisé, ainsi que l'indice courant. + */ + ListeCercles(); + //! Destructeur. + /*! + Les éléments de la liste sont désalloué. Le verrou est détruit. + */ + ~ListeCercles(); + + //! Fonction. + /*! + Cette fonction ajoute un Cercle dans la liste. + \param c : Pointeur sur un objet de contraintes de Cercle à ajouter + \return : le numéro qui a été attribué au cercle + */ + int AjouterCercle(CCercle *c); + //! Fonction. + /*! + Cette fonction enlève un cercle à la liste. + \param i : numéro du Cercle à supprimer + */ + void SupprCercle(const int &i); + + //! Fonction. + /*! + \param i : numéro du Cercle à récupérer + \return le Cercle i + */ + CCercle *GetCercle(const int &i); + + //! Accesseur. + /*! + \return le nombre de Cercles dans la liste. + */ + int NbCercles(); + + //! Fonction. + /*! + Cette fonction envoie la liste des Cercles dans une socket. + \param s : socket dans laquelle on va envoyer + */ + void EnvoyerListe(Socket *s); + + private : + //! Donnée privée. + /*! + Liste réelle. + */ + map liste; + + //! Donnée privée. + /*! + Prochain numéro de Cercle à attribuer. A chaque fois qu'on crée un Cercle on lui associe ce nombre et on incrémente la variable. + */ + int courant; + + //! Donnée privée. + /*! + Verrou qui permnet de réguler les accès à la liste. + */ + pthread_rwlock_t verrou; +}; +#endif diff --git a/serveur/Listes/ListeCercles.o b/serveur/Listes/ListeCercles.o new file mode 100644 index 0000000000000000000000000000000000000000..0467a58fa57d5779344a5a2e2edea40f2734d365 GIT binary patch literal 36992 zcmeHwdwgA0o$or2N(KWxK)@;m)6iC)$E5FC(a?6&mOcngTT8J$q{%5wNRybH^np}M z(?Ac$2-nxhfKItGBiBK#3Jx&Jl!sKgFcb&1Bb|Hm(OgYQMsu$nso0s!_q!hZth3HO zX<|+a9z8o!7>Qy@lN`@ zfI8fJyb}-#Weg1nPNcn)DD3futnw((8k^U?L#gW=_L=Hv+8gZJJt$HaQq^UVmm|KWZ$erFB8S@>5P-X5%U8wg2w{6>CnP1I<)V zN_(edC!eaZz4~0nD@}(%Fus6hvlJSO&RZiAHPsr{>Z`R&5xCV)fT)R*F=kV|doeCN|T)Kxq z-ZdB|8??IDf@?{hRKq^ z=hD;7a)XxY20h(R7NBOiq0V7%JG*qaa%(itf0YB%)7_7wedbI2E4#>M7fZ|Xf%oLs z49v)DX{)VUO6$nl$&qY}C|GvT64rq?>8OxZCK@zX(%XQh{-0=Ij1% zA#9=FMUbA`(5Q&|VJo9zd^&`_gu8Z^B3?!3^se0{q0aI>*HT5%`K}iy5Qg9ZIrOqi z29=}9aVr}(h5Ek(VVHq`^t=$m!=ZPc`?=67A@OD?7KC0>_E1=er^8dXJ8J8!yJr0*}AaE(|_rG~}3L$PykH*LcEL(9%tCz^1N z#=L^oGt_HZ!`b+hPix*{J`%sC>TK0+$%E53~bx7y5$k-*MEf!u`=pwFFe5}+GThl`qR3*Q z!YFt|jaa(7RHTr;RY;fW&d&*HDbv)%)WR({ks*1dz0!g2VDLf~W2L&pj}*9;aSM+Q zx0RZHi20$L6M>{cXVm1AsS&PtA?jjKzz}7JK`yUA5~&})k;LRm@*$Jjjox~Ed@iSa zt(^G;mczV5%k;vioDI;Q)M&V~48`cc0F{jI(GcI}q9pPMm|S=dcb>A70Y>1`GRu!; z%8&Nn;5;Eqop}Q?4_9*v=6A`%)m&AmyApXvYp7IuAspi0b83LrN+Jj{)uqvZJPsvG)wn1Py4*t1m@0x-M;#Eu#uZq+%X^vqW>ps+Zu`+YG z^O$Sdz)J zpVZ^MU7$16eEo;ez1|=8dw?fifR7upX^2G`?{y}c z�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 literal 0 HcmV?d00001 diff --git a/serveur/Listes/ListeCompo.cpp b/serveur/Listes/ListeCompo.cpp new file mode 100755 index 0000000..ee84315 --- /dev/null +++ b/serveur/Listes/ListeCompo.cpp @@ -0,0 +1,118 @@ +#include "ListeCompo.h" + +#include +#include +#include +#include + +ListeCompo::ListeCompo() +{ + pthread_rwlock_init(&verrou,NULL); +} + +ListeCompo::~ListeCompo() +{ + pthread_rwlock_destroy(&verrou); +} + +void ListeCompo::AjouterCompo(const char *nom, const int &port) +{ + pthread_rwlock_wrlock(&verrou); + + liste[string(nom)]=port; + + pthread_rwlock_unlock(&verrou); +} + +void ListeCompo::EnvoyerListe(Socket *sock) +{ + char buffer[TAILLE_BUFFER]; + map::iterator itliste; + map::size_type nb; + + pthread_rwlock_rdlock(&verrou); + + //envoi du nombre d'éléments dans la liste + nb = liste.size(); + sprintf(buffer,"%d\r\n",int(nb)); + sock->Ecrire(buffer); + + //parcours de la liste pour envoyer le nom des compositions + for (itliste=liste.begin();itliste!=liste.end();++itliste) + { + sprintf(buffer,"%s\r\n",((*itliste).first).c_str()); + sock->Ecrire(buffer); + } + + pthread_rwlock_unlock(&verrou); +} + +void ListeCompo::SupprCompo(const int &i) +{ + char buffer[TAILLE_BUFFER]; + int j; + map::iterator itliste; + + pthread_rwlock_wrlock(&verrou); + + //recherche de l'élément à supprimer + for (itliste=liste.begin(),j=0;itliste!=liste.end(),j::iterator itliste; + + pthread_rwlock_wrlock(&verrou); + + //recherche de l'élément à supprimer + for (itliste=liste.begin();itliste!=liste.end();++itliste) + { + if ((*itliste).first == string(nom)) + { + liste.erase(itliste); + pthread_rwlock_unlock(&verrou); + return; + } + } + + pthread_rwlock_unlock(&verrou); +} + + +int ListeCompo::GetPortOfCompo(const char *nom) +{ + map::iterator itliste; + + pthread_rwlock_rdlock(&verrou); + + //recherche de l'élément à supprimer + for (itliste=liste.begin();itliste!=liste.end();++itliste) + { + if ((*itliste).first == string(nom)) + { + pthread_rwlock_unlock(&verrou); + return (*itliste).second; + } + } + + pthread_rwlock_unlock(&verrou); + + return -1; +} + +int ListeCompo::NbCompo() +{ + map::size_type nb; + + nb = liste.size(); + return int(nb); +} diff --git a/serveur/Listes/ListeCompo.h b/serveur/Listes/ListeCompo.h new file mode 100755 index 0000000..da4db95 --- /dev/null +++ b/serveur/Listes/ListeCompo.h @@ -0,0 +1,93 @@ +#ifndef _LISTECOMPO_ +#define _LISTECOMPO_ + + +#include "../Connexion/Socket.h" +#include +#include +using namespace std; + +//! Classe ListeCompo. +/*! + Cette classe sert à modéliser une liste qui permet de faire la correspondance entre une composition et le numéro de port du serveur qui lui est assoocié. +*/ +class ListeCompo +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Par défaut la liste contient 0 éléments et le pointeur sur la liste vaut NULL. Le verrou d'accès à la liste est initialisé. + */ + ListeCompo(); + //! Destructeur. + /*! + Les éléments de la liste sont désalloué. Le verrou est détruit. + */ + ~ListeCompo(); + + //! Fonction. + /*! + Cette fonction ajoute une compo dans la liste. + \param nom : nom de la composition à ajouter + \param port : port de la composition à ajouter + */ + void AjouterCompo(const char *nom, const int &port); + //! Fonction. + /*! + Cette fonction enlève une compo à la liste. + \param i : index de la composition à supprimer + */ + void SupprCompo(const int &i); + //! Fonction. + /*! + Cette fonction enlève une compo à la liste. + \param nom : nom de la composition à supprimer + */ + void SupprCompo(const char *nom); + + //! Fonction. + /*! + \param nom : nom de la composition dont on cherche le port + \return le port associé au nom donné en paramètre si la composition existe et -1 sinon. + */ + int GetPortOfCompo(const char *nom); + +// //! Accesseur. +// /*! +// \return la première compo de la liste. +// */ +// CompoInfo *FirstCompo(); +// //! Accesseur. +// /*! +// \param ci : élément dont on veut le suivant +// \return la compo suivante dans la liste. +// */ +// CompoInfo * NextCompo(CompoInfo *ci); + //! Accesseur. + /*! + \return le nombre de compos dans la liste. + */ + int NbCompo(); + + //! Fonction. + /*! + Cette fonction envoie la liste des compos dans une socket. + \param s : socket dans laquelle on va envoyer + */ + void EnvoyerListe(Socket *s); + + private : + //! Donnée privée. + /*! + Liste réelle. + */ + //CompoElement *liste; + map liste; + + //! Donnée privée. + /*! + Verrou qui permnet de réguler les accès à la liste. + */ + pthread_rwlock_t verrou; +}; +#endif diff --git a/serveur/Listes/ListeCompo.o b/serveur/Listes/ListeCompo.o new file mode 100644 index 0000000000000000000000000000000000000000..97e0f3b00141e410431c02620d7f58bc70634072 GIT binary patch literal 37736 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 HRYLqPRIk}E literal 0 HcmV?d00001 diff --git a/serveur/Listes/ListeDroites.cpp b/serveur/Listes/ListeDroites.cpp new file mode 100755 index 0000000..9c5ddbe --- /dev/null +++ b/serveur/Listes/ListeDroites.cpp @@ -0,0 +1,118 @@ +#include "ListeDroites.h" + +#include +#include +#include +#include + +ListeDroites::ListeDroites() +:courant(0) +{ + pthread_rwlock_init(&verrou,NULL); +} + +ListeDroites::~ListeDroites() +{ + map::iterator itliste; + + //on va détruire tous les Droites de la liste + pthread_rwlock_wrlock(&verrou); + + for (itliste=liste.begin();itliste!=liste.end();++itliste) + delete (*itliste).second; + + pthread_rwlock_unlock(&verrou); + + pthread_rwlock_destroy(&verrou); +} + +int ListeDroites::AjouterDroite(CDroite *c) +{ + pthread_rwlock_wrlock(&verrou); + + int r = courant; + liste[r]=c; + courant++; + + pthread_rwlock_unlock(&verrou); + return r; +} + +void ListeDroites::SupprDroite(const int &i) +{ + map::iterator itliste; + + pthread_rwlock_wrlock(&verrou); + + //recherche de l'élément à supprimer + for (itliste=liste.begin() ; itliste!=liste.end(), (*itliste).first != i ; ++itliste); + + //si l'élément i se trouve dans la liste + if (itliste!=liste.end()) + liste.erase(itliste); + + pthread_rwlock_unlock(&verrou); +} + +CDroite *ListeDroites::GetDroite(const int &i) +{ + map::iterator itliste; + + pthread_rwlock_rdlock(&verrou); + + //recherche de l'élément à supprimer + for (itliste=liste.begin();itliste!=liste.end();++itliste) + { + if ((*itliste).first == i) + { + pthread_rwlock_unlock(&verrou); + return (*itliste).second; + } + } + + pthread_rwlock_unlock(&verrou); + + return NULL; +} + +int ListeDroites::NbDroites() +{ + map::size_type nb; + nb = liste.size(); + return int(nb); +} + +void ListeDroites::EnvoyerListe(Socket *sock) +{ + char buffer[TAILLE_BUFFER]; + map::iterator itliste; + map::size_type nb; + + pthread_rwlock_rdlock(&verrou); + + //envoi du nombre d'éléments dans la liste + nb = liste.size(); + sprintf(buffer,"%d\n",int(nb)); + sock->Ecrire(buffer); + + //parcours de la liste pour envoyer les objets à afficher + for (itliste=liste.begin();itliste!=liste.end();++itliste) + { + const Droite *sol = ((*itliste).second)->Solution(); + //Si il y a une solution retenue on l'envoie + if (sol != NULL) + { + //numéro de Droite, constantes a, b et c de l'équation cartésienne de la droite + sprintf(buffer,"%d %lf %lf %lf\n", (*itliste).first, sol->A(), sol->B(), sol->C()); + sock->Ecrire(buffer); + } + else + { + //on dit que l'objet n'a pas de solutions + sprintf(buffer,"%d -1\n", (*itliste).first); + sock->Ecrire(buffer); + } + } + + pthread_rwlock_unlock(&verrou); +} diff --git a/serveur/Listes/ListeDroites.h b/serveur/Listes/ListeDroites.h new file mode 100755 index 0000000..dd27038 --- /dev/null +++ b/serveur/Listes/ListeDroites.h @@ -0,0 +1,82 @@ +#ifndef _LISTEDROITES_ +#define _LISTEDROITES_ + +#include "../Connexion/Socket.h" +#include "../Contraintes/CDroite.h" + +#include +#include +using namespace std; + +//! Classe ListeDroites. +/*! + Cette classe sert à modéliser une liste qui fait la correspondance entre le numéro d'un Droite et l'objet contraintes sur ce Droite. +*/ +class ListeDroites +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Le verrou d'accès à la liste est initialisé, ainsi que l'indice courant. + */ + ListeDroites(); + //! Destructeur. + /*! + Les éléments de la liste sont désalloué. Le verrou est détruit. + */ + ~ListeDroites(); + + //! Fonction. + /*! + Cette fonction ajoute un Droite dans la liste. + \param d : Pointeur sur un objet de contraintes de Droite à ajouter. + \return : le numéro qui a été attribué à la droite. + */ + int AjouterDroite(CDroite *d); + //! Fonction. + /*! + Cette fonction enlève un Droite à la liste. + \param i : numéro du Droite à supprimer + */ + void SupprDroite(const int &i); + + //! Fonction. + /*! + \param i : numéro du Droite à récupérer + \return le Droite i + */ + CDroite *GetDroite(const int &i); + + //! Accesseur. + /*! + \return le nombre de Droites dans la liste. + */ + int NbDroites(); + + //! Fonction. + /*! + Cette fonction envoie la liste des Droites dans une socket. + \param s : socket dans laquelle on va envoyer + */ + void EnvoyerListe(Socket *s); + + private : + //! Donnée privée. + /*! + Liste réelle. + */ + map liste; + + //! Donnée privée. + /*! + Prochain numéro de Droite à attribuer. A chaque fois qu'on crée un Droite on lui associe ce nombre et on incrémente la variable. + */ + int courant; + + //! Donnée privée. + /*! + Verrou qui permnet de réguler les accès à la liste. + */ + pthread_rwlock_t verrou; +}; +#endif diff --git a/serveur/Listes/ListeDroites.o b/serveur/Listes/ListeDroites.o new file mode 100644 index 0000000000000000000000000000000000000000..f2e2a2ec039aeeb7211c0b475f8f5901164a96ed GIT binary patch literal 36624 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 literal 0 HcmV?d00001 diff --git a/serveur/Listes/ListePoints.cpp b/serveur/Listes/ListePoints.cpp new file mode 100755 index 0000000..e4a502b --- /dev/null +++ b/serveur/Listes/ListePoints.cpp @@ -0,0 +1,122 @@ +#include "ListePoints.h" + +#include +#include +#include +#include + +ListePoints::ListePoints() +:courant(0) +{ + pthread_rwlock_init(&verrou,NULL); +} + +ListePoints::~ListePoints() +{ + map::iterator itliste; + + //on va détruire tous les points de la liste + pthread_rwlock_wrlock(&verrou); + + for (itliste=liste.begin();itliste!=liste.end();++itliste) + delete (*itliste).second; + + pthread_rwlock_unlock(&verrou); + + pthread_rwlock_destroy(&verrou); +} + +int ListePoints::AjouterPoint(CPoint *p) +{ + pthread_rwlock_wrlock(&verrou); + + int r = courant; + liste[r]=p; + courant++; + + pthread_rwlock_unlock(&verrou); + return r; +} + +void ListePoints::SupprPoint(const int &i) +{ + map::iterator itliste; + + pthread_rwlock_wrlock(&verrou); + + //recherche de l'élément à supprimer + for (itliste=liste.begin() ; itliste!=liste.end(), (*itliste).first != i ; ++itliste); + + //si l'élément i se trouve dans la liste + if (itliste!=liste.end()) + { + liste.erase(itliste); + } + + pthread_rwlock_unlock(&verrou); +} + +CPoint *ListePoints::GetPoint(const int &i) +{ + map::iterator itliste; + + pthread_rwlock_rdlock(&verrou); + + //recherche de l'élément à supprimer + for (itliste=liste.begin();itliste!=liste.end();++itliste) + { + if ((*itliste).first == i) + { + CPoint *cp = (*itliste).second; + pthread_rwlock_unlock(&verrou); + return cp; + } + } + + pthread_rwlock_unlock(&verrou); + + return NULL; +} + +int ListePoints::NbPoints() +{ + map::size_type nb; + + nb = liste.size(); + return int(nb); +} + +void ListePoints::EnvoyerListe(Socket *sock) +{ + char buffer[TAILLE_BUFFER]; + map::iterator itliste; + map::size_type nb; + + pthread_rwlock_rdlock(&verrou); + + //envoi du nombre d'éléments dans la liste + nb = liste.size(); + sprintf(buffer,"%d\n",int(nb)); + sock->Ecrire(buffer); + + //parcours de la liste pour envoyer les objets à afficher + for (itliste=liste.begin();itliste!=liste.end();++itliste) + { + const Point *sol = ((*itliste).second)->Solution(); + //Si il y a une solution retenue on l'envoie + if (sol != NULL) + { + //numéro de point, coordonnée X et Y + sprintf(buffer,"%d %lf %lf\n", (*itliste).first, sol->GetX(), sol->GetY()); + sock->Ecrire(buffer); + } + else + { + //on dit que l'objet n'a pas de solutions + sprintf(buffer,"%d -1\n", (*itliste).first); + sock->Ecrire(buffer); + } + } + + pthread_rwlock_unlock(&verrou); +} diff --git a/serveur/Listes/ListePoints.h b/serveur/Listes/ListePoints.h new file mode 100755 index 0000000..4e15ac7 --- /dev/null +++ b/serveur/Listes/ListePoints.h @@ -0,0 +1,82 @@ +#ifndef _LISTEPOINTS_ +#define _LISTEPOINTS_ + +#include "../Connexion/Socket.h" +#include "../Contraintes/CPoint.h" + +#include +#include +using namespace std; + +//! Classe ListePoints. +/*! + Cette classe sert à modéliser une liste qui fait la correspondance entre le numéro d'un Point et l'objet contraintes sur ce Point. +*/ +class ListePoints +{ + public : + //! Constructeur. + /*! + Constructeur par défaut. Le verrou d'accès à la liste est initialisé, ainsi que l'indice courant. + */ + ListePoints(); + //! Destructeur. + /*! + Les éléments de la liste sont désalloué. Le verrou est détruit. + */ + ~ListePoints(); + + //! Fonction. + /*! + Cette fonction ajoute un point dans la liste. + \param p : pointeur sur un objet de contraintes de point à ajouter. + \return : le numéro qui a été attribué au point. + */ + int AjouterPoint(CPoint *p); + //! Fonction. + /*! + Cette fonction enlève un point à la liste. + \param i : numéro du point à supprimer + */ + void SupprPoint(const int &i); + + //! Fonction. + /*! + \param i : numéro du point à récupérer + \return le point i + */ + CPoint *GetPoint(const int &i); + + //! Accesseur. + /*! + \return le nombre de points dans la liste. + */ + int NbPoints(); + + //! Fonction. + /*! + Cette fonction envoie la liste des points dans une socket. + \param s : socket dans laquelle on va envoyer + */ + void EnvoyerListe(Socket *s); + + private : + //! Donnée privée. + /*! + Liste réelle. + */ + map liste; + + //! Donnée privée. + /*! + Prochain numéro de point à attribuer. A chaque fois qu'on crée un point on lui associe ce nombre et on incrémente la variable. + */ + int courant; + + //! Donnée privée. + /*! + Verrou qui permnet de réguler les accès à la liste. + */ + pthread_rwlock_t verrou; +}; +#endif diff --git a/serveur/Listes/ListePoints.o b/serveur/Listes/ListePoints.o new file mode 100644 index 0000000000000000000000000000000000000000..26793ba0a989cb031dcf13e1e074229198925395 GIT binary patch literal 36396 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 Qfu-;-AqMMa!YU#DA2VXn-T(jq literal 0 HcmV?d00001 diff --git a/serveur/Listes/makefile b/serveur/Listes/makefile new file mode 100755 index 0000000..15cab6c --- /dev/null +++ b/serveur/Listes/makefile @@ -0,0 +1,19 @@ +CPPC = g++ +OBJS = ListeCompo.o ListePoints.o ListeCercles.o ListeDroites.o + +compo : $(OBJS) + +ListeCompo.o : ListeCompo.h ListeCompo.cpp ../Connexion/Socket.h + $(CPPC) -c ListeCompo.cpp + +ListePoints.o : ListePoints.h ListePoints.cpp ../Contraintes/CPoint.h ../Connexion/Socket.h + $(CPPC) -c ListePoints.cpp + +ListeDroites.o : ListeDroites.h ListeDroites.cpp ../Contraintes/CDroite.h ../Connexion/Socket.h + $(CPPC) -c ListeDroites.cpp + +ListeCercles.o : ListeCercles.h ListeCercles.cpp ../Contraintes/CCercle.h ../Connexion/Socket.h + $(CPPC) -c ListeCercles.cpp + +clean : + rm *.o \ No newline at end of file diff --git a/serveur/Serveur/ServeurCompo.cpp b/serveur/Serveur/ServeurCompo.cpp new file mode 100644 index 0000000..056fc39 --- /dev/null +++ b/serveur/Serveur/ServeurCompo.cpp @@ -0,0 +1,727 @@ +#include "ServeurCompo.h" + +#include "../Contraintes/CPointIsole.h" +#include "../Contraintes/CPointAppart1D.h" +#include "../Contraintes/CPointAppart1C.h" +#include "../Contraintes/CPointInter2D.h" +#include "../Contraintes/CPointMilieu2P.h" +#include "../Contraintes/CPointInter2C.h" +#include "../Contraintes/CPointInter1C1D.h" +#include "../Contraintes/CPointCentre1C.h" + +#include "../Contraintes/CDtePassant2P.h" +#include "../Contraintes/CDteHorizPassant1P.h" +#include "../Contraintes/CDteVertPassant1P.h" +#include "../Contraintes/CDtePerp1DPassant1P.h" +#include "../Contraintes/CDteParall1D.h" +#include "../Contraintes/CDteParall1DPassant1P.h" +#include "../Contraintes/CDteMediatrice2P.h" + +#include "../Contraintes/CCerclePassant3P.h" +#include "../Contraintes/CCerclePassant1P.h" +#include "../Contraintes/CCercleTangent2D.h" + +#include "../Global.h" + +#include "unistd.h" +#include "stdio.h" +#include "pthread.h" +#include "string" +using namespace std; + +struct paramthread +{ + Socket *sock; + ListePoints *points; + ListeDroites *droites; + ListeCercles *cercles; +}; + +void serveurcompo(char *nom, int typeserveur, Connexion * c) +{ + switch (c->GetType()) + { + case C_FORK : + switch(fork()) + { + case -1 : + fprintf(stderr, "Erreur de lancement du fork du serveur %s\n",nom); + break; + + case 0 : + fk_creercompo(c); + break; + + default: + delete []nom; + delete c; + } + break; + + case C_THREAD : + pthread_t thr; + if (pthread_create(&thr,NULL,th_creercompo,(void *)c) != 0) + fprintf(stderr,"pthread_create (serveur %s)\n",nom); + delete []nom; + break; + } +} + +void * th_creercompo(void * param) +{ + Connexion *p = (Connexion *)param; + fk_creercompo(p); + + pthread_exit(NULL); +} + +void fk_creercompo(Connexion * c) +{ + Socket * sock; + //pthread_t *thr; + pthread_t thr; + + //Liste des points, des droites et des cercles définis par contraintes + ListePoints points; + ListeDroites droites; + ListeCercles cercles; + + struct paramthread *param; + + //écoute sur la socket + while(1) + { + if ((sock = c->AttendConnexion()) != NULL) + { + param = new (struct paramthread); + param->sock = sock; + param->points = &points; + param->droites = &droites; + param->cercles = &cercles; + + /*thr = new pthread_t; + if (pthread_create(thr,NULL,thread_travail_client,(void *)param) != 0) + perror("pthread_create (thread_travail_client)");*/ + if (pthread_create(&thr,NULL,thread_travail_client,(void *)param) != 0) + perror("pthread_create (thread_travail_client)"); + pthread_detach(thr); + } + } + //quand c'est fini on détruit la connexion + delete c; +} + +void *thread_travail_client(void *param) +{ + Socket *sock = ((struct paramthread *)param)->sock; + ListePoints *points = ((struct paramthread *)param)->points; + ListeDroites *droites = ((struct paramthread *)param)->droites; + ListeCercles *cercles = ((struct paramthread *)param)->cercles; + + int i, p; + //char buffer[TAILLE_BUFFER]; + char *lecture; + + while (1) + { + //écoute de la réponse... + if ((lecture = sock->Lire()) == NULL) + break; + #ifdef VERBOSE + printf("client : \033[93m\033[40m%s\033[0m\n",lecture); + #endif + traiterRequete(lecture, sock, *points, *droites, *cercles); + + delete []lecture; + } + + #ifdef VERBOSE + printf("fin de la thread du client\n"); + #endif + //on détruit la socket du client + delete sock; + pthread_exit((void *)0); + +} + +int traiterRequete(const char *ligne, Socket *sock, ListePoints &points, ListeDroites &droites, ListeCercles &cercles) +{ + char commande[TAILLE_BUFFER]; + char *buffer; + int position; + double r, x, y; + int p1,p2,p3; + int d1, d2; + int c1, c2; + int nb; + CPoint *pp, *pp1, *pp2, *pp3; + CDroite *dd, *dd1, *dd2; + CCercle *cc, *cc1, *cc2; + + //lit le type de requête + if (sscanf(ligne, "%s %n", commande, &position) !=1) + { + //aucune commande n'a été tapée + return -1; + } + + //POINT + if (string(commande) == "P") + { + int position2, type; + //lit le type de requête + if (sscanf(&(ligne[position]), "%d %n", &type, &position2) !=1) + { + //il y a une erreur de saisie + return -1; + } + CPoint *p; + position2 += position; + + switch(type) + { + case 1: + if (sscanf(&(ligne[position2]),"%lf %lf",&x,&y) != 2) + p = NULL; + else + { + #ifdef VERBOSE + printf("point isolé : x=%lf, y=%lf\n",x,y); + #endif + //on va ajouter un nouveau CPointIsole dans les points + p = new CPointIsole(x,y); + } + break; + + case 2: + if (sscanf(&(ligne[position2]),"%d %lf %lf",&d1, &x, &y) != 3) + p = NULL; + else + { + #ifdef VERBOSE + printf("point appartenant à une droite : %lf %lf projeté sur d%d \n",x,y,d1); + #endif + //on récupère la droite + if ((dd = droites.GetDroite(d1)) == NULL) + p = NULL; + else + p = new CPointAppart1D(dd,x,y); + } + break; + + case 3: + if (sscanf(&(ligne[position2]),"%d %lf %lf",&c1,&x,&y) != 3) + p = NULL; + else + { + #ifdef VERBOSE + printf("point appartenant à un cercle : c%d\n", c1); + #endif + //on récupère la droite + if ((cc = cercles.GetCercle(c1)) == NULL) + p = NULL; + else + p = new CPointAppart1C(cc,x,y); + } + break; + + case 4: + if (sscanf(&(ligne[position2]),"%d %d", &d1, &d2) != 2) + p = NULL; + else + { + #ifdef VERBOSE + printf("point d'intersection de deux droites : d%d et d%d\n", d1, d2); + #endif + //on récupère les deux droites + if (((dd1 = droites.GetDroite(d1)) == NULL) || ((dd2 = droites.GetDroite(d2)) == NULL)) + p = NULL; + else + p = new CPointInter2D(dd1,dd2); + } + break; + + case 5: + if (sscanf(&(ligne[position2]),"%d %d", &c1, &c2) != 2) + p = NULL; + else + { + #ifdef VERBOSE + printf("point d'intersection entre deux cercles : c%d et c%d\n", c1, c2); + #endif + //on récupère les deux cercles + if (((cc1 = cercles.GetCercle(c1)) == NULL) || ((cc2 = cercles.GetCercle(c2)) == NULL)) + p = NULL; + else + p = new CPointInter2C(cc1,cc2); + } + break; + + case 6: + if (sscanf(&(ligne[position2]),"%d %d", &d1, &c1) != 2) + p = NULL; + else + { + #ifdef VERBOSE + printf("point d'intersection entre une droite et un cercle : d%d et c%d\n", d1, c1); + #endif + //on récupère le cercle et la droite + if (((dd = droites.GetDroite(d1)) == NULL) || ((cc = cercles.GetCercle(c1)) == NULL)) + p = NULL; + else + p = new CPointInter1C1D(cc,dd); + } + break; + + case 7: + if (sscanf(&(ligne[position2]),"%d %d", &p1, &p2) != 2) + p = NULL; + else + { + #ifdef VERBOSE + printf("point milieu de deux points : p%d et p%d\n", p1, p2); + #endif + //on récupère les deux points + if (((pp1 = points.GetPoint(p1)) == NULL) || ((pp2 = points.GetPoint(p2)) == NULL)) + p = NULL; + else + p = new CPointMilieu2P(pp1,pp2); + } + break; + + case 8: + if (sscanf(&(ligne[position2]),"%d", &c1) != 1) + p = NULL; + else + { + #ifdef VERBOSE + printf("point centre d'un cercle : c%d\n", c1); + #endif + //on récupère le cercle + if ((cc = cercles.GetCercle(c1)) == NULL) + p = NULL; + else + p = new CPointCentre1C(cc); + } + break; + + default: + p = NULL; + } + + if (p != NULL) + { + //RECUPERER LE NUMERO ET L'ENVOYER AU CLIENT A LA FIN. + int n = points.AjouterPoint(p); + //on envoie les solutions possibles + p->EnvoyerSolutions(sock); + //on lit la solution voulue + if (((buffer = sock->Lire()) == NULL) || (sscanf(buffer,"%d",&nb) != 1)) + nb = 0; + else + { + delete [] buffer; + //on envoie le numéro du point créé. Ca tient lieu d'accusé de réception + char *buffer2 = new char[TAILLE_BUFFER]; + sprintf(buffer2,"%d\n",n); + sock->Ecrire(buffer2); + delete [] buffer2; + } + + //On affecte le choix du client + p->Choisir(nb); + } + #ifdef VERBOSE + else + printf("\033[05m\033[41m\033[97merreurs de paramètres\033[0m\n"); + #endif + } + + //DROITES + else + if (string(commande) == "D") + { + int position2, type; + //lit le type de requête + if (sscanf(&(ligne[position]), "%d %n", &type, &position2) !=1) + { + //il y a une erreur de saisie + return -1; + } + CDroite *d; + position2 += position; + + switch(type) + { + case 1: + if (sscanf(&(ligne[position2]),"%d %d", &p1, &p2) != 2) + d = NULL; + else + { + #ifdef VERBOSE + printf("droite passant par deux points : p%d et p%d\n", p1, p2); + #endif + //on récupère les deux points + if (((pp1 = points.GetPoint(p1)) == NULL) || ((pp2 = points.GetPoint(p2)) == NULL)) + d = NULL; + else + d = new CDtePassant2P(pp1,pp2); + } + break; + + case 2: + if (sscanf(&(ligne[position2]),"%d", &p1) != 1) + d = NULL; + else + { + #ifdef VERBOSE + printf("droite horizontale passant par un point : p%d\n", p1); + #endif + //on récupère le point + if ((pp = points.GetPoint(p1)) == NULL) + d = NULL; + else + d = new CDteHorizPassant1P(pp); + } + break; + + case 3: + if (sscanf(&(ligne[position2]),"%d", &p1) != 1) + d = NULL; + else + { + #ifdef VERBOSE + printf("droite verticale passant par un point : p%d\n", p1); + #endif + //on récupère le point + if ((pp = points.GetPoint(p1)) == NULL) + d = NULL; + else + d = new CDteVertPassant1P(pp); + } + break; + + case 4: + if (sscanf(&(ligne[position2]),"%d %d", &d1, &p1) != 2) + d = NULL; + else + { + #ifdef VERBOSE + printf("droite perpendiculaire à une autre droite passant par un point : d%d et p%d\n", d1, p1); + #endif + //on récupère le point et la droite + if (((pp = points.GetPoint(p1)) == NULL) || ((dd = droites.GetDroite(d1)) == NULL)) + d = NULL; + else + d = new CDtePerp1DPassant1P(dd,pp); + } + break; + + case 5: + if (sscanf(&(ligne[position2]),"%d %lf", &d1, &x) != 2) + d = NULL; + else + { + #ifdef VERBOSE + printf("droite parallèle à une autre droite à une distance d : d%d à %lf\n", d1, x); + #endif + //on récupère la droite + if ((dd = droites.GetDroite(d1)) == NULL) + d = NULL; + else + d = new CDteParall1D(dd,x); + } + break; + + case 6: + if (sscanf(&(ligne[position2]),"%d %d", &d1, &p1) != 2) + d = NULL; + else + { + #ifdef VERBOSE + printf("droite parallèle à une autre droite passant par un point : d%d et p%d\n", d1, p1); + #endif + //on récupère la droite et le point + if (((dd = droites.GetDroite(d1)) == NULL) || ((pp = points.GetPoint(p1)) == NULL)) + d = NULL; + else + d = new CDteParall1DPassant1P(dd,pp); + } + break; + + case 7: + if (sscanf(&(ligne[position2]),"%d %d", &p1, &p2) != 2) + d = NULL; + else + { + #ifdef VERBOSE + printf("droite médiatrice d'un segment : p%d et p%d\n", p1, p2); + #endif + //on récupère les points + if (((pp1 = points.GetPoint(p1)) == NULL) || ((pp2 = points.GetPoint(p2)) == NULL)) + d = NULL; + else + d = new CDteMediatrice2P(pp1,pp2); + } + break; + + default: + d = NULL; + } + + if (d != NULL) + { + int n = droites.AjouterDroite(d); + //on envoie les solutions possibles + d->EnvoyerSolutions(sock); + //on lit la solution voulue + if (((buffer = sock->Lire()) == NULL) || (sscanf(buffer,"%d",&nb) != 1)) + nb = 0; + else + { + delete [] buffer; + //on envoie le numéro de la droite créée. Ca tient lieu d'accusé de réception + char *buffer2 = new char[TAILLE_BUFFER]; + sprintf(buffer2,"%d\n",n); + sock->Ecrire(buffer2); + delete [] buffer2; + } + //On affecte le choix du client + d->Choisir(nb); + } + #ifdef VERBOSE + else + printf("\033[05m\033[41m\033[97merreurs de paramètres\033[0m\n"); + #endif + } + + //CERCLES + else + if (string(commande) == "C") + { + int position2, type; + //lit le type de requête + if (sscanf(&(ligne[position]), "%d %n", &type, &position2) !=1) + { + //il y a une erreur de saisie + return -1; + } + CCercle *c; + position2 += position; + + switch(type) + { + case 1: + if (sscanf(&(ligne[position2]),"%d %d %d", &p1, &p2, &p3) != 3) + c = NULL; + else + { + #ifdef VERBOSE + printf("cercle passant par trois points : p%d, p%d et p%d\n", p1, p2, p3); + #endif + //on récupère les trois points + if (((pp1 = points.GetPoint(p1)) == NULL) || (pp2 = points.GetPoint(p2)) == NULL || (pp3 = points.GetPoint(p3)) == NULL) + c = NULL; + else + c = new CCerclePassant3P(pp1,pp2,pp3); + } + break; + + case 2: + if (sscanf(&(ligne[position2]),"%d %lf %lf %lf", &p1, &r, &x, &y) != 4) + c = NULL; + else + { + #ifdef VERBOSE + printf("cercle passant par un point et de rayon donné : p%d à %lf près de %lf %lf\n", p1, r, x, y); + #endif + //on récupère les trois points + if ((pp = points.GetPoint(p1)) == NULL) + c = NULL; + else + c = new CCerclePassant1P(pp,r,x,y); + } + break; + + case 3: + if (sscanf(&(ligne[position2]),"%d %lf %lf %lf", &p1, &r, &x, &y) != 4) + c = NULL; + else + { + #ifdef VERBOSE + printf("cercle passant par un point et de diamètre donné : p%d à %lf près de %lf %lf\n", p1, r, x, y); + #endif + //on récupère les trois points + if ((pp = points.GetPoint(p1)) == NULL) + c = NULL; + else + c = new CCerclePassant1P(pp,r/2.0,x,y); + } + break; + + case 4: + if (sscanf(&(ligne[position2]),"%d %d %lf", &d1, &d2, &r) != 3) + c = NULL; + else + { + #ifdef VERBOSE + printf("cercle tangent à deux droites et de rayon donné : d%d et d%d à %lf\n", d1, d2, r); + #endif + //on récupère ledeux droites + if (((dd1 = droites.GetDroite(d1)) == NULL) || ((dd2 = droites.GetDroite(d2)) == NULL)) + c = NULL; + else + c = new CCercleTangent2D(dd1,dd2,r); + } + break; + + case 5: + if (sscanf(&(ligne[position2]),"%d %d %lf", &c1, &c2, &r) != 3) + c = NULL; + else + { + #ifdef VERBOSE + printf("cercle tangent à deux cercles et de rayon donné : c%d et c%d à %lf\n", c1, c2, r); + #endif + c = NULL; + } + break; + + case 6: + if (sscanf(&(ligne[position2]),"%d %d", &p1, &d1) != 2) + c = NULL; + else + { + #ifdef VERBOSE + printf("cercle passant par un point et tangent à une droite : p%d et d%d\n", p1, d1); + #endif + c = NULL; + } + break; + + case 7: + if (sscanf(&(ligne[position2]),"%d %d", &p1, &c1) != 2) + c = NULL; + else + { + #ifdef VERBOSE + printf("cercle passant par un point et tangent à un cercle : p%d et c%d\n", p1, c1); + #endif + c = NULL; + } + break; + + default: + c = NULL; + } + if (c != NULL) + { + int n = cercles.AjouterCercle(c); + + //on envoie les solutions possibles + c->EnvoyerSolutions(sock); + + //on lit la solution voulue + if (((buffer = sock->Lire()) == NULL) || (sscanf(buffer,"%d",&nb) != 1)) + nb = 0; + else + { + delete [] buffer; + //on envoie le numéro du cercle créé. Ca tient lieu d'accusé de réception + char *buffer2 = new char[TAILLE_BUFFER]; + sprintf(buffer2,"%d\n",n); + sock->Ecrire(buffer2); + delete [] buffer2; + } + //On affecte le choix du client + c->Choisir(nb); + } + #ifdef VERBOSE + else + printf("\033[05m\033[41m\033[97merreurs de paramètres\033[0m\n"); + #endif + } + + //MODIFICATION D'UN POINT + else + if (string(commande) == "M") + { + int position2, type; + //lit le type de requête + if (sscanf(&(ligne[position]), "%d %lf %lf", &p1, &x, &y) == 3) + { + #ifdef VERBOSE + printf("modification d'un point : point p%d vers %lf et %lf\n", p1, x, y); + #endif + //on récupère le point + if (points.GetPoint(p1) != NULL) + { + points.GetPoint(p1)->ModifierPoint(x,y); + //on envoie les coordonnées du point : cela permet au client de + //ssavoir si le point a été modifié + char *buffer2 = new char[TAILLE_BUFFER]; + sprintf(buffer2,"%lf %lf\n", (points.GetPoint(p1)->Solution())->GetX(), (points.GetPoint(p1)->Solution())->GetY()); + sock->Ecrire(buffer2); + delete [] buffer2; + } + #ifdef VERBOSE + else + printf("\033[05m\033[41m\033[97mle point %d n'existe pas\033[0m\n",p1); + #endif + } + #ifdef VERBOSE + else + printf("\033[05m\033[41m\033[97merreurs de paramètres\033[0m\n"); + #endif + } + //ENVOI DE LISTES + else + if (string(commande) == "POINTS") + { + #ifdef VERBOSE + printf("Envoi de la liste des points\n"); + #endif + points.EnvoyerListe(sock); + } + else + if (string(commande) == "DROITES") + { + #ifdef VERBOSE + printf("Envoi de la liste des droites\n"); + #endif + droites.EnvoyerListe(sock); + } + else + if (string(commande) == "CERCLES") + { + #ifdef VERBOSE + printf("Envoi de la liste des cercles\n"); + #endif + cercles.EnvoyerListe(sock); + } + else + if (string(commande) == "ALL") + { + #ifdef VERBOSE + printf("Envoi de la liste des points\n"); + #endif + points.EnvoyerListe(sock); + #ifdef VERBOSE + printf("Envoi de la liste des droites\n"); + #endif + droites.EnvoyerListe(sock); + #ifdef VERBOSE + printf("Envoi de la liste des cercles\n"); + #endif + cercles.EnvoyerListe(sock); + } + + #ifdef VERBOSE + //COMMANDE NON RECONNUE + else + { + printf("commande inconnue\n"); + } + #endif + return 1; +} diff --git a/serveur/Serveur/ServeurCompo.h b/serveur/Serveur/ServeurCompo.h new file mode 100644 index 0000000..e7bb8d3 --- /dev/null +++ b/serveur/Serveur/ServeurCompo.h @@ -0,0 +1,21 @@ +//serveur de contraintes + +#ifndef _SERVCOMPO_ +#define _SERVCOMPO_ + +#include "../Global.h" + +#include "../Connexion/Socket.h" +#include "../Connexion/Connexion.h" + +#include "../Listes/ListePoints.h" +#include "../Listes/ListeDroites.h" +#include "../Listes/ListeCercles.h" + +void serveurcompo(char *nom, int typeserveur, Connexion * c); +void * th_creercompo(void * param); +void fk_creercompo(Connexion * c); +void *thread_travail_client(void *socket); +int traiterRequete(const char *ligne, Socket *sock, ListePoints &points, ListeDroites &droites, ListeCercles &cercles); + +#endif diff --git a/serveur/Serveur/ServeurCompo.o b/serveur/Serveur/ServeurCompo.o new file mode 100644 index 0000000000000000000000000000000000000000..e13c59df5b7d863dafa6b00ad8421bfa8087484c GIT binary patch literal 20564 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 N_=IY|FAx3T{6ESsNyh*H literal 0 HcmV?d00001 diff --git a/serveur/Serveur/makefile b/serveur/Serveur/makefile new file mode 100755 index 0000000..1e921bf --- /dev/null +++ b/serveur/Serveur/makefile @@ -0,0 +1,11 @@ +CPPC = g++ +OBJS = ServeurCompo.o + +serveur : $(OBJS) + +ServeurCompo.o : ServeurCompo.cpp ../Connexion/Socket.h ../Connexion/Connexion.h ../Listes/ListePoints.h ../Listes/ListeDroites.h ../Listes/ListeCercles.h ../Contraintes/CPoint.o ../Contraintes/CDroite.o ../Contraintes/CCercle.o ../Contraintes/Objet.o ../Contraintes/CPointIsole.o ../Contraintes/CPointInter2D.o ../Contraintes/CPointMilieu2P.o ../Contraintes/CDtePassant2P.o ../Contraintes/CDteHorizPassant1P.o ../Contraintes/CDteVertPassant1P.o ../Contraintes/CDtePerp1DPassant1P.o ../Contraintes/CDteParall1D.o ../Contraintes/CDteParall1DPassant1P.o ../Contraintes/CDteMediatrice2P.o ../Contraintes/CPointAppart1D.o ../Contraintes/CPointAppart1C.o ../Contraintes/CPointCentre1C.o ../Contraintes/CPointInter1C1D.o ../Contraintes/CPointInter2C.o ../Contraintes/CCerclePassant3P.o ../Contraintes/CCerclePassant1P.o ../Global.h + $(CPPC) -c ServeurCompo.cpp + +clean : + rm *.o + diff --git a/serveur/makefile b/serveur/makefile new file mode 100755 index 0000000..2a49260 --- /dev/null +++ b/serveur/makefile @@ -0,0 +1,23 @@ +CPPC = g++-3.4 +OBJS = s.o +OBJCONN = Connexion/SocketTCP.o Connexion/SocketUDP.o Connexion/Socket.o Connexion/Connexion.o +OBJLISTES = Listes/ListeCompo.o Listes/ListePoints.o Listes/ListeDroites.o Listes/ListeCercles.o +OBJSERV = Serveur/ServeurCompo.o +OBJCONTR = Contraintes/CPoint.o Contraintes/CDroite.o Contraintes/CCercle.o Contraintes/Objet.o Contraintes/CPointIsole.o Contraintes/CPointInter2D.o Contraintes/CPointMilieu2P.o Contraintes/CDtePassant2P.o Contraintes/CDteHorizPassant1P.o Contraintes/CDteVertPassant1P.o Contraintes/CDtePerp1DPassant1P.o Contraintes/CDteParall1D.o Contraintes/CDteParall1DPassant1P.o Contraintes/CDteMediatrice2P.o Contraintes/CPointAppart1D.o Contraintes/CPointAppart1C.o Contraintes/CPointCentre1C.o Contraintes/CPointInter1C1D.o Contraintes/CPointInter2C.o Contraintes/CCerclePassant3P.o Contraintes/CCerclePassant1P.o Contraintes/CCercleTangent2D.o +OBJFORMES = Formes/Point.o Formes/Droite.o Formes/Cercle.o +DOXYGEN = doxygen + +CPPS = s.cpp + +scompo : $(OBJS) $(OBJSERV) $(OBJCONN) $(OBJLISTES) $(OBJCONTR) $(OBJFORMES) $(DOXYGEN) + $(CPPC) -lnsl -lpthread -o scompo $(OBJCONN) $(OBJLISTES) $(OBJSERV) $(OBJCONTR) $(OBJFORMES) $(OBJS) + +s.o : Serveur/*.h Connexion/*.h Listes/*.h Contraintes/*.h Global.h s.cpp + $(CPPC) -c s.cpp + +doxygen : Doxyfile *.h *.cpp Listes/*.h Listes/*.cpp Connexion/*.h Connexion/*.cpp Serveur/*.h Serveur/*.cpp Contraintes/*.h Contraintes/*.cpp Formes/*.h Formes/*.cpp +# doxygen Doxyfile + +clean : + rm *.o + rm scompo diff --git a/serveur/s.cpp b/serveur/s.cpp new file mode 100755 index 0000000..27f9ac0 --- /dev/null +++ b/serveur/s.cpp @@ -0,0 +1,254 @@ +#include +#include +#include +#include + +#include "Connexion/Connexion.h" +#include "Connexion/Socket.h" +#include "Connexion/SocketUDP.h" +//#include "Compo/CompoInfo.h" +#include "Listes/ListeCompo.h" +#include "Serveur/ServeurCompo.h" +#include "Global.h" + +//#define TAILLE_BUFFER 2048 +#define DEFAULT_PORT 6666 + +int port = DEFAULT_PORT; //port par défaut +int typeserveur = C_FORK; //on utilise les fork par défaut +ListeCompo compos; + +//fonction qui va traiter les demandes de création et d'ouverture de compositions +void traiter(char *lecture,Socket *sock) +{ + int nb, i, p; + char *buffer = new char[TAILLE_BUFFER]; + char *commande = new char[TAILLE_BUFFER]; + Connexion *connectcompo=NULL; + + if ((nb = sscanf(lecture,"%s %s", commande, buffer)) == 2) + { + if (strcmp(commande,"NEW") == 0) + { + #ifdef VERBOSE + printf("\033[91m\033[40mcréation de la composition %s\033[0m\n",buffer); + #endif + connectcompo = new Connexion(P_TCP); + if ((p = compos.GetPortOfCompo(buffer)) == -1) + { + compos.AjouterCompo(buffer,connectcompo->GetPort()); + //lancement du fork ou de la thread ... + serveurcompo(strdup(buffer), typeserveur, connectcompo); + } + #ifdef VERBOSE + else + printf("\033[05m\033[41m\033[97mLa composition %s existe déjà au port %d\033[0m\n",buffer,p); + #endif + } + else + if (strcmp(commande,"OPEN") != 0) + { + #ifdef VERBOSE + printf("\033[41m\033[30mcommande inconnue : %s\033[0m\n",commande); + #endif + return; + } + #ifdef VERBOSE + else + { + printf("\033[40m\033[34mouverture de la composition %s\033[0m\n",buffer); + } + + printf("\033[40m\033[36menvoi du numéro de port de la composition\033[0m\n"); + #endif + p = compos.GetPortOfCompo(buffer); + #ifdef VERBOSE + printf("numero %d et nom %s\n",p,buffer); + #endif + sprintf(buffer,"%d\n",p); + sock->Ecrire(buffer); + } + //si c'est une demande de connexion on envoit la liste des compos + else if (nb == 1 && strcmp(lecture,"LIST") == 0) + compos.EnvoyerListe(sock); + else + sock->Ecrire("commande inconnue\n"); + + delete []lecture; + delete []buffer; + delete []commande; +} + +void *thread_client(void *socket) +{ + char *lecture = NULL; + Socket *sock = (Socket *)socket; + + //envoi de la liste des compositions au client + compos.EnvoyerListe(sock); + + //écoute de la réponse... + if ((lecture = sock->Lire()) == NULL) + { + #ifdef VERBOSE + printf("le client est parti\n"); + #endif + //détruire la socket vers le client : elle ne sert plus. + delete sock; + pthread_exit((void *)0); + } + + #ifdef VERBOSE + printf("\033[91m\033[40mclient :\033[0m %s\n",lecture); + #endif + traiter(lecture,sock); + + //détruire la socket vers le client : elle ne sert plus. + delete sock; + + pthread_exit((void *)0); +} + +void *thread_connect(void *proto) +{ + Connexion *c=NULL; + //pthread_t *thr; + pthread_t thr; + Socket * sock=NULL; + + switch ((int)proto) + { + //si c'est le serveur TCP + case P_TCP: + #ifdef VERBOSE + printf("lancement du protocole TCP\n"); + #endif + + //création de la socket d'écoute TCP + c = new Connexion(P_TCP,port); + + //écoute sur la socket + while(1) + { + if ((sock = c->AttendConnexion()) != NULL) + { + /*thr = new pthread_t; + if (pthread_create(thr,NULL,thread_client,(void *)sock) != 0) + perror("pthread_create (connect)");*/ + if (pthread_create(&thr,NULL,thread_client,(void *)sock) != 0) + perror("pthread_create (connect)"); + pthread_detach(thr); + } + } + #ifdef VERBOSE + printf("fin protocole TCP\n"); + #endif + break; + //si c'est le serveur UDP + case P_UDP: + #ifdef VERBOSE + printf("lancement du protocole UDP\n"); + #endif + + //création de la socket d'écoute UDP + sock = new SocketUDP(port); + + char *buffer; + //écoute sur la socket + while(1) + { + if ((buffer = sock->Lire()) != NULL) + //si c'est une autre commande on demande le traitement de cette commande + traiter(buffer,sock); + } + delete sock; + + #ifdef VERBOSE + printf("fin du protocole UDP\n"); + #endif + break; + //si c'est une erreur + default: + #ifdef VERBOSE + printf("protocole inconnu\n"); + #endif + pthread_exit(NULL); + } + + delete c; + + pthread_exit((void *)0); +} + +int main(int argc, char *argv[]) +{ + //variables pour l'analyse de la liugne de commande + int option; + char *listeoptions = "p:s:"; + + pthread_t threadtcp,threadudp; //threads de connexion + + //vérification du nombre d'arguments + if (argc > 5) + { + fprintf(stderr,"syntaxe : %s -p port -s [fork|thread]\n",argv[0]); + return(0); + } + + //lecture des arguments + while ((option = getopt (argc, argv, listeoptions)) != -1) + { + switch(option) + { + //argument port + case 'p': + sscanf(optarg,"%d",&port); + break; + //argument fork/thread + case 's': + if (strcasecmp(optarg,"fork") == 0) + typeserveur = C_FORK; + else + { + if (strcasecmp(optarg,"thread") == 0) + typeserveur = C_THREAD; + else + { + fprintf(stderr,"syntaxe : %s -p port -s [fork|thread]\n",argv[0]); + return(0); + } + } + break; + } + } + + #ifdef VERBOSE + //affichage du message de bienvenue + switch(typeserveur) + { + case C_FORK: + fprintf(stdout,"Lancement du serveur fork sur le port %d\n",port); + break; + case C_THREAD: + fprintf(stdout,"Lancement du serveur thread sur le port %d\n",port); + break; + } + #endif + + if (pthread_create(&threadtcp,NULL,thread_connect,(void *)P_TCP)!=0) + { + perror("thread tcp"); + return(0); + } + + if (pthread_create(&threadudp,NULL,thread_connect,(void *)P_UDP)!=0) + { + perror("thread udp"); + return(0); + } + + pthread_join(threadtcp,(void **)NULL); + pthread_join(threadudp,(void **)NULL); + + return (1); +} diff --git a/serveur/s.o b/serveur/s.o new file mode 100644 index 0000000000000000000000000000000000000000..8e74ea2aeb3031e8ff2525396f243a9649557910 GIT binary patch literal 6484 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 ZeDf|wxh?6Kx{~LDH`aMIx**Pr!TI( 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 literal 0 HcmV?d00001 diff --git a/serveur/ssauvegarde.cpp b/serveur/ssauvegarde.cpp new file mode 100755 index 0000000..0e2561c --- /dev/null +++ b/serveur/ssauvegarde.cpp @@ -0,0 +1,238 @@ +#include +#include +#include +#include + +#include "Connexion/Connexion.h" +#include "Connexion/Socket.h" +//#include "Compo/CompoInfo.h" +#include "Listes/ListeCompo.h" +#include "Serveur/ServeurCompo.h" +#include "Global.h" + +//#define TAILLE_BUFFER 2048 +#define DEFAULT_PORT 6666 + +int port = DEFAULT_PORT; //port par défaut +int typeserveur = C_FORK; //on utilise les fork par défaut +ListeCompo compos; + +void *thread_client(void *socket) +{ + int i, p; + char *buffer = new char[TAILLE_BUFFER]; + char *commande = new char[TAILLE_BUFFER]; + char *lecture = NULL; + Socket *sock = (Socket *)socket; + Connexion *connectcompo; +printf("envoi de la liste\n"); + //envoi de la liste des compositions au client + compos.EnvoyerListe(sock); +printf("liste envoyée\n"); + //écoute de la réponse... + if ((lecture = sock->Lire()) == NULL) + { + #ifdef VERBOSE + printf("le client est parti\n"); + #endif + pthread_exit((void *)0); + } + + #ifdef VERBOSE + printf("\033[91m\033[40mclient :\033[0m %s\n",lecture); + #endif + + if (sscanf(lecture,"%s %s", commande, buffer) == 2) + { + if (strcmp(commande,"NEW") == 0) + { + #ifdef VERBOSE + printf("\033[91m\033[40mcréation de la composition %s\033[0m\n",buffer); + #endif + connectcompo = new Connexion(P_TCP); + if ((p = compos.GetPortOfCompo(buffer)) == -1) + { + compos.AjouterCompo(buffer,connectcompo->GetPort()); + //lancement du fork ou de la thread ... + serveurcompo(buffer, typeserveur, connectcompo); + } + #ifdef VERBOSE + else + printf("\033[05m\033[41m\033[97mLa composition %s existe déjà au port %d\033[0m\n",buffer,p); + #endif + } + else + if (strcmp(commande,"OPEN") != 0) + { + #ifdef VERBOSE + printf("\033[41m\033[30mcommande inconnue : %s\033[0m\n",commande); + #endif + pthread_exit((void *)-1); + } + #ifdef VERBOSE + else + { + printf("\033[40m\033[34mouverture de la composition %s\033[0m\n",buffer); + } + + printf("\033[40m\033[36menvoi du numéro de port de la composition\033[0m\n"); + #endif + p = compos.GetPortOfCompo(buffer); + #ifdef VERBOSE + printf("numero %d et nom %s\n",p,buffer); + #endif + sprintf(buffer,"%d\n",p); + sock->Ecrire(buffer); + } + else + sock->Ecrire("commande inconnue\n"); + + delete []lecture; + delete []buffer; + delete []commande; + delete sock; + + //détruire la socket vers le client : elle ne sert plus. + + pthread_exit((void *)0); +} + +void *thread_connect(void *proto) +{ + Connexion *c; + //pthread_t *thr; + pthread_t thr; + Socket * sock; + + switch ((int)proto) + { + //si c'est le serveur TCP + case P_TCP: + #ifdef VERBOSE + printf("lancement du protocole TCP\n"); + #endif + + //création de la socket d'écoute TCP + c = new Connexion(P_TCP,port); + break; + //si c'est le serveur UDP + case P_UDP: + #ifdef VERBOSE + printf("lancement du protocole UDP\n"); + #endif + + //création de la socket d'écoute TCP + c = new Connexion(P_UDP,port); + break; + //si c'est une erreur + default: + #ifdef VERBOSE + printf("protocole inconnu\n"); + #endif + pthread_exit(NULL); + } + + //écoute sur la socket + while(1) + { + if ((sock = c->AttendConnexion()) != NULL) + { + printf("un client est arrivé\n"); + /*thr = new pthread_t; + if (pthread_create(thr,NULL,thread_client,(void *)sock) != 0) + perror("pthread_create (connect)");*/ + if (pthread_create(&thr,NULL,thread_client,(void *)sock) != 0) + perror("pthread_create (connect)"); + pthread_detach(thr); + } + } + + #ifdef VERBOSE + switch ((int)proto) + { + //si c'est le serveur TCP + case P_TCP: + printf("fin protocole TCP\n"); + break; + //si c'est le serveur UDP + case P_UDP: + printf("fin du protocole UDP\n"); + break; + } + #endif + + pthread_exit((void *)0); +} + +int main(int argc, char *argv[]) +{ + //variables pour l'analyse de la liugne de commande + int option; + char *listeoptions = "p:s:"; + + pthread_t threadtcp,threadudp; //threads de connexion + + //vérification du nombre d'arguments + if (argc > 5) + { + fprintf(stderr,"syntaxe : %s -p port -s [fork|thread]\n",argv[0]); + return(0); + } + + //lecture des arguments + while ((option = getopt (argc, argv, listeoptions)) != -1) + { + switch(option) + { + //argument port + case 'p': + sscanf(optarg,"%d",&port); + break; + //argument fork/thread + case 's': + if (strcasecmp(optarg,"fork") == 0) + typeserveur = C_FORK; + else + { + if (strcasecmp(optarg,"thread") == 0) + typeserveur = C_THREAD; + else + { + fprintf(stderr,"syntaxe : %s -p port -s [fork|thread]\n",argv[0]); + return(0); + } + } + break; + } + } + + #ifdef VERBOSE + //affichage du message de bienvenue + switch(typeserveur) + { + case C_FORK: + fprintf(stdout,"Lancement du serveur fork sur le port %d\n",port); + break; + case C_THREAD: + fprintf(stdout,"Lancement du serveur thread sur le port %d\n",port); + break; + } + #endif + + if (pthread_create(&threadtcp,NULL,thread_connect,(void *)P_TCP)!=0) + { + perror("thread tcp"); + return(0); + } + + if (pthread_create(&threadudp,NULL,thread_connect,(void *)P_UDP)!=0) + { + perror("thread udp"); + return(0); + } + + pthread_join(threadtcp,(void **)NULL); + pthread_join(threadudp,(void **)NULL); + + return (1); +} diff --git a/sujet.doc b/sujet.doc new file mode 100644 index 0000000000000000000000000000000000000000..996e01c525bf903a1c7f581096658aa6e2a8a4c8 GIT binary patch literal 34816 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 TUD?%c>!#dE^L%B$1rGcVgxpS$ literal 0 HcmV?d00001 -- 2.30.2