Fissato sist. rif. cart. ortonormale, siano \({\textbf u},{\textbf v}\) due vettori non nulli, l'angolo tra i vettori \({\textbf u},{\textbf v}\) è l'angolo convesso formato da un rappresentante di \({\textbf u}\) e uno di \({\textbf v}\) aventi lo stesso punto di applicazione. Si indica l'angolo con \(\theta \in [0, \pi]\), con \(||\quad||\) la norma e con \(\cdot\) il prodotto scalare euclideo tra vettori, sussiste:
\(cos(\theta)=\frac{{\textbf u}\cdot{\textbf v}}{||{\textbf u}||||{\textbf v}||}\)
Considerando due rette \(r\) e \(s\) fissato un sist. di rif. cartesiano ortonormale, sono angoli tra le rette \(r,s\) gli angoli convessi formati dai vettori direzione delle due rette, indicati con \((\hat{rs})_1,(\hat{rs})_2\), purchè coerenti con l'orientazione delle due rette. L'immagine in riferimento chiarisce come possono formarsi due angoli convessi.
Dati i vettori direzione di due rette \(r,s\) (\({\textbf v_r}=l{\textbf i}+m{\textbf j}+n{\textbf k}\) e \({\textbf v_s}=l'{\textbf i}+m'{\textbf j}+n'{\textbf k}\)) orientate nello spazio, l'angolo \(\hat{rs}\) che esse formano è dato da:
\(cos(\hat{rs})=\frac{ {\textbf v_r} \cdot {\textbf v_s} }{||{\textbf v_r}|| ||{\textbf v_s}||} = \frac{ll'+mm'+nn'}{\sqrt{l^2+m^2+n^2}\sqrt{l'^2+m'^2+n'^2}}\)
Affinchè le rette siano orientate in modo corrisposto, devono essere concordi rispetto alle \(x\) (o \(y,z\) a piacimento) crescenti/decrescenti. Affinché lo siano, il prodotto scalare euclideo tra ciascun vettore direttore e il versore \({\textbf i}=(1,0,0)\) deve essere positivo. Se uno dei vettori direttori non lo è, va invertito. Ed esempio \(v_s=(-1,2,1)\) va reso \(-v_s =(1,-2,-1)\).
Una volta trovato \(cos(\hat{rs})\) si utilizza l'equazione goniometrica elementare (arcos
) per estrarre \(\hat{rs}\):
\(\hat{rs} = arccos(cos(\hat{rs}))\)
Qualora non vi fossero informazioni relativamente all'orientazione delle rette di cui si richiede di calcolare l'angolo, si procede calcolando entrambi gli angoli:
\(cos((\hat{rs})_{1,2})= \pm \frac{ {\textbf v_r} \cdot {\textbf v_s} }{||{\textbf v_r}|| ||{\textbf v_s}||} = \pm \frac{ll'+mm'+nn'}{\sqrt{l^2+m^2+n^2}\sqrt{l'^2+m'^2+n'^2}}\)
Alternativamente, si calcola prima un angolo e si ricava l'altro tramite la seguente ovvia formula:
\((\hat{rs})_2 = \pi - (\hat{rs})_1\)
In un sist. rif. cartesiano ortonormale i coseni direttori di una retta orientata \(r\) sono i coseni degli angoli \(\widehat{xr},\widehat{yr},\widehat{zr}\) che la retta forma con i tre assi coordinati \(x,y,z\). Indicando con \({\textbf v_r}=(l,m,n)\) il vetore direttore:
\(cos(\widehat{xr})=\frac{{\textbf v_r} \cdot {\textbf i}}{||{\textbf ld v_r}|| \quad ||{\textbf i}||}\)
\(cos(\widehat{yr})=\frac{{\textbf v_r} \cdot {\textbf j}}{||{\textbf v_r}|| \quad ||{\textbf j}||}\)
\(cos(\widehat{zr})=\frac{{\textbf v_r} \cdot {\textbf k}}{||{\textbf v_r}|| \quad ||{\textbf k}||}\)
dove, come normalmente accade, se \({\textbf i}=(1,0,0),{\textbf j}=(0,1,0),{\textbf k}=(0,0,1)\) allora:
\(cos(\widehat{xr})=\frac{l}{\sqrt{t^2+m^2-n^2}}\) ecc... Risulta che i coseni direttori eguagliano le componenti del corrispondente versore direttore. Qualora la retta non sia orientata si aggiunge sempre \(\pm\).
import sympy as sp
from typing import List
from ipynb.fs.full.retta_direzione_nello_spazio import direzioneRetta
def angoloTraRette(equazioni_parametriche_s: List[sp.Expr]=None, equazioni_cartesiane_s: List[sp.Expr]=None,
equazioni_parametriche_r: List[sp.Expr]=None, equazioni_cartesiane_r: List[sp.Expr]=None,
orientazione: int = None,
) -> float:
"""
orientazione: 1 -> x, 2 -> y, 3 -> z. Il segno è il verso
"""
vs = direzioneRetta(equazioni_parametriche=equazioni_parametriche_s, equazioni_cartesiane=equazioni_cartesiane_s)
vr = direzioneRetta(equazioni_parametriche=equazioni_parametriche_r, equazioni_cartesiane=equazioni_cartesiane_r)
if orientazione is not None:
if orientazione < 0:
vs = -vs if vs[abs(orientazione)-1] > 0 else vs
vr = -vr if vr[abs(orientazione)-1] > 0 else vr
elif orientazione > 0:
vs = -vs if vs[abs(orientazione)-1] < 0 else vs
vr = -vr if vr[abs(orientazione)-1] < 0 else vr
num = vr.dot(vs)
denom = sp.sqrt(vr[0,0]**2 + vr[0,1]**2 + vr[0,2]**2) * sp.sqrt(vs[0,0]**2 + vs[0,1]**2 + vs[0,2]**2)
cos_rs = num/denom
if orientazione is not None:
return sp.acos(cos_rs)
else:
return [sp.acos(cos_rs), sp.acos(-cos_rs)]
x,y,z,t = sp.symbols("x y z t")
r = [
x - t,
y + 1 - t,
z - 2*t
]
s = [
2*x + y - 4,
x + y -z -2
]
angoloTraRette(equazioni_parametriche_r=r, equazioni_cartesiane_s=s, orientazione=1)
\(\displaystyle \frac{2 \pi}{3}\)
r = [
x - t,
y + sp.Rational("2/3") + t,
z + sp.Rational("1/3")
]
s = [
x - t,
y + 3 + 2*t,
z + 3 - t
]
angoloTraRette(equazioni_parametriche_r=r, equazioni_parametriche_s=s)
[pi/6, 5*pi/6]