Я пишу пользовательскую анимацию для wpf и как не математический парень, у меня есть пара вопросов...
Если мне дают два Point3D, От и До, и предположение, что источник в 0,0,0, как я вычисляю кривую между двумя точками?
И после того как мне 'вывели кривую на печать', и я знаю ее длину (как сделать это также?), как я могу вычислить x, y, z провода на некотором данном расстоянии вдоль строки?
Спасибо!
Вы, вероятно, захотите выразить свою кривую как набор параметрических функций какой-либо другой переменной:
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,0,0 и две 3d точки. Что я сделал, так это преобразовал свои точки из декартовых в полярные, вычислил сферическую точку в данный момент времени и затем преобразовал эту точку обратно в декартовы координаты. Если кто-то хочет, чтобы я опубликовал настоящий код C #, дайте мне знать.
Чтобы получить вектор прямой линии из точки 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) больше точек (центры, контрольные точки и т. Д.) )