Le due rette \(r\) e \(s\) sono:
Fissato sist. riferimento ortonormale, per studiare la posizione di due rette \(r\) e \(s\):
\(P_r(x_r,y_r,z_r) \in r\)
\(P_s(x_s,y_s,z_s) \in s\)
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\).
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"
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]\)