Так что, если вы не знаете наверняка, что все точки лежат на одной плоскости, что было бы упрощением этого метода, я предполагаю, что вы разделили свой квадрат на два треугольника. Кроме того, я предполагаю, что есть 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-координату вашей произвольной точки.
Если вы точно не знаете, что все точки лежат на одном плане, вы должны разделить квадрат на два треугольника. Это для вас? – Bartvbl
[Altimetry] (http://www.dictionary.com/browse/altimetry) не означает, что вы думаете, что это значит. Слово, которое вы ищете, это «высота» или «высота». –