Как рассчитать точку вдоль кривой? - PullRequest
7 голосов
/ 21 мая 2010

Я пишу собственную анимацию для wpf, и у меня нет математики. У меня есть пара вопросов ...

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

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

Спасибо!

Ответы [ 3 ]

5 голосов
/ 21 мая 2010

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

B - A

что бы перевести на:

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 есть векторный тип для C # , который сделает многое за вас.

Если вам нужна кривая, вам понадобится:

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

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

0 голосов
/ 24 мая 2010

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

0 голосов
/ 21 мая 2010

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

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

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

...