Il Bar dell'Ingegneria

Spirali logaritmiche in AutoCad

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

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    P.S.: Questo topic è una estensione del topic "Hansen e Greten" trattato ---> QUI ed insieme contribuiscono alla scrittura del programma CaLifFo trattato e pubblicato ---> QUI

    Per poter adornare il manuale con qualche superficie spiraliforme, ho predisposto un piccolo programmino in VBA per autocad che permette di disegnare le diverse superfici di rottura ipotizzate da diversi autori per la determinazione del carico limite di fondazioni superficiali.

    tantespirali

    Il dialogo permette di poter scegliere tra le superfici di Terzaghi, quelle di Meyerhof e quelle classiche utilizzate nelle teorie di Brinch Hansen e Vesic, inoltre è possibile disegnare anche le linee caratteristiche fino ad un massimo di 10 e, laddove i dati inserirti in input lo consentono, disegnare anche le superfici simmetriche.

    Il file *.dvb lo si puo' scaricare al seguente link.

    https://www.box.com/s/syal0b3cejki92hzddos

    Per installazione ed avvio si consiglia di leggere altri topic dove ho riportato la procedura.

    Enjoy

    Segnalo altri topic che riguardano VBA ed AutoCad
    ___________________________________________________________________________
    - VBA e Autocad. Primi passi
    - VBA e Autocad. Ancora primi passi
    - VBA e AutoCad- Le primitive: la polilinea
    - VBA e AutoCAd Le primitive- IL cerchio
    - VBA Autocad --->Excel
    - VBA e AutoCad - Pick Points
    - PickPoints: salvare i dati da Autocad in Excel
    - VBA e Autocad. Il controllo del controllo
    - VBA e AutoCAD- Un esempio pronto all'uso

    - VBA AutoCad - Disegnare ellisse e nocciolo con un clik
    - Spirali logaritmiche in AutoCad
    - Disegno segmento in Autocad attraverso macro VBA Excel
    - Avviare una macro Autocad da Macro Excel
    - Progetto Sovratensioni e tracciamento ISOBARE in autocad
    - VBA E aUTOcAD- La numerazione automatica
    - VBA e AutoCad - La fotonumerazione
    - Autocad e VBA
    - Tower
    ___________________________________________________________________________

    Edited by afazio - 23/10/2013, 10:57
     
    Top
    .
  2.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    Per approfondire la questione della superfici di rottura con tratto a spirale, rinvio alla lettura del topic:

    Fantasticherie su spirale fantastica
     
    Top
    .
  3.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    Per far disegnare le superfici ad Autocad, una volta acquisito l'input dal dialogo, calcolo i parametri necessari per il disegno e successivamente richiamo tre diverse procedure che voglio illustrare in questo messaggio.
    Le tre procedure sono:

    - la procedura che mi disegna il profilo del terreno
    - la procedura che mi disegna il ventaglio di Prandtl (ed eventualmente anche il simmetrico)
    - la procedura che mi disegna la zona passiva o la zona attiva (ed eventualmente anche le simmetriche e le linee caratteristiche.

    Disegno del ventaglio di prandtl.

    La sub accetta come parametri:
    - le coordinate del polo rispetto al sistema globale di autocad (in altre parole le coordinate del punto dove posizionare il disegno; (x0,y0)
    - l'anomalia iniziale della spirale valutata rispetto all'asse x rivolto verso sinistra (t0)
    - il raggio iniziale della spirale (Ro)
    - l'anomalia di fine spirale (t1)
    - l'angolo di attrito interno (fi)
    - il numero delle superfici caratteristiche da disegnare (NSP)
    - paramatro boolean che indica se disegnare anche le simmetriche (sYM)
    - ascissa dell'asse verticale di simmetria (xSym)

    CODICE
    Sub Spirale(x0 As Double, y0 As Double, t0 As Double, Ro As Double, t1 As Double, fi As Double, NSP As Integer, sYm As Boolean, xSym As Double)


    Edited by afazio - 9/7/2013, 19:04
     
    Top
    .
  4.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    La procedura dovrà disegnare sostanzialmente delle polilinee (rappresentanti le parti a spirale) e delle linee (i raggi), quindi dimensiono le variabili necessarie:

    CODICE
    Dim Polilinea As AcadPolyline ' variabile per l'oggetto polilinea
    Dim Vertici() As Double ' lista delle coordinate dei vertici della polilinea

    Dim Linea As AcadLine ' variabile per l'oggetto linea
    Dim StartPoint(0 To 2) As Double ' punto iniziale della linea
    Dim EndPoint(0 To 2) As Double 'punto finale della linea


    La spirale, come anticipato, viene disegnata con una polilinea i cui vertici vengono determinati dividendo l'intero arco di spirale in un certo numero di parti, e pertanto mi serviranno dei contatori che definisco:

    CODICE
    Dim i As Integer ' contatore dei punti di suddivisione
    Dim j As Integer ' contatore del numero di spirali da disegnare
    Dim n_point As Integer ' numero di suddivisione della spirale



    e delle variabili intermedie dove collocare le coordinate dei punti sulla spirale:

    CODICE
    Dim xi As Double ' ascissa del punto i-esimo sulla spirale
    Dim yi As Double ' ordinata del punto i-esimo sulla spirale
    Dim teta_i As Double ' anomalia in corrispondenza del punto i-esimo
    Dim teta_j As Double ' anomalia in corrispondenza del punto j-esimo
    Dim Dt As Double ' differenza tra anomalia finale ed iniziale


    quindi fisso in 50 il numero delle divisioni

    CODICE
    Dt = (t1 - t0)
    n_point = 50
     
    Top
    .
  5.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    A questo punto, il calcolo delle coordinate dei vertici della polilinea ed il disegno della stessa polilinea diventa banale.

    CODICE
    ' disegno le spirali
    ReDim Vertici(0 To 3 * n_point - 1) As Double
    For j = 1 To NSP
       For i = 1 To n_point
           teta_i = t0 + (i - 1) * Dt / (n_point - 1)
           xi = (NSP + 1 - j) * Ro / NSP * Exp((teta_i - t0) * Tan(fi)) * Cos(teta_i)
           yi = (NSP + 1 - j) * Ro / NSP * Exp((teta_i - t0) * Tan(fi)) * Sin(teta_i)
           Vertici(3 * i - 3) = -xi + x0
           Vertici(3 * i - 2) = -yi + y0
           Vertici(3 * i - 1) = 0
       Next i
       Set Polilinea = ThisDrawing.ModelSpace.AddPolyline(Vertici())
    Next


    Il primo ciclo, quello esterno con contatore j, mi permette di disegnare piu' spirali in funzione del valore NSP.
    Se questo vale 1 (quindi non si richiede il disegno delle superfici caratteristiche) verra disegnata la sola spirale piu' esterna, altrimenti ne verranno disegnate altre interne con raggio iniziale pari ad alla j-esima/Nsp frazione del valore inziiale di Ro.

    E' da sottolineare che tutto questo puo' avvenire per qualsiasi delle teorie previste.
     
    Top
    .
  6.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    Non mi resta che disegnare i raggi delle spirali che rappresentano le linee corrispondenti alle spirali

    CODICE
    ' disegno i raggi
    StartPoint(0) = 0 + x0
    StartPoint(1) = 0 + y0
    StartPoint(2) = 0
    For j = 1 To NSP + 1
       teta_j = t0 + (j - 1) * Dt / NSP
       EndPoint(0) = -Ro * Exp((teta_j - t0) * Tan(fi)) * Cos(teta_j) + x0
       EndPoint(1) = -Ro * Exp((teta_j - t0) * Tan(fi)) * Sin(teta_j) + y0
       EndPoint(2) = 0
       Set Linea = ThisDrawing.ModelSpace.AddLine(StartPoint, EndPoint)
    Next


    Infine il codice viene completato col disegno della parte simmetrica se richiesto dal parametro booleano sYm:

    CODICE
    ' se sym=true, disegno le simmetriche
    If sYm Then
       For j = 1 To NSP
           For i = 1 To n_point
               teta_i = t0 + (i - 1) * (t1 - t0) / (n_point - 1)
               xi = (NSP + 1 - j) * Ro / NSP * Exp((teta_i - t0) * Tan(fi)) * Cos(teta_i)
               yi = (NSP + 1 - j) * Ro / NSP * Exp((teta_i - t0) * Tan(fi)) * Sin(teta_i)
               Vertici(3 * i - 3) = xi + x0 + 2 * xSym
               Vertici(3 * i - 2) = -yi + y0
               Vertici(3 * i - 1) = 0
           Next i
           Set Polilinea = ThisDrawing.ModelSpace.AddPolyline(Vertici())
       Next
       
       ' disegno i raggi
       Dt = (t1 - t0)
       StartPoint(0) = 0 + x0 + 2 * xSym
       StartPoint(1) = 0 + y0
       StartPoint(2) = 0
       For j = 1 To NSP + 1
           teta_j = t0 + (j - 1) * Dt / NSP
           EndPoint(0) = Ro * Exp((teta_j - t0) * Tan(fi)) * Cos(teta_j) + x0 + 2 * xSym
           EndPoint(1) = -Ro * Exp((teta_j - t0) * Tan(fi)) * Sin(teta_j) + y0
           EndPoint(2) = 0
           Set Linea = ThisDrawing.ModelSpace.AddLine(StartPoint, EndPoint)
       Next
    End If
     
    Top
    .
  7.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    Il disegno dei cunei di Rankine

    Anche per i disegno dei due cunei di Rankine, quello attivo e quello passivo unitamente alle eventuali linee caratteristiche se richiesto (e delle simmetriche sempre se richiesto) viene eseguito mediante ricorso ad una subroutine unica e generalizzata che accetta come input i tre punti del triangolo che costituisce il cuneo:

    CODICE
    Sub RankineADE(x0 As Double, y0 As Double, PuntoA As TipoPunto, PuntoD As TipoPunto, PuntoE As TipoPunto, NSP As Integer, sYm As Boolean, xSym As Double)


    I parametri in input sono:
    - le solite coordinate del punto dove si vuole collocato il disegno
    - i tre punti del triangolo costituente il cuneo passati attraverso tre variabili strutturate di tipo "tipoPunto"
    - il numero delle superfici caratteristiche che si vogliono disegnate
    - il parametro booleano che indica se si vogliono disegnate anche le simmetriche
    - l'ascissa dell'asse di simmetria.
     
    Top
    .
  8.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    Per il disegno dei cunei di Rankine e delle eventuali superfici caratteristiche, servono solo segmenti, definisco quindi la variabile destinata a contenere l'oggetto linea da disegnare:

    CODICE
    Dim Linea As AcadLine ' variabile per l'oggetto linea
    Dim StartPoint(0 To 2) As Double ' punto iniziale della linea
    Dim EndPoint(0 To 2) As Double ' punto finalee della linea
    Dim j As Integer ' contatore

    Dim xi As Double ' variabili di appoggio per il calcolo delle coordinate degli estremi dei segmenti
    Dim yi As Double
    Dim xf As Double
    Dim yf As Double


    Si tratta di disegnare segmenti che uniscono i punti in cui si suddivide il segmento che ho indicato con AE con i punti corrispondenti in cui viene suddiviso il segmento AD. Quindi per le superfici corrispondenti, occorre disegnare i punti in cui si suddivide AE coi punti corrispondenti in cui si suddivide il segmento DE

    CODICE
    ' disegno il reticolo delle superfici caratteristiche
    For j = 1 To NSP
       xi = PuntoA.x + j * (PuntoD.x - PuntoA.x) / NSP
       yi = PuntoA.y + j * (PuntoD.y - PuntoA.y) / NSP
       xf = PuntoA.x + j * (PuntoE.x - PuntoA.x) / NSP
       yf = PuntoA.y + j * (PuntoE.y - PuntoA.y) / NSP
       StartPoint(0) = xi + x0
       StartPoint(1) = yi + y0
       StartPoint(2) = 0
       EndPoint(0) = xf + x0
       EndPoint(1) = yf + y0
       EndPoint(2) = 0
       Set Linea = ThisDrawing.ModelSpace.AddLine(StartPoint, EndPoint)
       If j < NSP Then
           xi = PuntoD.x + j * (PuntoE.x - PuntoD.x) / NSP
           yi = PuntoD.y + j * (PuntoE.y - PuntoD.y) / NSP
           
           xf = PuntoA.x + j * (PuntoE.x - PuntoA.x) / NSP
           yf = PuntoA.y + j * (PuntoE.y - PuntoA.y) / NSP
           StartPoint(0) = xi + x0
           StartPoint(1) = yi + y0
           StartPoint(2) = 0
           EndPoint(0) = xf + x0
           EndPoint(1) = yf + y0
           EndPoint(2) = 0
           Set Linea = ThisDrawing.ModelSpace.AddLine(StartPoint, EndPoint)
       End If
    Next
    ' disegno il segmento AE
       StartPoint(0) = PuntoA.x + x0
       StartPoint(1) = PuntoA.y + y0
       StartPoint(2) = 0
       EndPoint(0) = PuntoE.x + x0
       EndPoint(1) = PuntoE.y + y0
       EndPoint(2) = 0
       Set Linea = ThisDrawing.ModelSpace.AddLine(StartPoint, EndPoint)
     
    Top
    .
  9.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    Anche in questo caso, se il parametro booleano Sym è vero, allora occorre disegnare anche le simmetriche:

    CODICE
    ' se sym=true, disegno le simmetriche
    If sYm Then
    For j = 1 To NSP
       xi = PuntoA.x + j * (PuntoD.x - PuntoA.x) / NSP
       yi = PuntoA.y + j * (PuntoD.y - PuntoA.y) / NSP
       xf = PuntoA.x + j * (PuntoE.x - PuntoA.x) / NSP
       yf = PuntoA.y + j * (PuntoE.y - PuntoA.y) / NSP
       StartPoint(0) = -xi + x0 + 2 * xSym
       StartPoint(1) = yi + y0
       StartPoint(2) = 0
       EndPoint(0) = -xf + x0 + 2 * xSym
       EndPoint(1) = yf + y0
       EndPoint(2) = 0
       Set Linea = ThisDrawing.ModelSpace.AddLine(StartPoint, EndPoint)
       If j < NSP Then
           xi = PuntoD.x + j * (PuntoE.x - PuntoD.x) / NSP
           yi = PuntoD.y + j * (PuntoE.y - PuntoD.y) / NSP
           
           xf = PuntoA.x + j * (PuntoE.x - PuntoA.x) / NSP
           yf = PuntoA.y + j * (PuntoE.y - PuntoA.y) / NSP
           StartPoint(0) = -xi + x0 + 2 * xSym
           StartPoint(1) = yi + y0
           StartPoint(2) = 0
           EndPoint(0) = -xf + x0 + 2 * xSym
           EndPoint(1) = yf + y0
           EndPoint(2) = 0
           Set Linea = ThisDrawing.ModelSpace.AddLine(StartPoint, EndPoint)
       End If
    Next
    ' disegno il segmento AE
       StartPoint(0) = -PuntoA.x + x0 + 2 * xSym
       StartPoint(1) = PuntoA.y + y0
       StartPoint(2) = 0
       EndPoint(0) = -PuntoE.x + x0 + 2 * xSym
       EndPoint(1) = PuntoE.y + y0
       EndPoint(2) = 0
       Set Linea = ThisDrawing.ModelSpace.AddLine(StartPoint, EndPoint)
    End If
     
    Top
    .
  10.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,942
    Reputation
    +187

    Status
    Online
    afazio, per il disegno delle simmetriche, se non ho capito male duplichi l'intero codice.

    Non si poteva introdurre un parametro flag (o sym) che valesse 1, oppure -1, da anteporre alle varie coordinate?
    In questo modo con unico listato avresti potuto disegnare la superficie 'vera' (sym=1) e quella speculare (sym=-1)
     
    Top
    .
  11.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    CITAZIONE (zax2013 @ 4/2/2013, 14:12) 
    afazio, per il disegno delle simmetriche, se non ho capito male duplichi l'intero codice.

    Non si poteva introdurre un parametro flag (o sym) che valesse 1, oppure -1, da anteporre alle varie coordinate?
    In questo modo con unico listato avresti potuto disegnare la superficie 'vera' (sym=1) e quella speculare (sym=-1)

    Zax, sinceramente mi aspettavo questo tuo appunto ed hai anche ragione, ma volendo disporre quasi subito del dvb da passare a reversi per adornare il manuale ho preferito essere spedito e cavarmela con la semplice duplicazione del codice.
    Non escludo che in una delle prossime revisioni necessarie, forse, per correggere qualche bug, di agire anche sul codice.

    Aggiungo anche il fatto che l'opzione del disegno delle superfici simmetriche la ho aggiunta alla fine, quando cioè avevo gia scritto le varie sub.


    Intanto come puoi vedere, queste due procedure sono generiche e valgono per qualsiasi teoria. La stessa cosa vale per la terza sub che accetta sei punti e mi disgena il terreno.

    Il vero lavoriò sta a monte di tutto questo e consiste nel ricavare per ogni teoria i parametri necessari per il disegno. Conto di illustrare anche questo.

    La terza procedura richiamata è quella che disegna il profilo del terreno.
    Questa è semplice dato che l'onere del calcolo dei punti che definiscono il profilo avvine a monte mentre in questa sub non si fa altro che predisporre le coordinate dei vertici cosi come è richiesto dall'oggetto polilinea di autocad e procedere col disegno della polilinea


    CODICE
    Sub TerrenoP(x0 As Double, y0 As Double, _
                P1 As TipoPunto, P2 As TipoPunto, _
                P3 As TipoPunto, P4 As TipoPunto, _
                P5 As TipoPunto, P6 As TipoPunto)

    Dim Polilinea As AcadPolyline
    Dim Vertici(0 To 17) As Double

       Vertici(0) = P1.x + x0
       Vertici(1) = P1.y + y0
       Vertici(2) = 0
       ' punto 2
       Vertici(3) = P2.x + x0
       Vertici(4) = P2.y + y0
       Vertici(5) = 0
       ' punto 3
       Vertici(6) = P3.x + x0
       Vertici(7) = P3.y + y0
       Vertici(8) = 0
       ' punto 4
       Vertici(9) = P4.x + x0
       Vertici(10) = P4.y + y0
       Vertici(11) = 0
       ' punto 5
       Vertici(12) = P5.x + x0
       Vertici(13) = P5.y + y0
       Vertici(14) = 0
       ' punto 6
       Vertici(15) = P6.x + x0
       Vertici(16) = P6.y + y0
       Vertici(17) = 0
       Set Polilinea = ThisDrawing.ModelSpace.AddPolyline(Vertici())

    End Sub


    Tento di illustrare adesso i calcoli condotti a monte, cioè prima di richiamare le suespsote procedure di disegno.
    Per far questo, intanto esplicito il nome che ho attribuito alle variabili:

    CODICE
    Dim B As Double
    Dim D As Double
    Dim fi As Double
    Dim alfa As Double
    Dim eta As Double
    Dim beta As Double
    Dim k As Double


    Questi credo siano autoesplicativi. I relativi valori vengono letti dalla caselle di input presenti nel dialogo.

    Ho anche dato i seguenti nomi ad altra variabili:

    CODICE
    Dim Teta0 As Double ' anomalia iniziale
    Dim r0 As Double ' raggio iniziale
    Dim Teta1 As Double ' anomalia finale

    Dim beta_0 As Double ' angolo "conveniente" nella teoria di Meyerhof
    Dim eta_0 As Double ' angolo formato tra la free surface di meyerhof ed il cuneo passivo
    Dim wo As Double ' direzione della tangente alla spirale nel punto di fine
    Dim pi As Double
    pi = 4 * Atn(1)


    inoltre ho definito anche le seguenti variabili:

    CODICE
    Dim xmax As Double ' ascissa del punto di intersezione della spirale col piano di fondazione
    Dim ymax As Double ' ordinata del punto di intersezione della spirale con la superficie di scavo
    Dim Lmax As Double ' massima estensione del profilo di terreno

    Dim sYm As Boolean 'variabile che mi idnica se è richiesto o meno il disegno delle simmetriche
    Dim nSpirali As Integer ' variabile che mi indica il numero delle superfici caratteritiche da disegnare


    Naturalmente le ultime due vengono lette dal dialogo di input.
     
    Top
    .
  12.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    Mi sono definito le variabili necessarie a contenere le coordinate di tutti i punti caratteristici delle superfici e del terreno:

    CODICE
    Dim PuntoA As TipoPunto
    Dim PuntoA1 As TipoPunto
    Dim PuntoB As TipoPunto
    Dim PuntoC As TipoPunto
    Dim PuntoD As TipoPunto
    Dim PuntoD1 As TipoPunto
    Dim PuntoE As TipoPunto
    Dim PuntoF As TipoPunto
    Dim PuntoF1 As TipoPunto
    Dim PuntoG As TipoPunto

    Dim Punto1 As TipoPunto
    Dim Punto2 As TipoPunto
    Dim Punto3 As TipoPunto
    Dim Punto4 As TipoPunto
    Dim Punto5 As TipoPunto
    Dim Punto6 As TipoPunto


    nelle figure che seguono ho indicato i punti in questione.

    puntiprofilo

    puntisup

    I punti A1, D1 ed F1 mi servono per poter usare le funzioni di intersezione tra due rette definite ciascuna attraverso due suoi punti di passaggio.

    I punti E e G hanno un ruolo particolare nelle teorie che prevedono l'inclinazione del pendio, e cioe in Hansen ed in Vesic. Se l'inclinazione del pendio è tale che esso interseca il cuneo passivo, e cioè XG<xE, allora scambio G con E.

    Edited by afazio - 4/2/2013, 17:58
     
    Top
    .
  13.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    I punti A ed F sono fissati attraverso i dati di input:

    CODICE
    PuntoA.x = 0
    PuntoA.y = 0

    PuntoF.x = 0
    PuntoF.y = D


    Mentre il punto dove posizionare il disegno viene acquisito tramite clik del mouse e memorizzato in:

    CODICE
    Polo.x = VarPunto(0)
           Polo.y = VarPunto(1)


    Dove la variabile varpunto è la struttura dati dove il metodo VBA ActiveDocument.Utility.GetPoint deposita le coordinate del punto cliccato.
     
    Top
    .
  14.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    Vediamo adesso i singoli casi:

    Il caso di Terzaghi

    CODICE
    eta = 0
    beta = 0
    Teta0 = fi
    r0 = 0.5 * B / Cos(fi)
    Teta1 = 3 * pi / 4 + fi / 2


    Pongo gli angoli eta e beta pari a zero qualunque sia il dato contenuto nel dialogo di input e quindi mi determino teta0, r0 e teta1. Con questi valori, unitamente al valore letto di Sym ed al valore del numero di superfici caratteristiche da disegnare, posso chiamare in gioco la sub che disegna il ventaglio di Prandtl.

    Call Spirale(Polo.x, Polo.y, Teta0, r0, Teta1, fi, nSpirali, sYm, -B / 2)

    Calcolo le coordinate dei punti della superficie di rottura ( A ed F li ho gia calcolati una volta per tutte)

    CODICE
    PuntoB.x = -B
                   PuntoB.y = 0
                   
                   PuntoC.x = -r0 * Cos(Teta0)
                   PuntoC.y = -r0 * Sin(Teta0)
                   
                   PuntoD.x = -r0 * Exp((Teta1 - Teta0) * Tan(fi)) * Cos(Teta1)
                   PuntoD.y = -r0 * Exp((Teta1 - Teta0) * Tan(fi)) * Sin(Teta1)
                   
                   PuntoE.x = PuntoD.x + Abs(PuntoD.y) / Tan(pi / 4 - fi / 2)
                   PuntoE.y = 0


    conoscendo i punti A D ed E posso chiamare in gioco la funzione Rankine per il disegno del cuneo Passivo.

    Call RankineADE(Polo.x, Polo.y, PuntoA, PuntoD, PuntoE, nSpirali, sYm, -B / 2)

    La regola per la chiamata di questa sub è quella che gli estremi del lato dove convergono entrambe le serie delle linee caratteristiche devono essere inseriti per primo e per ultimo. ADE significa che entrambe le serie delle linee caratteristiche convergono sul lato AE e sono parallele, le prime aal lato AD e le seconde al lato DE.

    Ma avendo anche i punti A B e C possiamo chiamare ancora una volta la stessa sub per il disegno del cuneo attivo. Stavolta però dobbiamo impostare a false la variabile Sym dato che il simmetrico del cuoneo attivo è se stesso, ed impostare ad 1 il numero delle superfici da disegnare: questo per il fatto che il cuneo sotto la fondazione di Terzaghi non è per ipotesi in condizioni limite plastico:

    Call RankineADE(Polo.x, Polo.y, PuntoA, PuntoC, PuntoB, 1, False, -B / 2)

    Non mi resta che calcolare le coordinate del profilo terreno e chiamare la sub che disegna il profilo terreno.

    CODICE
    Lmax = PuntoE.x + B
                   
                   If sYm Then
                       Punto1.x = -B - Lmax
                       Punto1.y = D
                   Else
                       Punto1.x = -1.5 * B
                       Punto1.y = D
                   End If
                   
                   Punto2.x = -B
                   Punto2.y = D
                   
                   Punto3.x = -B
                   Punto3.y = 0
                   
                   Punto4.x = 0
                   Punto4.y = 0
                   
                   Punto5.x = 0
                   Punto5.y = D
                   
                   Punto6.x = Lmax
                   Punto6.y = D


    Notare che volendo limitare il disegno nella parte di sinistra ad un valore pari a 1.5*B nel caso in cui non si vuole il disegno delle superfici simmetriche ho differenziato il calcolo delle coordinate del punto 1.
    Noti i punti chiamo la sub:

    Call TerrenoP(Polo.x, Polo.y, Punto1, Punto2, Punto3, Punto4, Punto5, Punto6)

    Edited by afazio - 4/2/2013, 18:25
     
    Top
    .
  15.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    Il caso di Meyerhof
    Anche in questa teoria non sono previste le inclinazioni della base e dl pendio quindi, come fatto per terzaghi pongo eta e beta entrambi nulli indipendentemente dai valori contenuti nel dialogo di input e mi determino teta0 ed r0.

    CODICE
    eta = 0
                   beta = 0
                   Teta0 = pi / 4 + fi / 2
                   r0 = 0.5 * B / Cos(Teta0)

    Anche in questo caso posso calcolarmi i due punti B e C
    CODICE
    PuntoB.x = -B
                   PuntoB.y = 0
                   PuntoC.x = -r0 * Cos(Teta0)
                   PuntoC.y = -r0 * Sin(Teta0)


    Non posso ancora calcolare teta1 poichè questo dipende dalla posizione della "Free surface". Ma prima occore vedere se l'altezza di scavo è tale da far sviluppare l'intera spirale.
    Calcolo quindi l'ordinata della spirale nel suo punto di anomalia pari a 270°

    CODICE
    ymax = Abs(r0 * Exp((3 * pi / 2 - Teta0) * Tan(fi)) * Sin(3 * pi / 2))


    a questo punto distinguo i due casi: quello in cui lo scavo è maggiore di ymax e quello in cui è minore

    ecco il primo caso
    CODICE
    If ymax < D Then
                       Teta1 = 3 * pi/2
                       
                       Punto1.x = -2 * B
                       Punto1.y = D
                 
                       Punto2.x = -B
                       Punto2.y = D
                   
                       Punto3.x = -B
                       Punto3.y = 0
                   
                       Punto4.x = 0
                       Punto4.y = 0
                   
                       Punto5.x = 0
                       Punto5.y = D
                   
                       Punto6.x = B
                       Punto6.y = D

                       Call TerrenoP(Polo.x, Polo.y, Punto1, Punto2, Punto3, Punto4, Punto5, Punto6)
                       Call Spirale(Polo.x, Polo.y, Teta0, r0, Teta1, fi, nSpirali, sYm, -B / 2)
                       Call RankineADE(Polo.x, Polo.y, PuntoA, PuntoC, PuntoB, nSpirali, False, -B / 2)

    ed ecco il secondo, un po' piu' articolato le cui istruzioni cerco di illustrarle a seguire

    CITAZIONE
    Else
    xmax = Abs(r0 * Exp((pi - Teta0) * Tan(fi)) * Cos(pi))
    beta_0 = Atn(D / xmax)
    eta_0 = k * (pi / 4 - fi / 2)
    Teta1 = pi + beta_0 - eta_0
    wo = Teta1 - fi + pi / 2

    Punto2.x = -B
    Punto2.y = D

    Punto3.x = -B
    Punto3.y = 0

    Punto4.x = 0
    Punto4.y = 0

    Punto5.x = 0
    Punto5.y = D

    Punto6.x = B
    Punto6.y = D

    PuntoD.x = -r0 * Exp((Teta1 - Teta0) * Tan(fi)) * Cos(Teta1)
    PuntoD.y = -r0 * Exp((Teta1 - Teta0) * Tan(fi)) * Sin(Teta1)
    ' ricorrere all'intersezione per trovare il punto E
    PuntoD1.x = PuntoD.x + Cos(wo)
    PuntoD1.y = PuntoD.y + Sin(wo)
    PuntoF1.x = PuntoF.x + 1
    PuntoF1.y = PuntoF.y

    If Intersez2Rette4P(PuntoD, PuntoD1, PuntoF, PuntoF1, PuntoE) Then
    Lmax = PuntoE.x + B

    If sYm Then
    Punto1.x = -Lmax - B
    Punto1.y = D
    Else
    Punto1.x = -2 * B
    Punto1.y = D
    End If
    Punto2.x = -B
    Punto2.y = D

    Punto3.x = -B
    Punto3.y = 0

    Punto4.x = 0
    Punto4.y = 0

    Punto5.x = 0
    Punto5.y = D

    Punto6.x = Lmax + B
    Punto6.y = D
    Call TerrenoP(Polo.x, Polo.y, Punto1, Punto2, Punto3, Punto4, Punto5, Punto6)
    Call Spirale(Polo.x, Polo.y, Teta0, r0, Teta1, fi, nSpirali, sYm, -B / 2)
    Call RankineADE(Polo.x, Polo.y, PuntoA, PuntoD, PuntoE, nSpirali, sYm, -B / 2)
    Call RankineADE(Polo.x, Polo.y, PuntoA, PuntoC, PuntoB, nSpirali, False, -B / 2)
    End If
    End If

    con l'istruzione
    xmax = Abs(r0 * Exp((pi - Teta0) * Tan(fi)) * Cos(pi))

    calcolo l'ascissa del punto di intersezione della spirale con il piano di fondazione, quindi la proietto sul piano di campagna e mi ricavo l'angolo beta0 che ho definito come l'angolo "conveniente".

    xmax = Abs(r0 * Exp((pi - Teta0) * Tan(fi)) * Cos(pi))
    beta_0 = Atn(D / xmax)


    Da notare che l'angolo beta0 NON individua ancora la "free surface". Dobbiamo sottrarre a questo angolo il valore di eta0 determinato come aliquota dell'angolo 45-fi/2 attraverso il coefficiente k, quindi trovare il punto di fine della spirale, che sarà il nostro punto D, ed il punto di intersezione della tangente a questo punto con il profilo terreno. Quest'ultimo punto sarà il nostro Punto E.

    Posso quindi determinare teta1:

    CODICE
    eta_0 = k * (pi / 4 - fi / 2)
    Teta1 = pi + beta_0 - eta_0
    wo = Teta1 - fi + pi / 2

    l'angolo wo altro non è che la direzione della tangente alla spirale nel suo punto terminale ed è ottenuto ricordando che la normale alla spirale forma col suo raggio angolo costante e pari a fi.

    Abbiamo tutti i dati sufficienti per poter richiamare la sub per il disegno del ventaglio:

    Call Spirale(Polo.x, Polo.y, Teta0, r0, Teta1, fi, nSpirali, sYm, -B / 2)

    I punti A, B e C sono già incamerati, quindi si può richiamare anche la sub per il disegno del cuneo attivo:

    Call RankineADE(Polo.x, Polo.y, PuntoA, PuntoC, PuntoB, nSpirali, False, -B / 2)

    Nota l'anomalia finale, teta1, possiamo anche calcolare il punto D

    CODICE
    PuntoD.x = -r0 * Exp((Teta1 - Teta0) * Tan(fi)) * Cos(Teta1)
                       PuntoD.y = -r0 * Exp((Teta1 - Teta0) * Tan(fi)) * Sin(Teta1)


    Per determinare il punto E, ricorro ad una funzione di intersezione tra due rette ognuna definita attraverso due suoi punti. E qui ecco che tornano utili quei due punti D1 ed F1 che avevo definito tra le variabili.

    Rimane da determinare il punto E.
    CAlcolo le coordinate dei due punti ausiliari F1 e D1:

    PuntoD1.x = PuntoD.x + Cos(wo)
    PuntoD1.y = PuntoD.y + Sin(wo)
    PuntoF1.x = PuntoF.x + 1
    PuntoF1.y = PuntoF.y

    e con questi, insieme ai punti D ed F, ricorro alla funzione che trova il punto di intersezione tra due rette:

    If Intersez2Rette4P(PuntoD, PuntoD1, PuntoF, PuntoF1, PuntoE) Then
    La funzione deposita il punto trovato nella variabile PuntoE.
    Noto il punto E posso fissare il valore della massima estensione del profilo terreno:
    Lmax = PuntoE.x + B
    e con questo determinarmi anche il punto 1

    Avendo determinato tutti i sei punti del profilo terreno possiamo richiamare la sub per il disegno del terreno:

    Call TerrenoP(Polo.x, Polo.y, Punto1, Punto2, Punto3, Punto4, Punto5, Punto6)

    inoltre, avendo determinato anche il punto E richiamo la sub per il disegno del cuneo Passivo:

    Call RankineADE(Polo.x, Polo.y, PuntoA, PuntoD, PuntoE, nSpirali, sYm, -B / 2)

    e con questo si chiude il caso di Meyerhof

    Edited by afazio - 4/2/2013, 22:29
     
    Top
    .
18 replies since 2/2/2013, 16:54   1478 views
  Share  
.