2010-05-21 3 views
7

Я пишу пользовательскую анимацию для wpf и как не математический парень У меня есть пара вопросов ...Как вычислить точку вдоль кривой?

Если мне даны два Point3D, From и To и предполагая, что начало координат равно 0,0, 0 как вычислить кривую между двумя точками?

И как только у меня есть кривая «построена», и я знаю ее длину (как это сделать?), Как я могу рассчитать координаты x, y, z на некотором заданном расстоянии вдоль линии?

Спасибо!

+2

Возможно, вы захотите выбросить это на http://mathoverflow.net/, а затем вернуться сюда для получения рекомендаций по реализации. Это хороший вопрос ... когда вы получите решение; отложите его ... он появится снова через несколько лет и, как и я, вы забудете математику. Теперь ... что я записал, что под? .. кривой? ... графика? .... дерьмо. – Rusty

+1

Когда вы говорите, что хотите «кривую», это звучит так, будто вам не нужна прямая линия между вашими двумя точками, но вы хотите, чтобы извилистая линия соединяла ваши конечные точки и некоторые другие точки между ними. Возможно, загляните в Splines и NURBS. – FrustratedWithFormsDesigner

+0

Вы должны точно указать, какой тип кривой вы хотите: существует бесконечное количество кривых, проходящих через 2 точки. EDIT: если вы хотите сплайн, вам нужно как минимум 3 балла. – nico

ответ

5

Чтобы получить прямой вектор линии из точки А в точку Б:

В -

который бы перевести:

vector.x = b.x - a.x; 
vector.y = b.y - a.y; 
vector.z = b.z - a.z; 

Длина:

length = Math.Sqrt(vector.x * vector.x + 
        vector.y * vector.y + 
        vector.z * vector.z); 

Чтобы получить точку на определенное расстояние вдоль вектора вам нужно сделать вектор единичный вектор (длина 1):

vector.x = vector.x/length; 
... 

, а затем умножить на вашем расстоянии:

vector.x = distance * vector.x; 
... 

Это все из память, поэтому может не скомпилироваться сразу.

В CodeProject есть A Vector Type for C#, который сделает это за вас.

Если вы хотите кривую, то вам необходимо:

а) определить, какой тип кривой вы хотите (дугу, сплайн и т.д.)

б) больше точек (центров, контроль точки и т.д.)

+0

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

0

Вы, вероятно, хотите, чтобы выразить свой кривой в виде набора параметрических функций некоторых других переменным:

x = f(t) 
y = g(t) 
z = h(t) 

where 0 <= t <= 1, and 

f(0) = from.x, f(1) = to.x 
g(0) = from.y, g(1) = to.y 
h(0) = from.z, h(1) = to.z 

Есть бесконечное число кривых коннектина g любые две точки, поэтому вам понадобится больше информации, чтобы решить, какую форму f (t), g (t) и h (t) следует принять. Чтобы переместить точку вдоль кривой, вы просто можете варьировать от 0 до 1 и вычислять координаты x, y и z . Один из подходов состоит в том, чтобы определить набор контрольных точек, которые вы хотите, чтобы ваша кривая проходила (или рядом), а затем выражала свои параметрические уравнения в терминах spline functions. Для этого вам не нужно знать длину дуги кривой.

+0

Спасибо за ответ! Я опубликовал несколько замечаний выше, но в основном, я думаю, что мои две точки находятся на закрытой поверхности - сфере или эллипсоиде. Поэтому, учитывая происхождение и эти две точки, мне нужно будет получить положение xyz в данный момент времени (или расстояние вдоль линии). – Nicros

0

Так что я просто хотел следить за своим решением, хотя верно, что существует бесконечное количество кривых. Мой (плохо сформулированный) вопрос заключался в том, как построить между двумя точками на кривой - кратчайшее расстояние, происхождение 0,0,0 и две 3d точки. То, что я сделал, это преобразовать мои точки от декартова в полярную, вычислить сферическую точку в данный момент времени, а затем преобразовать эту точку обратно в декартес. Если кто-то хочет, чтобы я опубликовал фактический код C#, дайте мне знать.