Risoluzione di un triangolo rettangolo
Quando andavo a scuola, ormai ben 35 anni fa circa, una delle materie che mi piacevano di più era la matematica. Poi quando spiegarono la trigonometria, mi si aprì un mondo e oggi matematica a trigonometria sono delle mie passioni.
Cercando delle informazioni per un altro articolo, mi sono trovato su alcuni siti che parlavano dell’acronimo SohCahToa. Non l’avevo mai sentito e così ho indagato e da questo nasce il seguente articolo.
Iniziamo av edere cosa è e cosa significa questo acronimo. dividiamolo in 3 acronimi da tre lettere.
Otteniamo: Soh, Cah e Toa. Le prime lettere di ognuna delle tre parole indicano seno, coseno e tangente.
La o indica il lato opposto all’angolo Teta, la a indica l’adiacente all’angolo Teta e la h indica l’ipotenusa.
Parliamo ovviamente di un triangolo rettangolo e questi acronimi servono a trovare i dati mancanti del triangolo, conoscendone 2. Soh significa Sin=Opposto diviso ipotenusa, Cah significa Cos=adiacente diviso ipotenusa e Toa significa Tangente =Opposto diviso adiacente.
La figura di seguito mostra la situazione:

Creiamo quindi un piccolo programmino per il calcolo dei dati mancanti del triangolo rettangolo, conoscendone solo 2. Apriamo Visual Studio e creiamo un progetto Windows Forms in Vb.NET.
Ci mettiamo 5 label, 4 textbox e 1 pulsante. Ho messo poi nel form le immagini per aiutarci.
Questa è la Form:

La prima cosa da fare è verificare che siano riempiti 2 campi:
If txtIpotenusa.Text = "" Then vuoto = vuoto + 1
If txtCateto1.Text = "" Then vuoto = vuoto + 1
If txtCateto2.Text = "" Then vuoto = vuoto + 1
If txtAngoloTeta.Text = "" Then vuoto = vuoto + 1
If vuoto > 2 Then MsgBox("Attenzione, solo 2 campi possono essere vuoti") : Exit Sub
La seconda cosa da fare è verificare che i campi riempiti siano numerici:
If txtIpotenusa.Text <> "" And IsNumeric(txtIpotenusa.Text) = False Then MsgBox("Attenzione, l'ipotenusa deve essere un numero") : Exit Sub
If txtCateto1.Text <> "" And IsNumeric(txtCateto1.Text) = False Then MsgBox("Attenzione, cateto1 deve essere un numero") : Exit Sub
If txtCateto2.Text <> "" And IsNumeric(txtCateto2.Text) = False Then MsgBox("Attenzione, cateto2 deve essere un numero") : Exit Sub
If txtAngoloTeta.Text <> "" And IsNumeric(txtAngoloTeta.Text) = False Then MsgBox("Attenzione, Teta deve essere un numero") : Exit Sub
Vediamo adesso caso per caso cosa c’è e quindi cosa manca:
If txtIpotenusa.Text = "" And (txtCateto1.Text <> "" And txtCateto2.Text <> "") Then manca = "I"
If txtCateto1.Text = "" And (txtIpotenusa.Text <> "" And txtCateto2.Text <> "") Then manca = "O"
If txtCateto2.Text = "" And (txtCateto1.Text <> "" And txtIpotenusa.Text <> "") Then manca = "A"
If txtAngoloTeta.Text <> "" And txtCateto1.Text <> "" Then manca = "T1"
If txtAngoloTeta.Text <> "" And txtCateto2.Text <> "" Then manca = "T2"
If txtAngoloTeta.Text <> "" And txtIpotenusa.Text <> "" Then manca = "T3"
E vediamo infine caso per caso quale formula delle tr3 richiamare, in base a quello che conosciamo.
Mettiamo assieme il tutto e questo è il codice finale:
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim manca As String = ""
Dim Opposto As Double
Dim Adiacente As Double
Dim Ipotenusa As Double
Dim SinTeta As Double
Dim CosTeta As Double
Dim TanTeta As Double
Dim Teta As Double
Dim Teta1 As Double
Dim Teta2 As Double
Dim Teta3 As Double
Dim vuoto = 0
If txtIpotenusa.Text = "" Then vuoto = vuoto + 1
If txtCateto1.Text = "" Then vuoto = vuoto + 1
If txtCateto2.Text = "" Then vuoto = vuoto + 1
If txtAngoloTeta.Text = "" Then vuoto = vuoto + 1
If vuoto > 2 Then MsgBox("Attenzione, solo 2 campi possono essere vuoti") : Exit Sub
If txtIpotenusa.Text <> "" And IsNumeric(txtIpotenusa.Text) = False Then MsgBox("Attenzione, l'ipotenusa deve essere un numero") : Exit Sub
If txtCateto1.Text <> "" And IsNumeric(txtCateto1.Text) = False Then MsgBox("Attenzione, cateto1 deve essere un numero") : Exit Sub
If txtCateto2.Text <> "" And IsNumeric(txtCateto2.Text) = False Then MsgBox("Attenzione, cateto2 deve essere un numero") : Exit Sub
If txtAngoloTeta.Text <> "" And IsNumeric(txtAngoloTeta.Text) = False Then MsgBox("Attenzione, Teta deve essere un numero") : Exit Sub
If txtIpotenusa.Text = "" And (txtCateto1.Text <> "" And txtCateto2.Text <> "") Then manca = "I"
If txtCateto1.Text = "" And (txtIpotenusa.Text <> "" And txtCateto2.Text <> "") Then manca = "O"
If txtCateto2.Text = "" And (txtCateto1.Text <> "" And txtIpotenusa.Text <> "") Then manca = "A"
If txtAngoloTeta.Text <> "" And txtCateto1.Text <> "" Then manca = "T1"
If txtAngoloTeta.Text <> "" And txtCateto2.Text <> "" Then manca = "T2"
If txtAngoloTeta.Text <> "" And txtIpotenusa.Text <> "" Then manca = "T3"
If txtIpotenusa.Text <> "" Then Ipotenusa = CDbl(txtIpotenusa.Text)
If txtCateto1.Text <> "" Then Opposto = CDbl(txtCateto1.Text)
If txtCateto2.Text <> "" Then Adiacente = CDbl(txtCateto2.Text)
If txtAngoloTeta.Text <> "" Then Teta = CDbl(txtAngoloTeta.Text)
'CALCOLA ELEMENTI MANCANTI
If manca <> "T1" And manca <> "T2" And manca <> "T3" And manca <> "T4" Then
If manca = "I" Then
Ipotenusa = Math.Sqrt(Opposto ^ 2 + Adiacente ^ 2)
txtIpotenusa.Text = Ipotenusa
End If
If manca = "O" Then
Opposto = Math.Sqrt(Ipotenusa ^ 2 - Adiacente ^ 2)
txtCateto1.Text = Opposto
End If
If manca = "A" Then
Adiacente = Math.Sqrt(Ipotenusa ^ 2 - Opposto ^ 2)
txtCateto2.Text = Adiacente
End If
SinTeta = Opposto / Ipotenusa
CosTeta = Adiacente / Ipotenusa
TanTeta = Opposto / Adiacente
Teta1 = Math.Asin(SinTeta) * 180 / Math.PI
Teta2 = Math.Asin(SinTeta) * 180 / Math.PI
Teta3 = Math.Asin(SinTeta) * 180 / Math.PI
txtAngoloTeta.Text = Teta1 & " " & Teta2 & " " & Teta3
Else
SinTeta = Math.Sin(Teta * Math.PI / 180)
CosTeta = Math.Cos(Teta * Math.PI / 180)
TanTeta = Math.Tan(Teta * Math.PI / 180)
If manca = "T1" Then
'If txtAngoloTeta.Text <> "" And txtCateto1.Text <> "" Then manca = "T1"
'CALCOLARE IPOTENUSA E ADIACENTE
Ipotenusa = Opposto / SinTeta
Adiacente = Opposto / TanTeta
txtIpotenusa.Text = Ipotenusa
txtCateto2.Text = Adiacente
ElseIf manca = "T2" Then
'If txtAngoloTeta.Text <> "" And txtCateto2.Text <> "" Then manca = "T2"
'CALCOLARE IPOTENUSA E OPPOSTO
Ipotenusa = Adiacente / CosTeta
Opposto = TanTeta * Adiacente
txtIpotenusa.Text = Ipotenusa
txtCateto1.Text = Opposto
Else
'If txtAngoloTeta.Text <> "" And txtIpotenusa.Text <> "" Then manca = "T3"
'CALCOLARE ADIACENTE E OPPOSTO
Adiacente = CosTeta * Ipotenusa
Opposto = TanTeta * Adiacente
txtCateto2.Text = Adiacente
txtCateto1.Text = Opposto
End If
End If
End Sub
End Class
Notate che ho scritto 3 volte nella casella dell’angolo, il suo valore, perchè l’arco il cui sento, l’arco il cui coseno e l’arco la cui tangente devono dare 3 valori esattamente uguali, quindi li ho scritto per conferma dell’esattezza dei nostri calcoli. Ovviamente voi potete cambiare e mettere il valore una sola volt, o su tre Textbox diverse.
Vi metto infine qualche esempio da provare:




Ovviamente, ma non l’ho scritto nel codice, si può calcolare l’angolo fra l’ipotenusa e il lato opposto, facendo 90- l’angolo teta, poichè la somma degli angoli è 180 gradi ed essendo triangolo rettangolo, il valore dell’angolo fra i due cateti è sempre 90.
Rispondi