首页 > 解决方案 > 找出两个 3D 向量的所有正负组合之间的角度

问题描述

在计算两个 3D 角度之间的角度的这个问题之后,我想以一种计算所有可能的正负组合角度的方式来扩展它。

例如,我从计算 (1,1,5) 和 (-1,1,2) 之间的角度的同一链接中获得以下代码:

import numpy as np
import vg

vec1 = np.array([1, 1, 5])
vec2 = np.array([-1, 1, 2])

angle= vg.angle(vec1, vec2)
print(angle)

现在我想要一个小函数来计算每个向量的所有可能的正负组合并给出所有角度的列表。

例如,它计算以下对:(1,1,5)(-1,1,2), (1,1,-5)(-1,1,2), (1,-1,-5) (-1,1,2) 等。这似乎很容易,但我想不通。

附带问题:我如何要求input()函数获取向量?我知道它是如何处理字符串和数字的,但你能要求它以特殊格式从用户那里获取输入数据吗?像(1,2,3)?

标签: pythonnumpycomputational-geometry

解决方案


vec_comb[:,:3]具有 的所有组合vec1,并且vec_comb[:,3:]具有 的所有组合vec2

import numpy as np
import vg
import itertools


vec1 = np.array([1, 1, 5])
vec2 = np.array([-1, 1, 2])

vec_concat = np.hstack((vec1, vec2))


l = [1,-1]
comb = np.array(list(itertools.product(l, repeat=vec_concat.shape[0])))

vec_comb = np.einsum('i, ji -> ji', vec_concat, comb)
angle_comb = vg.angle(vec_comb[:,:3], vec_comb[:, 3:])
print(angle_comb)

输出:

[ 38.2169233  141.7830767   51.05755873 160.52877937  19.47122063
 128.94244127  38.2169233  141.7830767  141.7830767   38.2169233
 160.52877937  51.05755873 128.94244127  19.47122063 141.7830767
  38.2169233   51.05755873 160.52877937  38.2169233  141.7830767
  38.2169233  141.7830767   19.47122063 128.94244127 160.52877937
  51.05755873 141.7830767   38.2169233  141.7830767   38.2169233
 128.94244127  19.47122063  19.47122063 128.94244127  38.2169233
 141.7830767   38.2169233  141.7830767   51.05755873 160.52877937
 128.94244127  19.47122063 141.7830767   38.2169233  141.7830767
  38.2169233  160.52877937  51.05755873  38.2169233  141.7830767
  19.47122063 128.94244127  51.05755873 160.52877937  38.2169233
 141.7830767  141.7830767   38.2169233  128.94244127  19.47122063
 160.52877937  51.05755873 141.7830767   38.2169233 ]

推荐阅读