Пересечение линии и сферы - Line–sphere intersection
Три возможных пересечения линии и сферы:
1. Нет пересечения.
2. Точка пересечения.
3. Пересечение двух точек.
В аналитическая геометрия, а линия и сфера может пересекаться тремя способами:
- Никакого пересечения
- Пересечение ровно в одной точке
- Пересечение в двух точках.
Методы различения этих случаев и определения координаты точки в последних случаях полезны в ряде обстоятельств. Например, это обычный расчет, выполняемый во время трассировка лучей [1].
Расчет с использованием векторов в 3D
В векторные обозначения, уравнения имеют следующий вид:
Уравнение для сфера
![leftVert {mathbf {x}} - {mathbf {c}} ightVert ^ {2} = r ^ {2}](https://wikimedia.org/api/rest_v1/media/math/render/svg/7c2b52740611bd628969539b637813a86417a501)
- Центральная точка
- радиус
- точки на сфере
Уравнение для линии, начинающейся в ![mathbf {o}](https://wikimedia.org/api/rest_v1/media/math/render/svg/6cd153c5c9db162ee93e4d2aabba61d032da3af9)
![{displaystyle mathbf {x} = mathbf {o} + dmathbf {u}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/f5febe0830c36313b1b93a0cfbb46db746d68b0c)
- расстояние по линии от начальной точки
- направление линии (a единичный вектор )
- происхождение линии
- точки на линии
Поиск точек на линии и на сфере означает объединение уравнений и решение
с участием скалярное произведение векторов:
- Комбинированные уравнения
![{displaystyle leftVert mathbf {o} + dmathbf {u} -mathbf {c} ightVert ^ {2} = r ^ {2} Leftrightarrow (mathbf {o} + dmathbf {u} -mathbf {c}) cdot (mathbf {o } + dmathbf {u} -mathbf {c}) = r ^ {2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/b8770ffcdc0f940ccb6b4803f7b9467f5996edee)
- Расширенный
![{displaystyle d ^ {2} (mathbf {u} cdot mathbf {u}) + 2d (mathbf {u} cdot (mathbf {o} -mathbf {c})) + (mathbf {o} -mathbf {c}) cdot (mathbf {o} -mathbf {c}) = r ^ {2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/44720933e7e5d8a34274ed21b8115aca28c76833)
- Переставил
![{displaystyle d ^ {2} (mathbf {u} cdot mathbf {u}) + 2d (mathbf {u} cdot (mathbf {o} -mathbf {c})) + (mathbf {o} -mathbf {c}) cdot (mathbf {o} -mathbf {c}) -r ^ {2} = 0}](https://wikimedia.org/api/rest_v1/media/math/render/svg/d9417181356533a5b052eea393576e97867543d4)
- Форма квадратичная формула теперь можно наблюдать. (Это квадратное уравнение является примером уравнения Иоахимсталя.[2])
![ad ^ {2} + bd + c = 0](https://wikimedia.org/api/rest_v1/media/math/render/svg/a503fe82745981bcaf57b7ba75004899aa14cafb)
- куда
![{displaystyle a = mathbf {u} cdot mathbf {u} = leftVert mathbf {u} ightVert ^ {2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/2d7c7075b5611c2053f3e79a88c25130be04e488)
![{displaystyle b = 2 (mathbf {u} cdot (mathbf {o} -mathbf {c}))}](https://wikimedia.org/api/rest_v1/media/math/render/svg/646619abdbc267587f6214956cb738192178655f)
![c = ({mathbf {o}} - {mathbf {c}}) cdot ({mathbf {o}} - {mathbf {c}}) - r ^ {2} = leftVert {mathbf {o}} - {mathbf {c}} ightVert ^ {2} -r ^ {2}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a6968796208c141c0cd1b1a4e23bc3e8e7b00896)
- Упрощенный
![{displaystyle d = {frac {-2 (mathbf {u} cdot (mathbf {o} -mathbf {c})) pm {sqrt {(2 (mathbf {u} cdot (mathbf {o} -mathbf {c})) )) ^ {2} -4leftVert mathbf {u} ightVert ^ {2} (leftVert mathbf {o} -mathbf {c} ightVert ^ {2} -r ^ {2})}}} {2leftVert mathbf {u} ightVert ^ {2}}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/09ecb9c65ca191b3878fdbd3de1e59d3a3da3ea6)
- Обратите внимание, что
является единичным вектором, и поэтому
. Таким образом, мы можем упростить это до![{displaystyle d = - (mathbf {u} cdot (mathbf {o} -mathbf {c})) pm {sqrt {abla}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/c32bb120909e2e434c472ddca32f9b2bc337ecba)
![{displaystyle abla = (mathbf {u} cdot (mathbf {o} -mathbf {c})) ^ {2} - (leftVert mathbf {o} -mathbf {c} ightVert ^ {2} -r ^ {2}) }](https://wikimedia.org/api/rest_v1/media/math/render/svg/8c53554fdb111af98ac8f0579b71273db62d43e3)
- Если
, то ясно, что решений не существует, т.е. линия не пересекает сферу (случай 1). - Если
, то существует ровно одно решение, т.е. прямая касается сферы в одной точке (случай 2). - Если
, существует два решения, поэтому линия касается сферы в двух точках (случай 3).
Смотрите также
Рекомендации
- ^ Эберли, Дэвид Х. (2006). Дизайн трехмерного игрового движка: практический подход к компьютерной графике в реальном времени, 2-е издание. Морган Кауфманн. п. 698. ISBN 0-12-229063-1.
- ^ [1]