Il vettore \({\textbf v}\) parallelo alla retta \(r\) è il vettore direttore della retta, e le sue componenti rispetto alla base del sist. di rif. aff./orton. sono i parametri direttori \({\textbf v = (l,m,n)}\).
La direzione della retta può essere individuata attraverso infiniti vettori paralleli a \({\textbf v}\) differenti per un fattore di proporzionalità non nullo: \(\lambda{\textbf v} \quad con\quad \lambda \in \mathbb{R} - \{0\}\)
Nel caso si disponga delle equazioni parametriche della retta, la direzione è data dalle componenti di \({\textbf v}\) nel sistema:
\(x = x_0 + t{\textbf l}\)
\(y = y_0 + t{\textbf m}\)
\(z = z_0 + t{\textbf n}\)
Nel caso si disponga della forma cartesiana della retta si può passare a quelle parametriche e fare quanto sopra. In alternativa si può, lavorando in un sist. rif. ortonormale, fare il prodotto vettoriale tra i direttori delle due rette:
\(\pi = {\textbf a}x+{\textbf b}y+{\textbf c}z+d=0\)
\(\pi' = {\textbf a'}x+{\textbf ld b'}y+{\textbf c'}z+d'=0\)
quindi, indicandoli rispettivamente con \({\textbf n}\) ed \({\textbf n'}\):
\({\textbf v}_r = {\textbf n} \times {\textbf n'}\)
La direzione è ortogonale ad entrambi i vettori.
Avendo due punti \(P_0\) e \(P_1\) si può calcolare il vettore direttore facendo: \(\overrightarrow{P_0P_1}\) ossia \(P_1-P_0 = (x_1-x_0, y_1-y_0, z_1-z_0)\) o viceversa (cambia orientamento/verso ma non direzione).
import sympy as sp
from typing import List
def direzioneRetta(equazioni_parametriche: List[sp.Expr]=None, equazioni_cartesiane: List[sp.Expr]=None, P_0:sp.Matrix=None, P_1:sp.Matrix=None) -> sp.Matrix:
if equazioni_parametriche is not None:
t = sp.symbols("t")
x = -sp.Poly(equazioni_parametriche[0]).coeff_monomial(t) if t in equazioni_parametriche[0].free_symbols else 0
y = -sp.Poly(equazioni_parametriche[1]).coeff_monomial(t) if t in equazioni_parametriche[1].free_symbols else 0
z = -sp.Poly(equazioni_parametriche[2]).coeff_monomial(t) if t in equazioni_parametriche[2].free_symbols else 0
return sp.Matrix([[x,y,z]])
elif equazioni_cartesiane is not None:
x,y,z = sp.symbols("x y z")
a = sp.Poly(equazioni_cartesiane[0]).coeff_monomial(x) if x in equazioni_cartesiane[0].free_symbols else 0
b = sp.Poly(equazioni_cartesiane[0]).coeff_monomial(y) if y in equazioni_cartesiane[0].free_symbols else 0
c = sp.Poly(equazioni_cartesiane[0]).coeff_monomial(z) if z in equazioni_cartesiane[0].free_symbols else 0
a1 = sp.Poly(equazioni_cartesiane[1]).coeff_monomial(x) if x in equazioni_cartesiane[1].free_symbols else 0
b1 = sp.Poly(equazioni_cartesiane[1]).coeff_monomial(y) if y in equazioni_cartesiane[1].free_symbols else 0
c1 = sp.Poly(equazioni_cartesiane[1]).coeff_monomial(z) if z in equazioni_cartesiane[1].free_symbols else 0
return sp.Matrix([[a,b,c]]).cross(sp.Matrix([[a1,b1,c1]]))
elif P_0 is not None and P_1 is not None:
return P_1 - P_0
t,x,y,z = sp.symbols("t x y z")
fp = [
x - 1 + 3*t,
y + sp.Rational(1/2)*t,
z + 4
]
direzioneRetta(equazioni_parametriche=fp)
\(\displaystyle \left[\begin{matrix}-3 & - \frac{1}{2} & 0\end{matrix}\right]\)
fc = [
x - z,
3*x + y + 2*z
]
direzioneRetta(equazioni_cartesiane=fc)
\(\displaystyle \left[\begin{matrix}1 & -5 & 1\end{matrix}\right]\)
P_0 = sp.Matrix([[1,2,-1]])
P_1 = sp.Matrix([[2,-1,3]])
direzioneRetta(P_0=P_0, P_1=P_1)
\(\displaystyle \left[\begin{matrix}1 & -3 & 4\end{matrix}\right]\)