如何在画布上找到两个向量之间的夹角?

时间:2019-05-15 10:35:39

标签: javascript math canvas geometry

我需要找到画布上两个向量之间的角度。 我在下面附加了一些示例: enter image description here

enter image description here

您能告诉我一些公式吗?我的学校数学有问题:)

3 个答案:

答案 0 :(得分:1)

首先,您需要归一化这两个向量。

完成后,您就可以

angle = arcos(v1•v2)

其中“ angle”是要查找的角度,“ arcos”是余弦函数的倒数,“•”是点积运算符

请注意,这只会返回相对角度和原始角度。您将无法知道哪个矢量在左边,哪个矢量在右边。

答案 1 :(得分:1)

基本上,需要将连接两个向量的点作为起点,其中x = 0和y = 0。

看看这张照片:

现在我们可以说 A B C 点的x和y值为:

  • A = 0 | 0
  • B = 0 | -6
  • C = 5 | 2

要计算两者的反正切,可以使用 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