Линейная интерполяция трех трехмерных точек в трехмерном пространстве

У меня есть три 3D-точки, как p1(x1,y1,z1), p2(x2,y2,z2), p3(x3,y3,z3),
У меня есть еще один момент, но я знаю только x, y значение этой точки как p4(x4,y4,Z), в котором Z это значение, которое я люблю вычислять.

я уверен p4(x4,y4) точка находится внутри треугольника, образованного p1(x1,y1), p2(x2,y2), p3(x3,y3) путем проверки с использованием триангуляции Делоне. Как я могу вычислить Z значение балла p4? Мне нравится реализовывать это в C-программировании. На самом деле я пытаюсь реализовать griddata в MATLAB.

Спасибо

1

Решение

Вы можете выразить координаты P4 в векторной основе P1P2P3.

x4 = x1 + A * (x2 - x1) + B * (x3 - x1)
y4 = y1 + A * (y2 - y1) + B * (y3 - y1)

Это простая в решении система линейных уравнений. Вы должны найти коэффициенты A и B, а затем использовать их для вычисления z-координаты

z4 = z1 + A * (z2 - z1) + B * (z3 - z1)
4

Другие решения

p1, p2, p3 определить плоскость. Вы можете представить это точкой и нормалью. Например, P=p1, N=(p2-P) x (p3-P) (то есть N = перекрестное произведение p1p2 а также p1p3).

Теперь, когда p4 находится в одной плоскости, он удовлетворяет уравнению плоскости:

  (p4-P) · N = 0  %// dot product
⇒ (x4-x1)*N.x + (y4-y1)*N.y + (z4-z1)*N.z = 0

Перестановка:

z4 = z1 - ((x4-x1)*N.x + (y4-y1)*N.y)/ N.z

Нет линейной системы для решения, вам просто нужен перекрестный продукт.

6

Это для поддержки ответов MBo и Константина. Пожалуйста, не принимайте этот вопрос, но один из других.

Вот как вы могли бы реализовать решение в MATLAB:

%// Your known 3 points
p1 = [ 1 10  0]';
p2 = [-1 10 10]';
p3 = [ 0  0 10]';

%// your 4th target point
p4 = [0 5  NaN]';

%// Difference matrix/vector
A = [p2-p1  p3-p1];
b = p4-p1;

%// Compute solution
p4(end) = p1(end) + A(3,:)*(A(1:2,:)\b(1:2));

Теперь, в C ++, сам факт включения соответствующих eigen библиотеки взрывают исполняемый размер довольно эффектно. Какие eigen способен на полное излишество для этой простой системы 2х2.

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

Просто ПОЦЕЛУЙ Это; смотри ответ DanielKO 🙂

1

Математическая задача здесь состоит в том, чтобы решить следующую систему уравнений

p1 + a * (p2 - p1) + b * (p3 - p1) = (x4, y4, z4)

или эквивалентно

 (x1,y1,z1) + a * (x2-x1, y2-y1, z2-z1) + b * (x3-x1, y3-y1, z3-z1) = (x4, y4, z4)

для a, b и z4.

Чтобы решить эту проблему в C / C ++, вы можете либо реализовать алгоритм Гаусса (см. Также книгу «Численные рецепты», он доступен онлайн), либо использовать библиотеки линейной алгебры, такие как собственный, или другие

Замечание: подход один и тот же, независимо от того, если точка (x4, y4) лежит в треугольнике (x1, y1), (x2, y2), (x3, y3), или нет.

0
По вопросам рекламы [email protected]