跳到主要内容
CalcMax

两向量夹角计算器

结果

60.0000 °

两向量夹角

夹角的余弦
0.5000
角度(弧度)
1.0472

两向量夹角计算器收两个向量的分量,给出它们的夹角,同时给出算出这个夹角的余弦值,以及同一角度的弧度值。分量用空格或逗号隔开,一个三维向量写成 1 1 0,二维的写成 0 3,其余交给页面。两个向量的分量个数必须一样,但除此之外没有别的限制,负数分量照收。背后的算术很短:把两个向量的第一个分量相乘、第二个相乘、依此类推,再把所有乘积加起来,得到的就是数量积(内积,也叫点积);求出每个向量的模,也就是各分量平方和开根号;数量积除以两个模的乘积,就是夹角的余弦;夹角本身是那个余弦的反余弦。绕道余弦而不是直接求夹角,是这件事的全部窍门——余弦是数量积自然产出的东西,而且它本身就更值得看:两个向量同向时余弦为 1,垂直时为 0,反向时为 −1。这三种正是人们真正会认的答案,一个都不需要计算器。垂直向量的情形(这一页最常被用来查的就是它)就是余弦恰好为零的那一档。其余情形落在中间,页面按四位小数同时给出角度与弧度——世界上有一半公式要的是后者,而多数人读的是前者。有一样输入会被拒答而不是被算出结果:零向量。它的模是零,因此根本没有方向,拿它的模去做除数等于除以零,而返回 0 度又会变成在说它跟你的向量同向,所以这一页干脆不收这一档。

若干向量对与它们的夹角

向量 u向量 v夹角的余弦夹角(°)
1 1 01 0 10.560
1 00 1090
1 0 01 0 010
-1 0 01 0 0-1180
1 11 00.707145
3 4 04 3 00.9616.2602
1 2 22 2 10.888927.266
2 -34 5-0.3032107.6501

八对,第一行就是页面加载时的那一档。余弦这一栏是整张表的意义所在:光看夹角一栏是看不出规律的,把余弦摆在旁边,三个特殊值立刻自己站出来。第一行的余弦正好是 0.5、夹角正好 60 度,第六行余弦 0.96、夹角 16.26 度——这两行之间就是这一页最该记住的警告:余弦把 0 到 90 度挤进 1 到 0,而且挤得不均匀。第二行是最朴素的直角,第三行是一个向量与它自己,给出余弦范围的 0 与 1 两端,第四行用一个向量与自己的相反数补上第三端 −1,三行合起来就是整条刻度。第五行是 45 度,实际计算里出现频率最高的半直角;第七行是那个不整齐的三维对子:两个模都正好是 3,而数量积是 8,于是余弦是 8 ÷ 9,除不尽。第八行是钝角的一档、分量符号相反:余弦 −0.3032、夹角 107.6501,两者必须一致,因为「余弦为负」与「夹角小于 90 度」不可能同时成立。弧度值在这里「故意不成一栏」——它是同一个角度的另一种记法,加第五栏不会多说任何东西。表里每个数都是构建页面时现算的,前两栏里的空格是分量分隔符,不是数字的一部分。

公式

cos θ = (u · v)÷ (|u| × |v|) θ = arccos(cos θ) u · v = u₁v₁ + u₂v₂ + … + uₙvₙ

向量 u
第一个向量,写成它各个分量、用空格或逗号隔开:三维就写 1 1 0,二维写 0 3,多少维都行。这一页没有固定的输入框个数,因为它接受任意维数;两个向量的分量个数必须彼此一致
向量 v
第二个向量,写法相同,分量个数与第一个一样。两个向量对调不影响结果——夹角不分先后
u · v
数量积(内积):两个向量的第一个分量相乘、第二个相乘、依此类推,再把乘积加起来。这一页要用它,但「不印它」——在这里它是求夹角的原料,不是独立的答案
|u| 与 |v|
两个向量的模,单位与分量本身相同:各分量平方和开根号。它们就是数量积要除的那两个数,而每个模都是那个向量自己的事——其中一个很大,说明不了另一个
cos θ
两个向量夹角的余弦,等于数量积除以两个模的乘积。两个向量同向时为 1,垂直时为 0,反向时为 −1,且永远不会跑出这个范围。夹角是从它反解出来的,所以页面把它一起印出来
θ
两个向量的夹角,以度为单位:同向是 0 度,垂直是 90 度,反向是 180 度。它由上面那个余弦取反余弦得到,所以继承了它的范围,不可能算出这个区间以外的值
弧度
同一个角度的另一种写法:180 度是 π 弧度,90 度是它的一半,输出是一个不带单位的纯数。微积分里的公式和多数编程语言要的都是弧度,所以这一页两个都给,省得你自己去乘 π 再除以 180
度
主输出的单位,也是这一页唯一带单位的输出。余弦与弧度值都是纯数
四位小数
所有输出的显示宽度。余弦只有在少数几个取值上才是精确的(0、0.5、1、−1),夹角也只在余弦取到这几个值时精确,所以这一页上几乎每一行都带着四舍五入

当你真正想要的是那个角度、而不只是两个方向之间的关系时,用这一页。有三个角度不需要任何计算就值得认出来:余弦为 1 是 0 度、两向量同向,余弦为 0 是 90 度、两向量垂直,余弦为 −1 是 180 度、两向量反向。其余都是实打实的角度,页面给到四位小数。最常见的实际用法是拿一个方向对照一个基准:风偏离正北多少度、镜头转了多少度、实测方向相对应有方向漂了多少。已知两个方向的几何题是同一个计算,把两条直线各写成一个向量之后求它们的夹角也是。检查答案是否合理的办法是让余弦与夹角互相印证:余弦大于零必然对应小于 90 度的夹角,余弦为负对应大于 90 度,余弦为零对应正好 90 度,两者对不上就说明分量跟你以为的不一样。弧度这一栏是给「这个角马上要代进公式或代码」的场合准备的,那些地方几乎总是要弧度,而手工换算正是 180 倍与符号错误的来源。

算例

  1. 1 1 0 与 1 0 1

    1. 数量积:1 × 1 + 1 × 0 + 0 × 1 = 1
    2. u 的模:√(1 + 1 + 0)= √2 = 1.414214
    3. v 的模:√(1 + 0 + 1)= √2 = 1.414214
    4. 余弦:1 ÷ (1.414214 × 1.414214)= 1 ÷ 2 = 0.5
    5. 夹角:0.5 的反余弦是 60 度,也就是 60 × π ÷ 180 = 1.047198 弧度

    页面的默认输入,也是最干净的一档:余弦正好是二分之一,夹角正好是 60 度。注意数量积那个 1 在面板上哪儿都找不到——这一页印的是余弦与夹角,数量积是中间那一步。两个模都是根号二,相乘正好是 2,所以余弦与夹角都是精确值而不是四舍五入来的。

  2. 3 4 0 与 4 3 0

    1. 数量积:3 × 4 + 4 × 3 + 0 × 0 = 24
    2. 两者的模:√(9 + 16)= 5,第三个分量为零
    3. 余弦:24 ÷ (5 × 5)= 0.96
    4. 夹角:0.96 的反余弦是 16.2602 度,也就是 0.2838 弧度

    这一档说明余弦为什么值得印出来。0.96 听上去像两个几乎重合的向量,而夹角是 16.26 度——约六分之一个直角。余弦把 0 到 90 度这一整段挤进了 1 到 0 之间,而且挤得不均匀,所以把它当成某个比例来读一定会读错。这里两个模都正好是 5,又是 3-4-5 在干活。

  3. 1 0 与 0 1

    1. 数量积:1 × 0 + 0 × 1 = 0
    2. 两者的模:都是 1
    3. 余弦:0 ÷ 1 = 0
    4. 夹角:零的反余弦正好是 90 度,也就是 1.570796 弧度

    这一页最常被打开来查的答案,而且恰好是精确的那一档:余弦为零就是垂直,夹角返回的正好是 90 而不是四舍五入过的数。这两个向量是最朴素的垂直对子——一个沿 x 轴,一个沿 y 轴。弧度那一栏的 1.5708 就是 π ÷ 2。

  4. -1 0 0 与 1 0 0

    1. 数量积:(−1)× 1 + 0 × 0 + 0 × 0 = −1
    2. 两者的模:都是 1
    3. 余弦:−1 ÷ 1 = −1
    4. 夹角:−1 的反余弦正好是 180 度,也就是 3.141593 弧度

    范围另一头的那一档。余弦为 −1 就是两个向量能张出的最大角,180 度,弧度值是 π。方向正好相反的两个向量仍然是两个向量,它们之间的夹角不是零——当「算出 180 度」看着像出错时,该看的就是这一行。它没有错:相反是一种关系,跟平行一样是一种关系。

  5. 2 -3 与 4 5

    1. 数量积:2 × 4 + (−3)× 5 = 8 − 15 = −7
    2. u 的模:√(4 + 9)= √13 = 3.605551
    3. v 的模:√(16 + 25)= √41 = 6.403124
    4. 余弦:−7 ÷ (3.605551 × 6.403124)= −7 ÷ 23.086793 = −0.303201
    5. 夹角:−0.303201 的反余弦是 107.6501 度,也就是 1.8788 弧度

    钝角那一档,也是最容易让人愣一下的情形:两个向量的夹角可以大于 90 度,只要数量积为负就会。这里 u 有一个负分量,这就是「指向左或指向下」的写法。余弦 −0.3032 数值不大,但它的符号就是全部的信息——它说这两个向量朝着彼此相反的方向偏,而 107.6501 度与它是一致的。

局限

两个向量的分量个数必须相同,对不上时整页拒答,不会拿零补齐。零向量完全不受理:分量全为零的向量没有方向,它与任何东西的夹角都是未定义的,所以页面宁可整页拒答,也不给出一个会被读成「同向」的 0 度。分量按普通数字解析:逗号加空格是分量分隔,逗号后面不带空格时按小数点读(1,5 就是一点五),而千位分组会被直接拒收、不去猜——写 1500,不要写 1,500。每个向量最多 200 个分量,手写的用例远远用不到,但也够不上数据管线的规模。数量积本身不在输出里,这是有意的:它是算出夹角的那一步,把它当答案印出来的是另一页。四位小数是显示宽度而不是精度承诺,两个输出都是用未取整的模算出来的,所以把页面上印出来的数乘回去,未必能正好还原印出来的夹角。页面不知道分量是以什么为单位量出来的——输入是纯数,余弦与弧度值也是纯数,全页唯一带单位的地方是角度。

常见问题

分量该怎么写?
用空格隔开,或者用逗号加空格:1 1 0 与 1, 1, 0 都可以。夹在两位数字之间、后面不带空格的逗号会被读成小数点(1,5 就是一点五);而 1,500 这样的千位分组会被直接拒收、不去猜,所以写 1500。两个向量的分量个数必须一样,个数本身没有上限,只要两边一致即可——二维和三维是同一个页面。
印出来的余弦有什么用?
夹角是从它反解出来的,而在真正要紧的那三档上它比夹角好读得多:余弦为 1 表示两个向量同向,为 0 表示垂直,为 −1 表示反向。其余取值就是实打实的角度,页面会同时给出度与弧度。
怎么判断两个向量垂直?
它们的夹角余弦为零,页面会读成正好 90 度。这条判据用不到求夹角那一步的三角函数——它成立的充要条件就是数量积为零,而那只需要乘法。这一页之所以把余弦印出来,就是为了让直角这一档不必动手算也看得见。
夹角为什么不会超过 180 度?
因为夹角的余弦被限制在 −1 到 1 之间,而反余弦只返回 0 到 180 度之间的值。180 度就是两个向量正好反向的情形;两个方向之间不存在 200 度这样的角——200 度与 160 度说的是同一对箭头。
为什么给两个角度输出,度和弧度?
因为读者是两拨人。人读的是度;公式与编程语言几乎总是要弧度,而 180 度就是 π 弧度。两个都印出来,就没人需要自己去乘 π 再除以 180,而 180 倍的错误正是从那里来的。弧度值是不带单位的纯数。
为什么分量全为零的向量会被拒答?
因为零向量没有方向,它与任何东西的夹角都是未定义的。它的模是零,而余弦等于数量积除以两个模的乘积,算下去就是除以零。如果页面返回 0 度,那等于说它跟你的向量同向,而这是在为一个根本不存在的方向下断言。

参考资料

相关计算器