2013-09-12 4 views
1

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

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

Благодаря

+0

U необходимо предоставить дополнительную информацию, p1 (x1, y1), p2 (x2, y2), p3 (x3, y3) - это те же точки, что и 3D-точки? Или они являются проекциями p1, p2, p3 на плоскость xy? –

+0

Да, они представляют собой x, y плоские точки трехмерных точек. – batuman

+0

Является ли эта интерполяция барицентрических координат? – batuman

ответ

4

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

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

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

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

downvoter - напишите о моих ошибках, пожалуйста – MBo

+0

да, PLS описать, что не так? – batuman

+0

Да, это так же, как интерполяция барицентрических координат. – batuman

0

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

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++, вы можете либо реализовать Gauss algo (см. Также книгу Numericical Recipes, она доступна в Интернете), либо использовать библиотеки линейной алгебры, такие как Eigen или другие.

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

+0

спасибо. Но если (x4, y4) лежит внутри трех точек, то подход один и тот же. Это? – batuman

+0

@ батуман: действительно. Если бы он лежал * вне * треугольника, его можно было бы называть * экстраполяцией * :) –

+0

Разрешимый, да, но это не значит, что у него всегда есть решение. – MSalters

6

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 

Нет линейной системы, чтобы решить, нужно просто перекрестную продукт ,

+0

+1, но выпишите решение линейной системы, и вы найдете тот же результат. –

1

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

Это, как вы бы реализовать решение в 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 способно к полному переполнению для этой простой системы 2x2.

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

KISS it; см. ответ DanielKO :)

Смежные вопросы