Трехмерная интерполяция с 3 заданными точками (эквидистантными)

Я разрабатываю трехмерную шахматную игру, в которой мне нужно иметь возможность вычислять позиции X, Y, Z траектории таким образом, чтобы эта траектория описывала параболу (для анимации фигур).

Таким образом, мне нужны приведенные ниже формулы (или общая формула) для заданных равноудаленных точек p1=(x1,y1,z1), p2=(x2,y2,z2) и p3(x3,y3,z3):

x=f(y,z)=???  
y=f(x,z)=???   
z=f(x,y)=???

person Andrade    schedule 17.05.2012    source источник
comment
p1, p2 и p3 лежат на параболе, а p2 является ее вершиной?   -  person Ani    schedule 17.05.2012
comment
точно!! p1 — это начало, p2 — вершина, а p3 — конец.   -  person Andrade    schedule 17.05.2012
comment
Проблема чрезмерно ограничена, если p2 точно вершина. Нужно считать им всего три точки в пространстве, принадлежащие параболе.   -  person John Alexiou    schedule 17.05.2012
comment
Я думаю, что этот другой пост SO ответит на ваш вопрос. stackoverflow.com/questions/4039039/   -  person Ani    schedule 17.05.2012
comment
Вы имеете в виду 3D-шахматы, такие как несколько досок на разных высотах, как это видно, например, в Star Trek? ? Или это обычная одиночная плоская доска, но отрендеренная в 3D? Уравнения легче вывести, если доска плоская, т.е. y1 == y3   -  person Kevin    schedule 17.05.2012


Ответы (2)


Для каждой компоненты x, y и z рассмотрим отдельную параболу, определяемую формулой

x(t) = x1 - t*(3*x1-4*x2+x3) + 2*t^2*(x1-2*x2+x3)     //t=0..1
y(t) = y1 - t*(3*y1-4*y2+y3) + 2*t^2*(y1-2*y2+y3)     //t=0..1
z(t) = z1 - t*(3*z1-4*z2+z3) + 2*t^2*(z1-2*z2+z3)     //t=0..1

в t=0 потом x=x1, в t=0.5 потом x=x2 и в t=1 потом x=x2. Аналогично для y(t) и z(t).

person John Alexiou    schedule 17.05.2012
comment
Прошло много времени с моего последнего урока геометрии, но... Я подозреваю (но не могу доказать), что использование многочлена для x(t) и z(t) немного исказит параболу, если смотреть сбоку. Я думаю, вам нужны линейные функции для x и z, чтобы получить настоящую параболу. Тем не менее, ваши уравнения, я думаю, все равно дадут красивую изогнутую форму, которая в любом случае может удовлетворить потребности ОП. - person Kevin; 18.05.2012
comment
Большое спасибо, это сработало отлично. Это очень просто и понятно. Это даже лучше, чем я ожидал, потому что я могу остановить анимацию, только проверив t вместо X, Y, Z текущей точки. - person Andrade; 18.05.2012

Если начальное и конечное значения y совпадают, вы можете описать параболу с помощью параметрического уравнения, которое можно вывести за несколько шагов.

учитывая начальную высоту и вершину высоты,

y(t) = A(t^2) + B(t) + C
y(0) = startingHeight
y(0.5) = apexHeight
y(1) = startingHeight

y(0) = startingHeight = A*0 + B*0 + C
C = startingHeight
y(t) = A(t^2) + B(t) + startingHeight

y(1) = startingHeight = A + B + startingHeight
0 = A+B
A = -B
y(t) = -B(t^2) + B(t) + startingHeight

y(0.5) = apexHeight = -B(0.25) + B(0.5) + startingHeight
apexHeight = B(0.5 - 0.25) + startingHeight
apexHeight - startingHeight = B(0.25)
B = (apexHeight - startingHeight)/4.0

Теперь, когда вы знаете A, B и C, вы можете написать метод для y:

function y(startingHeight, apexHeight, t){
    B = (apexHeight - startingHeight) / 4;
    A = -B;
    C = startingHeight;
    return A*t*t + B*t + C;
}

x и z проще, так как они просто увеличиваются линейно от начала до конца:

x(t) = At + B
x(0) = startX
x(1) = endX

x(0) = startX = A*0 + B
B = startX
x(t) = At + startX

x(1) = endX = A*1 + startX
A = endX - startX

x(t) = (endX - startX) * t + startX

(z имеет формулу, идентичную x - просто замените все x на z)

function x(start, end, t){
    A = (end - start);
    B = start;
    return A*t + B;
}

function z(start, end, t){
    A = (end - start);
    B = start;
    return A*t + B;
}

Теперь вы можете найти 3d позицию шахматной фигуры в момент времени t:

function parabola(xBegin, xEnd, zBegin, zEnd, yStart, yApex, t){
    return [x(xBegin,xEnd,t), y(yStart,yApex,t), z(zBegin,zEnd,t)];
}
person Kevin    schedule 17.05.2012