Учитывая 2 значения вектора и угол между ними, найдите конечную точку

#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))