2017-01-29 13 views
0

Предположим, что квадрат (4 балла) рассматривается сверху. Каждый из 4-х точек не имеет такой же альтиметрии.3D-интерполяция координат

Если вы смотрите сверху (или снизу), вы видите квадрат, но если вы посмотрите со стороны, вы увидите, что 4 точки не находятся на одном уровне.

У вас есть плоскость, которая не является горизонтальной.

Позволяет себе представить пятую точку внутри квадрата. То, что я хочу сделать, это вычислить альтиметрию этой пятой точки. Эта альтиметрия является функцией положения точки внутри квадрата и альтиметрии четырех точек квадрата.

Я думаю, что я должен вычислить интерполяции, но я не сумел это сделать ...

Любая идея?

Благодаря

+0

Если вы точно не знаете, что все точки лежат на одном плане, вы должны разделить квадрат на два треугольника. Это для вас? – Bartvbl

+1

[Altimetry] (http://www.dictionary.com/browse/altimetry) не означает, что вы думаете, что это значит. Слово, которое вы ищете, это «высота» или «высота». –

ответ

1

Так что, если вы не знаете наверняка, что все точки лежат на одной плоскости, что было бы упрощением этого метода, я предполагаю, что вы разделили свой квадрат на два треугольника. Кроме того, я предполагаю, что есть 4 вершины, v_00, v_10, v_01 и v_11, представляющие каждую вершину вашего квадрата. Я также предполагаю, что ваши треугольники определены как (v_00, v_10, v_11) и (v_00, v_11, v_01).

vec4 v00 = vec4(...); 
vec4 v01 = vec4(...); 
vec4 v10 = vec4(...); 
vec4 v11 = vec4(---); 

vec4[2][3] triangles = {{v00, v10, v11}, {v00, v11, v01}}; 

Наконец, я предполагаю, что вы знаете X и Y координаты относительно нижней левой вершины (только вычесть х и у координаты вашей пятой точки от х и у координаты v_00). Я назову этот пункт P. Мы хотели бы знать его z coorinate.

vec4 fifthPoint = vec4(...); 
vec4 P = fifthPoint - v00; 

Это означает «общую границу» обоих треугольников лежит вдоль диагонали, идущей между нижней левой и правой верхней части площади.

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

Поскольку мы знаем, что форма представляет собой квадрат, мы можем взять координаты нашей точки P относительно v_00 (как я предполагал ранее) и посмотреть, что больше, чем другое. Если координата x P больше, чем координата y, мы знаем, что P находится на нижнем правом треугольнике. В противном случае он находится в верхнем левом углу.

bool whichTriangle = P.x > P.y; 
int triangleIndex = whichTriangle ? 0 : 1; 

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

Для треугольника 0:

vec4 vectorX = triangles[0][1] - triangles[0][0]; 
vec4 vectorY = triangles[0][2] - triangles[0][1]; 

Для треугольника 1:

vec4 vectorX = triangles[1][1] - triangles[1][2]; 
vec4 vectorY = triangles[1][2] - triangles[1][0]; 

Обратите внимание, что каждый вектор здесь идет вдоль оси х и у. Это важно, так что мы можем напрямую использовать координаты x и y из P для вычисления интерполированных значений.

Затем мы нормализуем два вектора, которые мы только что создали.

vectorX = vectorX.normalize(); 
vectorY = vectorY.normalize(); 

Теперь нам нужно просто перемножить эти два значения с X и Y координаты P, чтобы получить любую точку треугольника, и добавить его к базовой точке.

Для треугольника 0:

P = triangles[0][0] + vectorX * P.x + vectorY * P.y; 

Для треугольника 1:

P = triangles[1][1] - vectorX * (1.0 - P.x) - vectorY * (1.0 - P.y); 

И там у вас есть. Слишком сложное объяснение чего-то, что на самом деле не так уж сложно. Теперь P.z теперь содержит Z-координату вашей произвольной точки.

1

Будучи трапеции ABCD считают это линейчатой ​​поверхности: enter image description here

Тогда вы можете интерполировать P1 от А и В, и P2 от C и D. Наконец, вы можете интерполировать высоту P от P1 и P2 высоты