Подтвердить что ты не робот

Как проецировать точку на плоскость в 3D?

У меня есть трехмерная точка (point_x, point_y, point_z), и я хочу проецировать ее на 2D-плоскость в трехмерном пространстве, которое (плоскость) определяется координатами точки (orig_x, orig_y, orig_z) и унарным перпендикуляром vector (normal_dx, normal_dy, normal_dz).

Как мне это сделать? enter image description here

4b9b3361

Ответ 1

1) Сделайте вектор из вашей точки orig в точку интереса:

v = point-orig (in each dimension);

2) Возьмем точечное произведение этого вектора с единичным нормальным вектором n:

dist = vx*nx + vy*ny + vz*nz; dist = скалярное расстояние от точки к плоскости вдоль нормали

3) Умножьте единичный вектор нормали на расстояние и вычтите этот вектор из своей точки.

projected_point = point - dist*normal;

Изменить с изображением: Я немного изменил ваше изображение. Красный - 'v'; 'v' dot 'normal' = длина синего и зеленого (dist выше). Синий - normal*dist. Green = blue * -1: найти planar_xyz, начать с point и добавить зеленый вектор.

enter image description here

Ответ 2

Это очень просто, все, что вам нужно сделать, это найти перпендикуляр (abbr здесь |_) расстояние от точки P до плоскости, а затем перевести P назад на перпендикулярное расстояние в плоскости плоскости. В результате переведенный P находится в плоскости.

Принимая простой пример (который мы можем проверить путем проверки):

Установите n = (0,1,0) и P = (10, 20, -5).

enter image description here

Проецируемая точка должна быть (10,10, -5). Вы можете видеть, проверяя, что Pproj составляет 10 единиц, перпендикулярных плоскости, и если бы он находился в плоскости, он имел бы y = 10.

Итак, как мы находим это аналитически?

Плоское уравнение равно Ax + By + Cz + d = 0. То, что это уравнение означает ", чтобы точка (x, y, z) находилась в плоскости, она должна удовлетворять Ax + By + Cz + d = 0" .

Что такое уравнение Ax + By + Cz + d = 0 для плоскости, нарисованной выше?

Плоскость имеет нормаль n = (0,1,0). D можно найти, просто используя тестовую точку уже в плоскости:

(0)x + (1)y + (0)z + d = 0

Точка (0,10,0) находится в плоскости. Подключаясь выше, находим, d = -10. Плоское уравнение тогда 0x + 1y + 0z - 10 = 0 (если вы упростите, вы получите y = 10).

Хорошая интерпретация d заключается в том, что речь идет о перпендикулярном расстоянии, которое вам нужно было бы перевести плоскость по ее нормали, чтобы плоскость проходила через начало координат.

В любом случае, как только мы имеем d, мы можем найти расстояние от любой точки до плоскости следующим уравнением:

enter image description here

Существует 3 возможных класса результатов для | _ расстояние до плоскости:

  • 0: ON PLANE EXACTLY (почти никогда не происходит с проблемами неточности с плавающей запятой)
  • +1: > 0: В FRONT плоскости (с нормальной стороны)
  • -1: < 0: BEHIND plane (ON OPPOSITE SIDE OF NORMAL)

В любом случае,

enter image description here

Который вы можете проверить как правильно, осмотрев на диаграмме выше

Ответ 3

Этого недостаточно, чтобы обеспечить только начало координат и нормальный вектор. Это определяет трехмерную плоскость, однако это не определяет систему координат на плоскости.

Подумайте, что вы можете вращать свою плоскость вокруг нормального вектора относительно его начала (т.е. помещать нормальный вектор в начало координат и "вращать" ).

Однако вы можете найти расстояние от проецируемой точки до начала координат (что, очевидно, инвариантно к вращению).

Вычтите начало координат из трехмерной точки. Затем сделайте кросс-произведение с нормальным направлением. Если нормальный вектор нормализуется - результирующая длина вектора равна требуемому значению.

ИЗМЕНИТЬ

Для полного ответа потребуется дополнительный параметр. Скажем, вы также снабжаете вектор, обозначающий ось x на вашем плане. Таким образом, мы имеем векторы n и x. Предположим, что они нормализованы.

Происхождение обозначается O, ваша трехмерная точка p.

Затем ваша точка проецируется следующим образом:

x = (p - O) точка x

y = (p - O) точка ( n крест x)

Ответ 4

Этот ответ является дополнением к двум существующим ответам. Я хочу показать, как объяснения @tmpearce и @bobobobo сводятся к одному и тому же, в то же время обеспечивая быстрые ответы тем, кто просто заинтересован в копировании уравнения, наиболее подходящего для их ситуации.

Метод для плоскостей, определяемых нормальным n и точкой o

Этот метод был объяснен в ответе @tmpearce.

Учитывая точечно-нормальное определение плоскости с нормальным n и точкой o на плоскости, точка p ', являющаяся точка на плоскости, ближайшей к данной точке p, может быть найдена:

1) p '= p - (n ⋅ ( p - o)) * n

Метод для плоскостей, определяемых нормальным n и скалярным d

Этот метод был объяснен в ответе @bobobobo.

Для плоскости, определяемой нормальным n и скаляром d, точкой p ', являющейся точкой на плоскости, ближайшей к данной точке p, можно найти по:

2) p '= p - ( n > p + d) * n

Если вместо этого у вас есть точечно-нормальное определение плоскости (плоскость определяется нормальным n и точкой o на плоскости) @bobobobo предлагает найти d:

3) d = - n o

и вставьте это в уравнение 2. Это дает:

4) p '= p - (n p - n o) * n

Заметка о разнице

Посмотрите подробнее на уравнения 1 и 4. Сравнивая их, вы увидите, что в уравнении 1 используется n ⋅ (p - o), где уравнение 2 использует n p - n o. Это фактически два способа записать одно и то же:

5) n ⋅ (p - o) = n p - n o= n p + d

Таким образом, можно выбрать интерпретацию скаляра d, как если бы это был "предварительный расчет". Я объясню: если известны n и o, но o используется только для вычисления n ⋅ (p - o), мы можем также определить плоскость n и d и вычислить n p + d, потому что мы только что видели, что такой же предмет.

Дополнительно для программирования с использованием d имеет два преимущества:

  • Найти p 'теперь - более простой расчет, особенно для компьютеров. Для сравнения:
    • используя n и o: 3 вычитания + 3 умножения + 2 дополнения
    • используя n и d: 0 вычитания + 3 умножения + 3 дополнения.
  • Использование d ограничивает определение плоскости только 4 действительными числами (3 для n + 1 для d) вместо 6 (3 для n + 3 для о). Это сохраняет память.

Ответ 5

Пусть V = (orig_x, orig_y, orig_z) - (point_x, point_y, point_z)

N = (normal_dx, normal_dy, normal_dz)

Пусть d = V.dotproduct(N);

Проецируемая точка P = V + d.N

Ответ 6

Я думаю, вы должны слегка изменить способ описания самолета. В самом деле, лучший способ описать плоскость - через вектор n и скаляр c

(x, n) = c

(абсолютная величина) константы c является расстоянием плоскости от начала координат и равна (P, n), где P - любая точка на плоскости.

Итак, пусть P будет вашей исходной точкой, а A - проекцией новой точки A на плоскость. Вам нужно найти такое, что A '= A - a * n удовлетворяет уравнению плоскости, то есть

(A - a * n, n) = ( P, n strong > )

Решение для a, вы обнаружите, что

a = (A, n) - ( P, n) = ( A, n) - c

который дает

A '= A - [(A, n) - c] n

Используя ваши имена, это читает

c = orig_x*normal_dx + orig_y*normal_dy+orig_z*normal_dz;
a = point_x*normal_dx + point_y*normal_dy + point_z*normal_dz - c;
planar_x = point_x - a*normal_dx;
planar_y = point_y - a*normal_dy;
planar_z = point_z - a*normal_dz;

Примечание: ваш код сохранит один скалярный продукт, если вместо точки orig P вы храните c = (P, n), что означает, в основном, на 25% меньше флопов для каждой проекции (в случае, если эта процедура используется много раз в вашем коде).

Ответ 7

Пусть r - точка проекта, а p - результат проекции. Пусть c - любая точка на плоскости и n - нормаль к плоскости (не обязательно нормированная). Напишите p= r + m d для некоторого скаляра m, который будет считаться неопределенным, если их решение не является. Поскольку (p - c). n= 0, потому что все точки на плоскости удовлетворяют этому ограничению: ( r n) n + m ( d. n) = 0 и поэтому m = [( c - r). n]/[ d. n], где точка используется продукт (.). Но если d. n= 0, то нет решения. Например, если d и n перпендикулярны друг другу, решение не доступно.