Il Bar dell'Ingegneria

La foroflangia

« Older   Newer »
 
  Share  
.
  1. zax2013
        +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,942
    Reputation
    +187

    Status
    Offline
    La geometria

    Prima di partire con le funzioni di calcolo, bisogna organizzare l'input.
    La sezione in definitiva è costituita da una serie di cerchi, pieni o vuoti. I 2 della flanga (il cerchio esterno pieno, quello interno vuoto), e tutti i cerchi che costituiscono i fori.
    Ma come dicevo nel primo post il codice funziona solamente con poligoni di lati rettilinei. Quindi i cerchi verranno approssimati con poligoni regolari inscritti ai vari cerchi.
    Nella schermata di input (del wizard o del programma stand-alone) oltre al diametro infatti sono presenti tutti i controlli che definiscono il numero di punti che andranno ad approssimare i vari cerchi. Ho inserito la limitazione di 16 punti come minimo, ma posso arrivare anche a 100 per ogni singolo cerchio.

    Quindi ho creato la funzione che restituisce un poligono 'circolare':

    CODICE
    struct poligono_sezione definisci_poli_cerchio(float fi_cerchio,int npunti,float xc,float yc)
    {
    int register k;
    float pi,alfa,alfa_step;
    struct poligono_sezione circle;

    pi=4*atan(1);

    alfa_step=2*pi/npunti;
    alfa=0;

    for (k=0;k<=npunti-1;k++)
       {
        circle.x[k]=xc+fi_cerchio/2*sin(alfa);
        circle.y[k]=yc-fi_cerchio/2*cos(alfa);

        alfa+=alfa_step;
       }

    return (circle);
    }


    Semplice geometria polare, che non vale la meno nemmeno spiegare. xc ed yc il centro del cerchio.

    Quindi da qualche parte ci sarà un codice del genere:

    CODICE
    /* Inserisce i dati nei singoli poligoni */
    poli=(struct poligono_sezione *) calloc(2,sizeof(struct poligono_sezione));
    /* Cerchio esterno */
    poli[0]=definisci_poli_cerchio(diame,discre,0.0,0.0);
    poli[0].omog=1.0;
    /* Cerchio interno */
    poli[1]=definisci_poli_cerchio(diami,discri,0.0,0.0);
    poli[1].omog=-1.0;
    /* Alloca memoria per i cerchi dei singoli fori */
    poli=(struct poligono_sezione *) realloc(poli,(2+numf)*sizeof(struct poligono_sezione));

    pi=4*atan(1);
    alfa_step=2*pi/numf;
    alfa=0.0;

    /* Quindi definisce i singoli fori */
    for (k=0;k<=numf-1;k++)
       {
        px=x+diamf/2*sin(alfa);
        py=y-diamf/2*cos(alfa);

        poli[k+2]=definisci_poli_cerchio(diamff,discrf,px,py);
        poli[k+2].omog=-1.0;
        alfa+=alfa_step;
       }


    Ovvero il richiamo della funzione definisci_poli_cerchio() per ogni singolo poligono che costituisce la sezione.
    L'occupazione in memoria viene gestita in maniera dinamica. Per cui inizialmente viene riservata memoria per 2 poligoni (il diametro esterno ed interno della flangia), quindi viene aumentata la dimensione del vettore in base al numero dei fori nella flangia stessa.

    La flangia viene posta con centro dei cerchi nel punto di coordinate 0,0 - i centri dei fori vengono determinati anche loro tramite semplice geometria polare.

    In corrispondenza del centro di ogni foro verrà infine posizionato l'oggetto 'bullone' di cui tratterò nel prossimo post.
     
    Top
    .
24 replies since 24/7/2015, 21:54   4505 views
  Share  
.