Определить векторы и найти углы, используя Python в трехмерном пространстве? - PullRequest
0 голосов
/ 20 января 2019

У меня есть набор точек в трехмерном пространстве, и я определил векторную форму от одной точки к другой.Я хочу найти угол каждого из этих векторов со ссылкой на вектор, определенный как опорный.

Вектор, определенный как опорный, находится между этими двумя точками,

head = [0.5806  0.50239 0.54057]
tail = [0.5806  0.50239 0.     ]

Опорный векторопределяется как

v_reference = head - tail 

Набор точек, из которых я определил вектор из одной точки в другую:

            x           y           z
0   0.722950    0.611143    0.154976
1   0.722887    0.611518    0.152955
2   0.722880    0.612001    0.150593
3   0.722910    0.612509    0.148238
4   0.723049    0.613053    0.146069
5   0.723113    0.613583    0.143714
6   0.722763    0.613838    0.141321
7   0.721956    0.613876    0.138467
8   0.721638    0.614167    0.136008
9   0.720665    0.614093    0.133143
10  0.719612    0.613956    0.130317
11  0.718672    0.613882    0.127562
12  0.717771    0.613870    0.124638
13  0.716533    0.613668    0.121512

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

Для определения векторов я использовал следующий подход:

vector[i] = data[i+1] - data[i]

Я хочу найти угол каждого из этих векторовотносительно опорного вектора (v_reference).

Я использовал следующий подход для вычисления угла,

def dotproduct(v1, v2):
    """This function computes dot product of two vectors."""
    return sum((a*b) for a, b in zip(v1, v2))

def mag(v):
    """This function computes magnitude of two vectors."""
    return math.sqrt(dotproduct(v, v))

def angle(v1, v2):
    """This function computes angle between two vectors."""
    return (np.arccos(dotproduct(v1, v2) / (mag(v1) * mag(v2))))*(180/math.pi)

угол должен быть непрерывно возрастает, но колеблется. * * тысяча двадцать-два

1 Ответ

0 голосов
/ 20 января 2019

Я думаю, что ваша проблема может быть в том, как вы определяете свои векторы. Если я делаю все в точности так, как вы описываете в своем вопросе, то я также получаю последовательность колеблющихся углов:

import pandas as pd
import numpy as np

def ang(u, v):
    # see https://stackoverflow.com/a/2827466/425458
    c = np.dot(u/np.linalg.norm(u), v/np.linalg.norm(v))
    return np.rad2deg(np.arccos(np.clip(c, -1, 1)))

d = '''            x           y           z
0   0.722950    0.611143    0.154976
1   0.722887    0.611518    0.152955
2   0.722880    0.612001    0.150593
3   0.722910    0.612509    0.148238
4   0.723049    0.613053    0.146069
5   0.723113    0.613583    0.143714
6   0.722763    0.613838    0.141321
7   0.721956    0.613876    0.138467
8   0.721638    0.614167    0.136008
9   0.720665    0.614093    0.133143
10  0.719612    0.613956    0.130317
11  0.718672    0.613882    0.127562
12  0.717771    0.613870    0.124638
13  0.716533    0.613668    0.121512'''

df = pd.read_csv(pd.compat.StringIO(d), sep='\s+')
xyz = df.values
u = np.diff(xyz, axis=0)

head = np.array([0.5806,  0.50239, 0.54057])
tail = np.array([0.5806,  0.50239, 0.     ])
v = head - tail

ang(u, v)
# output:
#     array([101.96059029, 104.01677172, 103.97438663, 102.85092705,
#            103.97438663, 104.20457158, 107.01708978, 104.604926  ,
#            107.08468905, 106.84512875, 106.40978005, 107.44768844,
#            108.69610224])

Однако, если вы рассматриваете свой список xyz точек как векторы (то есть векторы, начинающиеся с начала координат и идущие к каждой из точек), то вы видите постоянно увеличивающийся угол между опорным вектором и последовательностью векторы, как вы и ожидали:

ang(xyz, v)
# output:
#     array([87.51931013, 87.55167997, 87.58951053, 87.62722792, 87.66196546,
#            87.69968089, 87.73800388, 87.78370828, 87.82308596, 87.8689639 ,
#            87.91421599, 87.95832992, 88.0051486 , 88.05520021])

Может быть, это действительно правильный способ интерпретации / анализа ваших данных?

...