答案 0 :(得分:1)
首先,您需要归一化这两个向量。
完成后,您就可以
angle = arcos(v1•v2)
其中“ angle”是要查找的角度,“ arcos”是余弦函数的倒数,“•”是点积运算符
请注意,这只会返回相对角度和原始角度。您将无法知道哪个矢量在左边,哪个矢量在右边。
答案 1 :(得分:1)
基本上,需要将连接两个向量的点作为起点,其中x = 0和y = 0。
看看这张照片:
现在我们可以说 A , B 和 C 点的x和y值为:
要计算两者的反正切,可以使用 Math.atan2()函数。请注意,atan2的第一个参数必须为y值。
var firstAngle = Math.atan2(-6, 0);
var secondAngle = Math.atan2(2, 5);
并通过减法获得它们的区别
var angle = secondAngle - firstAngle;
这将返回一个弧度值,您可以将其转换为如下程度:
angle = angle * 180 / Math.PI;
答案 2 :(得分:0)
如果您需要 2D (z=0
) 和 3D 支持,您可以使用 Dot product
const dot = (p1, p2) => p1.x * p2.x + p1.y * p2.y + p1.z * p2.z;
使用平方震级 (magSq
),我们可以计算震级:mag = Math.sqrt(magSq)
const magSq = ({x, y, z}) => x ** 2 + y ** 2 + z ** 2;
const mag = Math.sqrt(magSq(p));
现在我们可以计算 Dot product 并在之后对其进行“标准化”。
现在使用 acos()
获取角度:
const angle = Math.acos(dot(p1, p2) / Math.sqrt(magSq(p1) * magSq(p2)));
我们也可以使用 Math.hypot()
,一个专门用于 mag
的 JS 函数:
const mag = (p) => Math.hypot(p.x, p.y, p.z);
...并获得角度:
const angle = Math.acos(dot(p1, p2) / (mag(p1) * mag(p2)));
let a = {x: 0, y: -6, z: 0};
let b = {x: 5, y: 2, z: 0}; // set z != 0 for 3D
let dot = (p1, p2)=> p1.x * p2.x + p1.y * p2.y + p1.z * p2.z;
let magSq = ({x, y, z}) => x ** 2 + y ** 2 + z ** 2;
let angle1 = Math.acos(dot(a, b) / Math.sqrt(magSq(a) * magSq(b)));
console.log('1. Angle:', angle1); // 1.9513027
// ... or
let mag = ({x, y, z}) => Math.hypot(x, y, z);
let angle2 = Math.acos(dot(a, b) / (mag(a) * mag(b)))
console.log('2. Angle:', angle2); // 1.9513027