Плоскости и линии являются полезными геометрическими объектами в трехмерном компьютерном зрении и компьютерной графике. Представление их в виде набора точек неэффективно, что приводит к большим требованиям к памяти в зависимости от размера шага, используемого для создания точек. В этой статье я расскажу, как представлять плоскости и линии, используя их векторные уравнения. Я также расскажу, как найти пересечение между линией и плоскостью, используя векторные формы.

Линия в 3D

Мы можем представить линию в векторной форме следующим уравнением [1].

p = l₀ + l . d, d ∈ R

где l — вектор в направлении линии, l₀ — точка на линии, d — вещественный скаляр.

p — это общая точка на прямой, и геометрическое место этих точек определяет ее. Таким образом, чтобы определить линию, нам нужно знать всего 6 чисел/параметров, чтобы полностью представить ее в векторной форме.

Я создал класс для представления линейного вектора и его построения. Он параметризуется вектором и точкой_на_линии. Оба они представляют собой векторы-столбцы 3x1 numpy.

Чтобы получить точки на линии для построения графика, мы можем использовать само векторное уравнение. Меняйте d и добавляйте масштабированные версии вектора к point_on_line, и вы получите точки на линии! И затем их можно построить с помощью любой библиотеки построения графиков.

Я покажу несколько образцов строк.

Если вам нужна линия, охватывающая 2D-плоскость, вы можете использовать вектор, который имеет ненулевые значения только в двух координатах, и вы получите линию в 2D-плоскости.

Самолет в 3D

Мы можем представить плоскость в векторной форме, используя следующее уравнение.

(pp₀) . n = 0,где n — нормальный (перпендикулярный) вектор к плоскости, а p₀ — точка на плоскости.

Геометрическое место всех точек p в приведенном выше уравнении определяет плоскость. Термин (pp₀) обозначает вектор в плоскости, а 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 дает нам точку, лежащую как на прямой, так и на плоскости, которая по определению является точкой пересечения.

Возможны три случая пересечения.

  1. Во-первых, нет пересечения, то есть прямая и плоскость параллельны, но прямая не лежит в плоскости.
  2. Далее ровно одна точка пересечения.
  3. Наконец, прямая параллельна плоскости и лежит на ней, в этом случае каждая точка прямой также будет лежать на плоскости. Следовательно, в этом случае будет бесконечно много точек, удовлетворяющих обоим уравнениям.

Для первых двух случаев 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