Coseni direttori e angolo tra due rette nello spazio

Angolo tra vettori e retta orientata

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}||}\)

Angolo tra rette nello spazio

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.

Calcolo dell'angolo tra rette orientate

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}}\)

  • Se \(ll'+mm'+nn'=0\) allora \(cos(\hat{rs})=0\) e quindi le rette sono ortogonali.
  • Se \(cos(\hat{rs})=\pm1\) le rette sono parallele (distinte o coincidenti).

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}))\)

Formula per gli angoli tra rette non orientate

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\)

Coseni direttori di una retta nello spazio

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\).

Funzione riassumibile

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)]

Esempio rette orientate secondo x crescenti

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}\)

Esempio rette non orientate

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]

Riferimenti

  • https://www.youmath.it/lezioni/algebra-lineare/geometria-dello-spazio/4067-coseni-direttori-e-angoli-tra-rette-dello-spazio.html