Section_C: Polygone avec symétries

Soyez le premier à donner votre avis sur cette source.

Vue 791 fois - Téléchargée 137 fois

Description

[Version avec image de capture qui remplace celle du 15.02.2018]

Bonjour,

Nous allons dans les prochaines versions introduire bien des méthodes pour construire des polygones très divers.
Pour "économiser" de la place sur l'écran, remplaçons d'abord les "boutons de commande" par un menu qui permet d'activer les mêmes fonctions.

La plupart des sections polygonales utilisées en pratique comportent une ou deux symétries (axiales).
Dans ces cas, il suffit de ne définir que la moitié ou même que le quart des segments qui forment le polygone.

Comme de bien entendu, avant de lancer une symétrie, il est impératif que tous les points figurent d'un même coté par rapport à l'axe concerné (X ou Y).
Sinon, le résultat est assez imprévisible et loufoque; pour le moment, aucun contrôle n'est fait !

Exemple:
$ 3 7
$ 3 4
$ 6 4
$ 6 0
$ 13 0
$ 5 11
                   Y                              Y
           6       |       5                      |      5
            ###############                       |      #
           #       |       #                      |     / #
          #  11    |    0   #                     |    /   #
         #     #########     #          <===      | 0 #     # 
        #      #   |   #      #         SymY      |   #      #
       #   9   #   |   #   2   #        <===      |   #   2   #
      #     ####   |   ####     #                 |   ####     #
     #      #   10 |  1   #      #                |  1   #      #
    #       #      |      #       #               |      #       # 
   ##########      |      ##########              |      ########## 
  7          8     |     3          4             |     3          4 
                   Y                              Y
Copiez les 6 points ci-dessus dans PolyEdit, puis Lire coords et + Symétrie axe Y.

Les fonctions "SymetrieX" et "SymetrieY" sont relativement simples:
  void SymetrieX() { // tous les points du même coté de l'axe X
    if (lst==0) return;
    Segment *s=lst,*newC=0,*n=0;
    do {s=s->nxt;
      n=new Segment(s->X,-s->Y); // Insert first dans cycle newC
      if (newC) {n->nxt=newC->nxt; newC->nxt=n;} else {n->nxt=n; newC=n;}
    } while (s!=lst);
    newC->nxt=lst->nxt; lst->nxt=n; lst=newC; // réunit les deux cycles
  }

  void SymetrieY() { // tous les points du même coté de l'axe Y
    if (lst==0) return;
    Segment *s=lst,*newC=0,*n=0;
    do {s=s->nxt;
      n=new Segment(-s->X,s->Y); // Insert first dans cycle newC
      if (newC) {n->nxt=newC->nxt; newC->nxt=n;} else {n->nxt=n; newC=n;}
    } while (s!=lst);
    newC->nxt=lst->nxt; lst->nxt=n; lst=newC; // réunit les deux cycles
  }
Etapes de void SymetrieY():
1) Le segment du dernier au premier point est provisoire.
2) On crée un polygone symétrique (-X,Y), où les segments tournent dans le sens opposé.
3) Les segments provisoires sont utilisés pour réunir les deux polygones.

Autre exemple:
$ 3 0
$ 7 7
$ 0 3
Copiez les 3 points ci-dessus dans la fenêtre PolyEdit, puis Lire coords.
Ensuite Symétrie axe X et Symétrie axe Y.

Dans ce second exemple, en listant les coordonnées obtenues, on remarque que 4 points apparaissent en double.
D'où l'intérêt de faire prochainement une fonction qui élimine les points doubles.

Remarquez aussi l'ajout des fonctions Miroir axe X et Miroir axe Y ajoutés sous {Opérations} pour lesquelles, en plus du changement des coordonnées, il y faut aussi inverser le sens du cycle.

Les appels à Rectangle et PolygoneRegulier se font actuellement avec des arguments fixes.
La prochaine version permettra de les appeler, ainsi que bien d’autres, avec des paramètres définis interactivement.


Bonne lecture ...

Liens

CodeS-SourceS: Polygones
CodeS-SourceS: Section_A: Polygone (caractéristiques géométriques)
CodeS-SourceS: Section_B: Polygone en cycle de segments
CodeS-SourceS: Windows-Controls: G-Menu

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Commenter la réponse de William VOIROL

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.