********************************* Uloha A *******************************
V euklidovském prostoru E_3 je dána přímka
(p_1,p_2,p_3) + <(s_1,s_2,s_3)>
a trojúhelník s vrcholy (a_1,a_2,a_3), (b_1,b_2,b_3), (c_1,c_2,c_3).
Souřadnice jsou dány vzhledem ke kartézskému souřadnému systému.
Najděte algoritmus, který rozhodne, zda přímka prochází trojúhelníkem.
Dále by měl algoritmus rozhodnout, zda průsečík je ve směru směrového
vektoru nebo proti jeho směru.
Normálový vektor (n_1, n_2, n_3) k rovině, ve které leží ABC, je
už dopředu spočítán.
-----------------------------------------------------------------
*** Řešení:
Průsečík roviny dané trojúhelníkem ABC a přímky dané parametricky se
najde "standardně" (dosazením parametrického vyjádření přímky do
rovnice roviny). Pak je potřeba najít souřadnice průsečíku vzhledem k
bázi (A-C,B-C,s). Třetí souřadnice (u směrového vektoru přímky) je
samozřejmě nula a není ji nutno počítat. K výpočtu prvních dvou
souřadnic (u,v) stačí vybrat vhodné dvě ze tří rovnic a řešení najít
Cramerovým pravidlem. Průsečík pak leží v trojúhelníku, pokud
0<u<1 AND 0<v<1-u.
*** Podrobněji:
Označme funkci skal(x,y) = x_1 y_1 + x_2 y_2 + x_3 y_3 (skalární součin).
Pro parametr t průsečíku platí, že:
n_1 (p_1 + t s_1) + n_2 (p_2 + t s_2) + n_3 (p_3 + t s_3) = d = skal(a,n)
Číslo d také můžeme mít spočítané dopředu stejně jako normálový vektor.
Je tedy t = (d - skal(n,p)) / skal(n,s).
Je-li skal(n,s) == 0, je přímka rovnoběžná s rovinou a průsečík neexistuje (KONEC)
Je-li t < 0, je průsečík "proti směru praprsku" a tam jej nehledáme (KONEC)
Je-li t == 0, bod P přímo leží v rovine trojúhelníku ABC.
Souřadnice u, v bodu Q = P + t s vzhledem k bázi (A-C, B-C) vyhovují rovnicím
u (a_1 - c_1) + v (b_1 - c_1) = q_1 - c_1
u (a_2 - c_2) + v (b_2 - c_2) = q_2 - c_2
u (a_3 - c_3) + v (b_3 - c_3) = q_3 - c_3
Z těchto tří rovnic stačí vybrat dvě lineárně nezávislé. Označme:
subdet(c,i,j,x,y) = det [ (x_i-c_i), (y_i-c_i),
(x_j-c_j), (y_j-c_j) ].
Zvolme i=1, j=2.
Pokud g = subdet(c,i,j,a,b) == 0, pak i=1, j=3; g = subdet(c,i,j,a,b).
Číslo g je tedy nenulový determinant matice soustavy, ve které je
(implicitně) první rovnice s druhou. V případě lin. závislosti
první a druhé rovnice je g determinant matice soustavy první
rovnice se třetí.
Podle Cramerova pravidla nyní máme:
u = subdet (c,i,j,q,b) / g,
je-li u<=0 nebo u>=1, pak bod Q neleží v trojúhelníku (KONEC).
v = subdet (c,i,j,a,q) / g
je-li v<=0 nebo v>=1-u, pak bod Q neleží v trojúhelníku (KONEC).
jinak: bod Q leží v trojúhelníku ABC (KONEC).