Как вычислить точку вдоль кривой?

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

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

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

Спасибо!

7
задан Nicros 21 May 2010 в 18:55
поделиться

3 ответа

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

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 координаты. Один из подходов - определить набор контрольных точек, которые вы хотите кривую, через которую нужно пройти (или рядом), а затем выразите свои параметрические уравнения в терминах сплайн-функции . Для этого вам не нужно знать длину дуги кривой.

0
ответ дан 7 December 2019 в 12:16
поделиться

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

0
ответ дан 7 December 2019 в 12:16
поделиться

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

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

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

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

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

5
ответ дан 7 December 2019 в 12:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: