#python #numpy #math #vector #physics
Вопрос:
У меня есть вектор AB и вектор BC в 3D. У меня также есть значения этих 2 векторов . Я также знаю угол между вектором AB и вектором BC. Более того, я также знаю координаты A и B.
Я хочу найти координаты С.
Чтобы быть более конкретным, для вектора AB фиксированной длины я хочу построить множество векторов с различными значениями и фиксированным углом между AB и «подлежащими построению векторами» с информацией, приведенной выше.
Один из известных мне способов-найти координаты x y и z конечной точки C, но в 3D требуется 2 угла, и у меня есть только один, поэтому я не могу придумать решение.
Пожалуйста, помогите мне.
Спасибо
Комментарии:
1. Уникального решения не существует. Локус C-это круг, и существует бесконечное множество решений. Кроме того, это, по-видимому, не является проблемой программирования.
2. Возможно, мне будет лучше задать ваш вопрос по math.stackexchange.com .
3. Здравствуйте, спасибо за ваш ответ. На самом деле я пытаюсь закодировать это, чтобы построить древовидную структуру. У меня есть вектор, и я хочу построить другой вектор из его конечной точки, указав 1 угол и длину, а затем найти его конечную точку.
4. Как уже упоминалось ранее, и я поддерживаю это, в 3D нет уникальной точки C, которая удовлетворяла бы вашим условиям, но есть целый круг из них.
5. Ваша проблема не имеет достаточных ограничений. Если вы не ограничите, где C может лежать каким-либо образом (например, в определенной плоскости), для C не существует уникального решения, независимо от используемой системы координат и представления.
Ответ №1:
если вам нужен алгоритм, который выбирает одну из бесконечного множества таких точек, возможно, для вас подойдет следующий алгоритм:
import numpy as np
def frame_rotation(v):
i = np.argmin(v)
E = np.zeros(3)
E[i] = 1
U = np.empty((3,3), dtype=float)
U[0, :] = v
U[2, :] = np.cross(v, E)
U[2, :] = U[2, :] / np.linalg.norm(U[2, :])
U[1, :] = np.cross(U[2, :], U[0, :])
return U.T
def find_a_point_C(A, B, length_BC, angle):
AB = B - A
length_AB = np.linalg.norm(B-A)
AB = AB / length_AB
angle = angle * np.pi/180
C = np.array([np.cos(angle), np.sin(angle), 0])
C = length_BC * C
C[0] = C[0] length_AB
U = frame_rotation(AB)
return U.dot(C) A
def cos_angle(v,w):
return v.dot(w)/ (np.linalg.norm(v)*np.linalg.norm(w))
A = np.array([1,3,2])
B = np.array([2,7,7])
length_BC = 3
angle = 60 # degrees
C = find_a_point_C(A, B, length_BC, angle)
print(C)
# test for correctness
print(np.linalg.norm(C-B))
print(cos_angle(B-A,C-B))
print(cos_angle(B-A,C-B) - np.cos(angle*np.pi/180))