-
.
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.
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. -
.
Per approfondire la questione della superfici di rottura con tratto a spirale, rinvio alla lettura del topic:
Fantasticherie su spirale fantastica. -
.
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)CODICESub 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. -
.
La procedura dovrà disegnare sostanzialmente delle polilinee (rappresentanti le parti a spirale) e delle linee (i raggi), quindi dimensiono le variabili necessarie: CODICEDim 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:CODICEDim 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:CODICEDim 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 divisioniCODICEDt = (t1 - t0)
n_point = 50. -
.
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.. -
.
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. -
.
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:CODICESub 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.. -
.
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: CODICEDim 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 DECODICE' 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). -
.
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. -
.
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). -
.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 polilineaCODICESub 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:CODICEDim 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:CODICEDim 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:CODICEDim 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.. -
.
Mi sono definito le variabili necessarie a contenere le coordinate di tutti i punti caratteristici delle superfici e del terreno: CODICEDim 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.
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. -
.
I punti A ed F sono fissati attraverso i dati di input: CODICEPuntoA.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:CODICEPolo.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.. -
.
Vediamo adesso i singoli casi:
Il caso di TerzaghiCODICEeta = 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)CODICEPuntoB.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.CODICELmax = 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. -
.
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.CODICEeta = 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 CCODICEPuntoB.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°CODICEymax = 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 casoCODICEIf 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 seguireCITAZIONEElse
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:CODICEeta_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 DCODICEPuntoD.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.