Posizioni tra due rette nello spazio

Le due rette \(r\) e \(s\) sono:

  • complanari: esite un piano che può contenerle
    • parallele distinte: nessun punto in comune
    • parallele coincidenti: coincidono punto per punto
    • incidenti: un solo punto in comune
  • sghembe: non esiste alcun piano che le contiene

Studio della posizione

Fissato sist. riferimento ortonormale, per studiare la posizione di due rette \(r\) e \(s\):

  • determinare la direzione delle due rette (vedi sezione "12-Retta-Direzione nello spazio")
  • individuare le coordinate di due punti qualsiasi delle rispettive rette (vedi paragrafo successivo come)

\(P_r(x_r,y_r,z_r) \in r\)

\(P_s(x_s,y_s,z_s) \in s\)

  • calcolare il determinante della matrice i cui elementi della prima riga sono dati dalla differenza delle coordinate dei due punti e le successive righe sono le componenti dei vettori direttori trovati: \(A = \begin{bmatrix}x_r-x_s&y_r-y_s&z_r-z_s\\l&m&n\\l'&m'&n'\end{bmatrix}\)
  • se il determinante è diverso da 0 le rette sono sghembe (infatti i vettori \(P_s-P_r,v_r,v_s\) sono linearmente indipendenti)
  • se il determinante è pari a 0 le rette sono complanari (poiché i vettori \(P_s-P_r,v_r,v_s\) sono linearmente dipendenti tra loro) quindi si prosegue nello studio
    • si individua la matrice \(B\) le cui righe sono i coefficienti direttori delle rette: \(B = \begin{bmatrix}l&m&n\\l'&m'&n'\end{bmatrix}\)
    • se \(rk(B)=2\) le rette sono incidenti e si possono calcolare le coordinate del punto di intersezione
      • essendo che le due rette si sanno essere incidenti, siamo certi che un sistema lineare con le quattro equazioni cartesiane delle due rette ha un'unica soluzione. Risolvendolo si ottengono le coordinate del punto di intersezione (se una o entrambe le rette sono in forma parametrica, effettuare la conversione come indicato in "10-Retta-Eq.Parametriche->Eq.Cartesiane").
    • se \(rk(B)=1\) le rette sono parallele
      • se \(P_r \in r\) appartiene a \(s\) (o viceversa \(P_s \in s\) appartiene a \(r\)) sono parallele coincidenti, altrimenti sono parallele distinte.

Individuare un punto qualsiasi della retta

Dalle equazioni cartesiane basta risolvere il sistema ponendo un'incognita uguale ad un valore qualsiasi (tipo 1) e risolvere le altre due incognite andando mano a mano a sostituire i valori. Dalle equazioni parametriche basta risolvere le incognite dando un valore qualsiasi (tipo 0) a \(t\).

Funzione riassumibile

import sympy as sp
from typing import List
from ipynb.fs.full.retta_direzione_nello_spazio import direzioneRetta
from ipynb.fs.full.retta_equazioni_parametriche_equazioni_cartesiane import equazioniParametricheRettaToEquazioniCartesiane

def puntoQualsiasiRetta(valore_random: int, simbolo: sp.Symbol, equazioni_cartesiane: List[sp.Matrix] = None, equazioni_parametriche: List[sp.Matrix] = None) -> sp.Matrix:
    result = dict()

    if equazioni_cartesiane is not None:
        a = equazioni_cartesiane[0].subs(simbolo, valore_random)
        b = equazioni_cartesiane[1].subs(simbolo, valore_random)
        result = sp.solve([a,b])
        xval = result.get(sp.Symbol("x")) if simbolo != sp.Symbol("x") else valore_random
        yval = result.get(sp.Symbol("y")) if simbolo != sp.Symbol("y") else valore_random
        zval = result.get(sp.Symbol("z")) if simbolo != sp.Symbol("z") else valore_random
        return sp.Matrix([[xval, yval, zval]])
    elif equazioni_parametriche is not None:
        a = equazioni_parametriche[0].subs(simbolo, valore_random)
        b = equazioni_parametriche[1].subs(simbolo, valore_random)
        c = equazioni_parametriche[2].subs(simbolo, valore_random)
        result = sp.solve([a,b,c])

        return sp.Matrix([[
            result.get(sp.Symbol("x")),
            result.get(sp.Symbol("y")),
            result.get(sp.Symbol("z"))
        ]])
    else:
        raise Exception("Fornire equazioni cartesiane o parametriche")

def posizioneTraRette(r_parametriche: List[sp.Matrix] = None, s_parametriche: List[sp.Matrix] = None, r_cartesiane: List[sp.Matrix] = None, s_cartesiane: List[sp.Matrix] = None) -> sp.Matrix:
    """
        Restituisce:
        - Sghembe (str)
        - Parallele (str)
        - Punto di intersezione (sp.Matrix)
    """

    direzione_r = direzioneRetta(equazioni_parametriche=r_parametriche) if r_parametriche is not None else direzioneRetta(equazioni_cartesiane=r_cartesiane)
    direzione_s = direzioneRetta(equazioni_parametriche=s_parametriche) if s_parametriche is not None else direzioneRetta(equazioni_cartesiane=s_cartesiane)

    p_r = puntoQualsiasiRetta(1, sp.Symbol("z"), equazioni_cartesiane=r_cartesiane) if r_cartesiane is not None else puntoQualsiasiRetta(0, sp.Symbol("t"), equazioni_parametriche=r_parametriche)
    p_s = puntoQualsiasiRetta(1, sp.Symbol("z"), equazioni_cartesiane=s_cartesiane) if s_cartesiane is not None else puntoQualsiasiRetta(0, sp.Symbol("t"), equazioni_parametriche=s_parametriche)

    A = sp.Matrix([
        [p_r[0,0] - p_s[0,0], p_r[0,1] - p_s[0,1], p_r[0,2] - p_s[0,2]],
        [direzione_r[0,0], direzione_r[0,1], direzione_r[0,2]],
        [direzione_s[0,0], direzione_s[0,1], direzione_s[0,2]]
    ])

    if int(A.det()) is not 0:
        return "Sghembe"
    else:
        B = sp.Matrix([
            [direzione_r[0,0], direzione_r[0,1], direzione_r[0,2]],
            [direzione_s[0,0], direzione_s[0,1], direzione_s[0,2]]
        ])

        if B.rank() is 2:
            if r_cartesiane is None:
                r_cartesiane = equazioniParametricheRettaToEquazioniCartesiane(r_parametriche)
            if s_cartesiane is None:
                s_cartesiane = equazioniParametricheRettaToEquazioniCartesiane(s_parametriche)

            sistema = r_cartesiane + s_cartesiane

            result = sp.solve(sistema)

            return sp.Matrix([[
                result.get(sp.Symbol("x")),
                result.get(sp.Symbol("y")),
                result.get(sp.Symbol("z"))
            ]])
        elif B.rank() is 1:
            return "Parallele"

Esempi

x,y,z,t = sp.symbols("x y z t")

r = [
    3*x - z - 20,
    y - 4
]

s = [
    x - 1 - 3*t,
    y - 2*t,
    z - 3 + t
]

posizioneTraRette(r_cartesiane=r, s_parametriche=s)

\(\displaystyle \left[\begin{matrix}7 & 4 & 1\end{matrix}\right]\)

Riferimenti

  • https://www.youmath.it/lezioni/algebra-lineare/geometria-dello-spazio/2643-posizione-tra-rette-dello-spazio.html