Z Wikipedii, wolnej encyklopedii
Trzy możliwe przypadki: 1) Brak przecięcia, 2) Przecięcie w jednym punkcie, 3) Przecięcie w dwóch punktach.
W geometrii analitycznej prosta i sfera mogą mieć część wspólną w dokładnie jednym punkcie, dwóch punktach bądź wcale. Metody rozróżniania tych przypadków i ustalania punktów przecięcia są używane jako algorytm wykonywany wielokrotnie podczas operacji śledzenia promieni .
Obliczanie z użyciem wektorów [ edytuj | edytuj kod ]
W zapisie wektorowym równania wyglądają w następujący sposób:
Równanie sfery :
‖
x
−
c
‖
2
=
r
2
,
{\displaystyle \|\mathbf {x} -\mathbf {c} \|^{2}=r^{2},}
gdzie:
c
{\displaystyle \mathbf {c} }
– środek,
r
{\displaystyle r}
– promień,
x
{\displaystyle \mathbf {x} }
– punkty na sferze.
Równanie prostej zaczynającej się w
o
:
{\displaystyle \mathbf {o} {:}}
x
=
o
+
d
l
,
{\displaystyle \mathbf {x} =\mathbf {o} +d\mathbf {l} ,}
gdzie:
d
{\displaystyle d}
– parametr odległości wzdłuż prostej od punktu początkowego,
l
{\displaystyle \mathbf {l} }
– kierunek prostej (wektor jednostkowy ),
o
{\displaystyle \mathbf {o} }
– punkt początkowy,
x
{\displaystyle \mathbf {x} }
– punkty na prostej.
Szukając punktów wspólnych, należy połączyć ze sobą równania i rozwiązać dla
d
:
{\displaystyle d{:}}
Równania po podstawieniu
‖
o
+
d
l
−
c
‖
2
=
r
2
⇔
(
o
+
d
l
−
c
)
⋅
(
o
+
d
l
−
c
)
=
r
2
.
{\displaystyle \|\mathbf {o} +d\mathbf {l} -\mathbf {c} \|^{2}=r^{2}\Leftrightarrow (\mathbf {o} +d\mathbf {l} -\mathbf {c} )\cdot (\mathbf {o} +d\mathbf {l} -\mathbf {c} )=r^{2}.}
Rozszerzając
d
2
(
l
⋅
l
)
+
2
d
(
l
⋅
(
o
−
c
)
)
+
(
o
−
c
)
⋅
(
o
−
c
)
=
r
2
.
{\displaystyle d^{2}(\mathbf {l} \cdot \mathbf {l} )+2d(\mathbf {l} \cdot (\mathbf {o} -\mathbf {c} ))+(\mathbf {o} -\mathbf {c} )\cdot (\mathbf {o} -\mathbf {c} )=r^{2}.}
Po przestawieniu
d
2
(
l
⋅
l
)
+
2
d
(
l
⋅
(
o
−
c
)
)
+
(
o
−
c
)
⋅
(
o
−
c
)
−
r
2
=
0.
{\displaystyle d^{2}(\mathbf {l} \cdot \mathbf {l} )+2d(\mathbf {l} \cdot (\mathbf {o} -\mathbf {c} ))+(\mathbf {o} -\mathbf {c} )\cdot (\mathbf {o} -\mathbf {c} )-r^{2}=0.}
Otrzymuje się równanie kwadratowe
a
d
2
+
b
d
+
c
=
0
,
{\displaystyle ad^{2}+bd+c=0,}
gdzie:
a
=
l
⋅
l
=
‖
l
‖
2
,
{\displaystyle a=\mathbf {l} \cdot \mathbf {l} =\|\mathbf {l} \|^{2},}
b
=
2
(
l
⋅
(
o
−
c
)
)
,
{\displaystyle b=2(\mathbf {l} \cdot (\mathbf {o} -\mathbf {c} )),}
c
=
(
o
−
c
)
⋅
(
o
−
c
)
−
r
2
=
‖
o
−
c
‖
2
−
r
2
.
{\displaystyle c=(\mathbf {o} -\mathbf {c} )\cdot (\mathbf {o} -\mathbf {c} )-r^{2}=\|\mathbf {o} -\mathbf {c} \|^{2}-r^{2}.}
Upraszczając
d
=
−
2
(
l
⋅
(
o
−
c
)
)
±
(
2
(
l
⋅
(
o
−
c
)
)
)
2
−
4
‖
l
‖
2
(
‖
o
−
c
‖
2
−
r
2
)
2
‖
l
‖
2
{\displaystyle d={\frac {-2(\mathbf {l} \cdot (\mathbf {o} -\mathbf {c} ))\pm {\sqrt {(2\left(\mathbf {l} \cdot (\mathbf {o} -\mathbf {c} ))\right)^{2}-4\|\mathbf {l} \|^{2}(\|\mathbf {o} -\mathbf {c} \|^{2}-r^{2})}}}{2\|\mathbf {l} \|^{2}}}}
l
{\displaystyle \mathbf {l} }
jest wektorem jednostkowym, a
‖
l
‖
2
=
1.
{\displaystyle \|\mathbf {l} \|^{2}=1.}
W związku z tym równanie można uprościć do
d
=
−
(
l
⋅
(
o
−
c
)
)
±
(
l
⋅
(
o
−
c
)
)
2
−
‖
o
−
c
‖
2
+
r
2
.
{\displaystyle d=-(\mathbf {l} \cdot (\mathbf {o} -\mathbf {c} ))\pm {\sqrt {(\mathbf {l} \cdot (\mathbf {o} -\mathbf {c} ))^{2}-\|\mathbf {o} -\mathbf {c} \|^{2}+r^{2}}}.}
Jeśli wartość pod pierwiastkiem
(
(
l
⋅
(
o
−
c
)
)
2
−
‖
o
−
c
‖
2
+
r
2
)
{\displaystyle ((\mathbf {l} \cdot (\mathbf {o} -\mathbf {c} ))^{2}-\|\mathbf {o} -\mathbf {c} \|^{2}+r^{2})}
jest mniejsza niż zero, rozwiązanie nie istnieje i prosta nie przecina sfery (przypadek 1).
Jeśli jest to zero, istnieje jedno rozwiązanie i prosta przecina sferę w jednym punkcie (przypadek 2).
Jeśli jest większa niż zero, istnieją dwa rozwiązania i prosta przecina sferę w dwóch punktach (przypadek 3).
David H. Eberly (2006), 3D game engine design: a practical approach to real-time computer graphics , 2nd edition, Morgan Kaufmann. ISBN 0-12-229063-1 .