Плоскости и линии являются полезными геометрическими объектами в трехмерном компьютерном зрении и компьютерной графике. Представление их в виде набора точек неэффективно, что приводит к большим требованиям к памяти в зависимости от размера шага, используемого для создания точек. В этой статье я расскажу, как представлять плоскости и линии, используя их векторные уравнения. Я также расскажу, как найти пересечение между линией и плоскостью, используя векторные формы.
Линия в 3D
Мы можем представить линию в векторной форме следующим уравнением [1].
p = l₀ + l . d, d ∈ R
где l — вектор в направлении линии, l₀ — точка на линии, d — вещественный скаляр.
p — это общая точка на прямой, и геометрическое место этих точек определяет ее. Таким образом, чтобы определить линию, нам нужно знать всего 6 чисел/параметров, чтобы полностью представить ее в векторной форме.
Я создал класс для представления линейного вектора и его построения. Он параметризуется вектором и точкой_на_линии. Оба они представляют собой векторы-столбцы 3x1 numpy.
Чтобы получить точки на линии для построения графика, мы можем использовать само векторное уравнение. Меняйте d и добавляйте масштабированные версии вектора к point_on_line, и вы получите точки на линии! И затем их можно построить с помощью любой библиотеки построения графиков.
Я покажу несколько образцов строк.
Если вам нужна линия, охватывающая 2D-плоскость, вы можете использовать вектор, который имеет ненулевые значения только в двух координатах, и вы получите линию в 2D-плоскости.
Самолет в 3D
Мы можем представить плоскость в векторной форме, используя следующее уравнение.
(p— p₀) . n = 0,где n — нормальный (перпендикулярный) вектор к плоскости, а p₀ — точка на плоскости.
Геометрическое место всех точек p в приведенном выше уравнении определяет плоскость. Термин (p— p₀) обозначает вектор в плоскости, а n — вектор, ортогональный или нормальный к плоскости. Таким образом, для этих векторов для всех точек p, лежащих на плоскости, скалярное произведение этих двух векторов, ортогональных друг другу, будет равно нулю.
Такой элегантный способ выразить самолет всего 6 цифрами!
Ниже приведен класс плоскости в Python, который использует приведенное выше определение.
Вы можете прочитать о других способах представления плоскостей в этой статье: https://medium.com/@daniel.j.lenton/part-iii-projective-geometry-in-3d-37f36746733b Daniel Lenton.
Далее давайте посмотрим, как найти пересечение прямой и плоскости.
Пересечение точки и плоскости в 3D [1]
Теперь, когда мы знаем, как представлять точки и плоскости в 3D, мы можем посмотреть, как найти пересечение между этими двумя геометрическими объектами. Если линия и точка пересекаются в точке p, она удовлетворяет уравнениям как линии, так и плоскости. Поэтому, чтобы найти точку пересечения, подставьте значение p из уравнения прямой в уравнение плоскости.
(( l₀ + l . d) — p₀) . n = 0
Расширение терминов дает следующее уравнение.
(l . n) d + (l₀ — p₀) . n = 0
Решение для d дает:
d = (p₀ — l₀) . n / (l . n)
Это значение d дает нам точку, лежащую как на прямой, так и на плоскости, которая по определению является точкой пересечения.
Возможны три случая пересечения.
- Во-первых, нет пересечения, то есть прямая и плоскость параллельны, но прямая не лежит в плоскости.
- Далее ровно одна точка пересечения.
- Наконец, прямая параллельна плоскости и лежит на ней, в этом случае каждая точка прямой также будет лежать на плоскости. Следовательно, в этом случае будет бесконечно много точек, удовлетворяющих обоим уравнениям.
Для первых двух случаев l . n = 0, так как l для них будет перпендикулярно вектору нормали n. В противном случае мы получим реальное значение d, которое можно подставить обратно в уравнение прямой, чтобы получить точку пересечения:
p = l₀ + l . d
Я написал функцию для вычисления пересечения на основе приведенных выше уравнений как для плоского, так и для линейного классов. Обратите внимание, что функция — это то же уравнение, разница только в синтаксисе кода.
Теперь мы можем использовать классы плоскости и линии, чтобы найти точки пересечения между ними.
Например:
Мы можем проверить результат, используя sympy:
Мы получаем то же самое, используя реализацию sympy, которая проверяет наш код.
Вывод
В этой статье мы рассмотрели линии и плоскости в 3D. Мы видели их векторные уравнения и то, как их представлять, используя только вектор и точку. Это позволяет очень компактно представить только 6 чисел. Наконец мы увидели, как найти пересечение между ними, и рассмотрели три возможных случая пересечения. Я надеюсь, что вы нашли это полезным. Следите за другими интересными статьями. Спасибо за чтение!
использованная литература
[1] https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection