Section_I: Polygones avec chanfreins

Soyez le premier à donner votre avis sur cette source.

Vue 830 fois - Téléchargée 171 fois

Description

Bonjour,

Cette extension du logiciel "Section: Polygones" permet d'ajouter un chanfrein symétrique sur un sommet sélectionné.

A l'aide du bouton de droite de la souris, on choisit le sommet de manière interactive, c'est-à-dire directement sur le dessin du polygone. Il sera affiché par un point rouge.

Actuellement, on va utiliser la notion de cotation selon le schéma 2 de "Schémas de cotation de chanfreins.jpg" du Zip.(Ce fichier peut aussi être obtenu à l'aide du lien "Creo Parametric: Schémas de cotation de chanfreins" ci-dessous)

Adaptation des codes:
LRESULT CALLBACK Wpro(HWND hw,UINT m,WPARAM wP,LPARAM lP) {
// ...
  switch(m) {
  // ...
  case WM_RBUTTONDOWN: if (poly.Select(GET_X_LPARAM(lP),GET_Y_LPARAM(lP),&tf))
    InvalidateRect(hw,0,0); return 0;
  //...
  case WM_COMMAND: switch(wP) {
    // ...
    case MChf: { // Chanfrein
      if (poly.sel==0) return 0;
      Param *c=prmL.UseParam("Chf");
      if (_finite(c->val)) poly.Chanfrein(c->val);
    } break;
    // ...
  } InvalidateRect(hw,0,0); return 0; // force à redessiner
  // ...
}

struct Polygone { // Basé sur des cycles de segments
  static const int  tol=5;

  Segment *last=0,*sel=0;
  double A;     // Aire: A=∫dA
  double Sx,Sy; // Moments statiques: Sx=∫y·dA, Sy=∫x·dA
  double Xg,Yg; // Centre de gravité: Xg=Sy/A, Yg=Sx/A
  double Ix,Iy; // Moments d'inertie axiaux: Ix=∫y²·dA, Iy=∫x²·dA
                // Moment d'inertie polaire: Ip=Ix+Iy

  // ...
  Segment *Precedent(Segment *seg) { // Precedent->nxt == seg
    Segment *s=last;
    if (s) do
      if (s->nxt!=seg) s=s->nxt; else return s;
    while (s!=last);
    return 0;
  }
  // ...
  void MarkSel(HDC dc,Tfm2D *t) {
    if (sel==0) return;
    POINT xy;
    t->ToPoint(sel,&xy);
    int x=xy.x,y=xy.y;
    Ellipse(dc,x-tol,y-tol,x+tol,y+tol);
  }
  // ...
  bool Select(int i, int j, Tfm2D* tf) {Segment *s=last;
    if (s) {
      double x=tf->CoordX(i),y=tf->CoordY(j),t=abs(tol/tf->Dil);
      do {s=s->nxt;
        if ((abs(x-s->X)<=tol)&&(abs(y-s->Y)<=tol)) {sel=s; return true;}
      }  while (s!=last);
    } return false;
  }
  // ...
  // --- Adjonctions ------------------------------------------------------------
  void Chanfrein(double D) { // sel != 0
    Segment *pcd=Precedent(sel),*svt=sel->nxt,*z;
    double x=sel->X,y=sel->Y,dx=x-svt->X,dy=y-svt->Y,d;
    d=D/sqrt(dx*dx+dy*dy); z=new Segment(x-d*dx,y-d*dy);
    dx=x-pcd->X; dy=y-pcd->Y; d=D/sqrt(dx*dx+dy*dy); sel->X-=d*dx; sel->Y-=d*dy;
    z->nxt=sel->nxt; sel->nxt=z; sel=0;
  }
};
Menu.cpp est aussi adapté.

Lorsque les segments d'un sommet sont perpendiculaires, l'introduction d'un chanfrein symétrique est simple. Par contre, dans le cas général, ce n'est pas tout-à-fait évident.

Pour permettre d'adjoindre des chanfreins symétriques sur des sommets définis par des segments d'angles quelconques, j'ajoute la construction d'une étoile régulière:
struct Polygone {
// ...
  void EtoileReguliere(double R,double r,int n) {
    if (n>=2) Clear(); else return;
    double da=6.2831853071795865/n,c=cos(da),s=sin(da),
      X=R,Y=0,x=r*cos(da/2),y=r*sin(da/2),xx;
    Append(new Segment(X,Y)); Append(new Segment(x,y));
    for (int i=1; i<n; i++) {
      xx=X; X=X*c-Y*s; Y=xx*s+Y*c; Append(new Segment(X,Y));
      xx=x; x=x*c-y*s; y=xx*s+y*c; Append(new Segment(x,y));
    }
  }
  // ...
};

Effectuez les étapes suivantes pour obtenir le polygone correspondant à l'image de capture:
_EtR   100.000
_Etr    32.000
_Etn     7
_Chf    20.000
‥ Copier ces 4 paramètres dans la fenêtre PolyEdit.
‥ Activer ces paramètres: ► Activer params.
‥ Construire l'étoile: ► {Construction} ► Etoile régulière [EtR,Etr,Etn].
‥ Refaire la mise en page: ► Voir tout.
‥ Sélectionner la "pointe" du 1. cadrant: (droite)► pointe    (point rouge).
‥ Adjoignez le chanfrein: ► {Adjonction} ► Chanfrein [Chf].
‥ Sélectionner le "creux" qui suit: (droite)► creux    (point rouge).
‥ Adjoignez le chanfrein: ► {Adjonction} ► Chanfrein [Chf].
‥ Centrer: ► {Opération} ► Centrer sur (Xg,Yg)    (très petit déplacement).
‥ Rotation sur axes principaux: ► {Opération} ► Rotation sur axes principaux
‥ Calculer les caractéristiques: ► Calculer>    (dans PolyEdit).
 
 
Bonne lecture ...
 

Adaptation et compilation des fichiers sources

Avec la version gratuite de MS Visual Studio Express, il suffit de suivre les étapes suivantes:
► New Projet
► Visual C++ ► General ► Empty Projet
a) Donner le nom du projet.
b) Ajouter le fichier existant Polygone.cpp dans Sources Files (clic droit).

Les fichiers d'entête *.h et les autres fichiers tels que Menu.cpp etc ..., n'ont pas besoin d'être ajoutés à la solution.
Ils sont importés par les #include dans Polygone.cpp.
Mais pour pouvoir les adapter, on peut simplement les glisser dans la fenêtre principale de MS VSExpress.
Tous ces fichier doivent figurer dans un même dossier.
 

Liens

Creo Parametric: Schémas de cotation de chanfreins
CodeS-SourceS:
Section_A: Polygone (caractéristiques géométriques)
Section_B: Polygone en cycle de segments
Section_C: Polygone avec symétries
Section_D: Polygone, opérations paramétrées
Section_E: Polygone, constructions paramétrées
Section_F: Polygone, profils usuels I L T U Z
Section_G: Polygone, produit d'inertie Ixy
Section_H: Polygone, axes principaux
 

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.