详解向量的点积(dot product)

两个向量之间的点积(dot product),也称数量积和内积。向量 a ⃗ \vec{a} a 和向量 b ⃗ \vec{b} b 的点积表示为 a ⃗ ⋅ b ⃗ \vec{a} \cdot \vec{b} a ⋅b 。点积的结果都是一个标量,表示两个向量的相似程度。

点积的计算方法

点积有两种常见的计算方法,一种是使用向量的坐标分量进行计算,另一种是使用向量的长度和夹角进行计算。

坐标分量计算方法

点积的坐标分量计算方法是:将两个向量对应分量相乘,然后相加。对于两个三维向量 a ⃗ \vec{a} a 和 b ⃗ \vec{b} b :
a ⃗ ⋅ b ⃗ = A x ⋅ B x + A y ⋅ B y + A z ⋅ B z \vec{a} \cdot \vec{b} = A_x \cdot B_x + A_y \cdot B_y + A_z \cdot B_z a ⋅b =Ax⋅Bx+Ay⋅By+Az⋅Bz

其中, A x A_x Ax, A y A_y Ay, A z A_z Az 是向量 a ⃗ \vec{a} a 的分量, B x B_x Bx, B y B_y By, B z B_z Bz 是向量 b ⃗ \vec{b} b 的分量。

这种计算方法涉及到向量的坐标分量,适用于已知向量坐标分量的情况,可以直接按照公式进行计算。这是一种较为数学化的描述,它在考虑向量在各个坐标轴上的投影分量,并将它们相乘再相加,得到最终的结果。

几何意义

投影的概念是将一个向量投影到另一个向量上,得到在另一个向量方向上的投影分量。

向量的定义:即向量在某个方向上的投影分量等于该向量在该方向上的长度乘以该方向的单位向量。

在这里,我们考虑 a ⃗ \vec{a} a 在 X 轴上的投影。在 X 轴上,单位向量为 i ⃗ = ( 1 , 0 , 0 ) \vec{i}=(1,0,0) i =(1,0,0)。因此, a ⃗ \vec{a} a 在 X 轴上的投影分量可以表示为内积(点积):
在 X 轴上的投影分量 = a ⃗ ⋅ i ⃗ = A x ⋅ 1 + A y ⋅ 0 + A z ⋅ 0 = A x \begin{aligned} 在 X 轴上的投影分量 &= \vec{a} \cdot \vec{i} \\ &= A_x \cdot 1 + A_y \cdot 0 + A_z \cdot 0 \\ &= A_x \end{aligned} 在 X 轴上的投影分量=a ⋅i =Ax⋅1+Ay⋅0+Az⋅0=Ax

这个概念可以推广到 Y 轴和 Z 轴上的投影分量,其中单位向量分别为 j ⃗ = ( 0 , 1 , 0 ) \vec{j}=(0,1,0) j =(0,1,0) 和 k ⃗ = ( 0 , 0 , 1 ) \vec{k}=(0,0,1) k =(0,0,1)。
在 Y 轴上的投影分量 = a ⃗ ⋅ j ⃗ = A x ⋅ 0 + A y ⋅ 1 + A z ⋅ 0 = A y \begin{aligned} 在 Y 轴上的投影分量 &= \vec{a} \cdot \vec{j} \\ &= A_x \cdot 0 + A_y \cdot 1 + A_z \cdot 0 \\ &= A_y \\ \end{aligned} 在 Y 轴上的投影分量=a ⋅j =Ax⋅0+Ay⋅1+Az⋅0=Ay
在 Z 轴上的投影分量 = a ⃗ ⋅ k ⃗ = A x ⋅ 0 + A y ⋅ 0 + A z ⋅ 1 = A z \begin{aligned} 在 Z 轴上的投影分量 &= \vec{a} \cdot \vec{k} \\ &= A_x \cdot 0 + A_y \cdot 0 + A_z \cdot 1 \\ &= A_z \end{aligned} 在 Z 轴上的投影分量=a ⋅k =Ax⋅0+Ay⋅0+Az⋅1=Az

同理,向量 a ⃗ \vec{a} a 在向量 b ⃗ \vec{b} b 上的投影分量为
在 X 轴上的投影分量 = a ⃗ ⋅ i b ⃗ = a ⃗ ⋅ ( B x , 0 , 0 ) = A x ⋅ B x + A y ⋅ 0 + A z ⋅ 0 = A x ⋅ B x \begin{aligned} 在 X 轴上的投影分量 &= \vec{a} \cdot \vec{i_b} \\ &= \vec{a} \cdot (B_x, 0, 0) \\ &= A_x \cdot B_x + A_y \cdot 0 + A_z \cdot 0 \\ &= A_x \cdot B_x \\ \end{aligned} 在 X 轴上的投影分量=a ⋅ib =a ⋅(Bx,0,0)=Ax⋅Bx+Ay⋅0+Az⋅0=Ax⋅Bx
在 Y 轴上的投影分量 = a ⃗ ⋅ j b ⃗ = a ⃗ ⋅ ( 0 , B y , 0 ) = A x ⋅ 0 + A y ⋅ B y + A z ⋅ 0 = A y ⋅ B y \begin{aligned} 在 Y 轴上的投影分量 &= \vec{a} \cdot \vec{j_b} \\ &= \vec{a} \cdot (0, B_y, 0) \\ &= A_x \cdot 0 + A_y \cdot B_y + A_z \cdot 0 \\ &= A_y \cdot B_y \\ \end{aligned} 在 Y 轴上的投影分量=a ⋅jb =a ⋅(0,By,0)=Ax⋅0+Ay⋅By+Az⋅0=Ay⋅By
在 Z 轴上的投影分量 = a ⃗ ⋅ k b ⃗ = a ⃗ ⋅ ( 0 , 0 , B z ) = A x ⋅ 0 + A y ⋅ 0 + A z ⋅ B z = A z ⋅ B z \begin{aligned} 在 Z 轴上的投影分量 &= \vec{a} \cdot \vec{k_b} \\ &= \vec{a} \cdot (0, 0, B_z) \\ &= A_x \cdot 0 + A_y \cdot 0 + A_z \cdot B_z \\ &= A_z \cdot B_z \end{aligned} 在 Z 轴上的投影分量=a ⋅kb =a ⋅(0,0,Bz)=Ax⋅0+Ay⋅0+Az⋅Bz=Az⋅Bz

所以, a ⃗ \vec{a} a 在向量 b ⃗ \vec{b} b 方向上的投影分量为:

  1. 在 X 轴上的投影分量: 向量 a ⃗ \vec{a} a 在 X 轴上在向量 b ⃗ \vec{b} b 方向上的投影分量为 A x ⋅ B x A_x \cdot B_x Ax⋅Bx。这是通过将向量 a ⃗ \vec{a} a 在 X 轴上的长度乘以向量 b ⃗ \vec{b} b 在 X 轴上的长度得到的。
  2. 在 Y 轴上的投影分量: 向量 a ⃗ \vec{a} a 在 Y 轴上在向量 b ⃗ \vec{b} b 方向上的投影分量为 A y ⋅ B y A_y \cdot B_y Ay⋅By。这是通过将向量 a ⃗ \vec{a} a 在 Y 轴上的长度乘以向量 b ⃗ \vec{b} b 在 Y 轴上的长度得到的。
  3. 在 Z 轴上的投影分量: 向量 a ⃗ \vec{a} a 在 Z 轴上在向量 b ⃗ \vec{b} b 方向上的投影分量为 A z ⋅ B z A_z \cdot B_z Az⋅Bz。这是通过将向量 a ⃗ \vec{a} a 在 Z 轴上的长度乘以向量 b ⃗ \vec{b} b 在 Z 轴上的长度得到的。

最后,将这些投影分量相加,得到的结果就是两个向量在各个坐标轴上的投影分量的总和,即点积的值。它描述了两个向量之间的相似程度。

长度和夹角计算方法

点积还可以通过向量的长度和夹角来计算,计算公式为:

a ⃗ ⋅ b ⃗ = ∣ a ⃗ ∣ ⋅ ∣ b ⃗ ∣ ⋅ c o s ( θ ) \vec{a} \cdot \vec{b}= |\vec{a}| \cdot |\vec{b}| \cdot cos(\theta) a ⋅b =∣a ∣⋅∣b ∣⋅cos(θ)

其中: ∣ a ⃗ ∣ |\vec{a}| ∣a ∣ 和 ∣ b ⃗ ∣ |\vec{b}| ∣b ∣ 分别是向量 a ⃗ \vec{a} a 和 b ⃗ \vec{b} b 的长度, θ \theta θ 是向量 a ⃗ \vec{a} a 和向量 b ⃗ \vec{b} b 之间的夹角。

这种计算方法适用于已知向量的长度和夹角的情况,可以使用向量的长度和夹角的三角函数(余弦)关系来计算点积。

几何意义

a ⃗ \vec a a 终点为 A ( x 1 , y 1 , z 1 ) A(x_1,y_1,z_1) A(x1,y1,z1), b ⃗ \vec b b 的终点为 B ( x 2 , y 2 , z 2 ) B(x_2,y_2,z_2) B(x2,y2,z2),原点为 O O O,则 A B ⃗ = ( x 2 − x 1 , y 2 − y 1 , z 2 − z 1 ) \vec {AB}=(x_2-x_1,y_2-y_1,z_2-z_1) AB =(x2−x1,y2−y1,z2−z1)

△ O A B \triangle{OAB} △OAB 中,由余弦定理得:
∣ A B ⃗ ∣ 2 = ∣ a ⃗ ∣ 2 + ∣ b ⃗ ∣ 2 − 2 ∣ a ⃗ ∣ ∣ b ⃗ ∣ cos ⁡ θ \left |\vec {AB}\right |^2=\left |\vec a \right |^2+\left |\vec b \right |^2-2\left |\vec a \right |\left |\vec b \right |\cos\theta AB 2=∣a ∣2+ b 2−2∣a ∣ b cosθ

使用距离公式进行处理,可得:
∣ a ⃗ ∣ ∣ b ⃗ ∣ cos ⁡ θ = x 1 2 + y 1 2 + z 1 2 + x 2 2 + y 2 2 + z 2 2 − ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 + ( z 2 − z 1 ) 2 2 \left |\vec a \right |\left |\vec b \right |\cos\theta=\frac {x_1^2+y_1^2+z_1^2+x_2^2+y_2^2+z_2^2-(x_2-x_1)\^2+(y_2-y_1)\^2+(z_2-z_1)\^2}{2} ∣a ∣ b cosθ=2x12+y12+z12+x22+y22+z22−(x2−x1)2+(y2−y1)2+(z2−z1)2

去括号后合并,可得:
∣ a ⃗ ∣ ∣ b ⃗ ∣ cos ⁡ θ = x 1 x 2 + y 1 y 2 + z 1 z 2 = a ⃗ ⋅ b ⃗ \left |\vec a \right |\left |\vec b \right |\cos\theta=x_1x_2+y_1y_2+z_1z_2=\vec a\cdot \vec b ∣a ∣ b cosθ=x1x2+y1y2+z1z2=a ⋅b

根据上面的公式可计算 a ⃗ \vec a a 与 b ⃗ \vec b b 之间的夹角: θ = arccos ⁡ ( a ⃗ ⋅ b ⃗ ∣ a ⃗ ∣ ∣ b ⃗ ∣ ) \theta=\arccos (\frac {\vec a\cdot\vec b} {\left |\vec a \right |\left |\vec b \right |}) θ=arccos(∣a ∣∣b ∣a ⋅b )

无论使用哪种方法,点积的结果都是一个标量,表示两个向量的相似程度。

证明一致性

现在我们来证明这两种计算方法的一致性,即证明上述两个表达式是等价的。我们可以使用向量的定义以及三角函数的关系:

首先,两个向量的夹角余弦值可以表示为:

c o s ( θ ) = A ⋅ B ∣ A ∣ ⋅ ∣ B ∣ cos(\theta) = \frac{A \cdot B }{|A| \cdot |B|} cos(θ)=∣A∣⋅∣B∣A⋅B

将坐标分量计算的点积公式代入,得到:

c o s ( θ ) = A x ⋅ B x + A y ⋅ B y + A z ⋅ B z A x 2 + A y 2 + A z 2 ⋅ B x 2 + B y 2 + B z 2 cos(θ) = \frac{A_x \cdot B_x + A_y \cdot B_y + A_z \cdot B_z}{\sqrt{{A_x}^2 + {A_y}^2+ {A_z}^2} \cdot \sqrt{{B_x}^2 + {B_y}^2 + {B_z}^2}} cos(θ)=Ax2+Ay2+Az2 ⋅Bx2+By2+Bz2 Ax⋅Bx+Ay⋅By+Az⋅Bz

通过化简,可以证明上述等式成立。这就证明了两种计算方法得到的点积是一致的。

总体来说,两种计算方法从不同的角度描述了向量之间的关系,但它们最终得到的结果是相同的,这是因为它们实际上描述的是同一个几何关系。

点积的意义

点积的几何意义:

  1. 夹角和正交性:点积的值可以用来判断两个向量的相似性,例如:

    • 如果两个向量的点积为零,意味着它们是正交的(垂直),因为它们之间的夹角为90度。
    • 如果点积为正,表示两个向量之间的夹角小于90度,它们趋向于同一方向。
    • 如果点积为负,表示两个向量之间的夹角大于90度,它们趋向于相反的方向。
  2. 投影 :点积可以用来计算一个向量在另一个向量方向上的投影。具体而言,两个向量 a ⃗ \vec{a} a 和 b ⃗ \vec{b} b 的点积除以向量 b ⃗ \vec{b} b 的长度,得到的结果就是 a ⃗ \vec{a} a 在 b ⃗ \vec{b} b 方向上的投影的长度。

  3. 向量长度和夹角关系:点积的公式中包含向量的长度,因此可以用点积来推导夹角的余弦值。

Three.js 中的点积

在Three.js中,Vector3dot方法计算的是两个向量之间的点积(dot product),示例代码如下:

javascript 复制代码
var vectorA = new THREE.Vector3(2, 3, 4);
var vectorB = new THREE.Vector3(1, 0, -1);

var dotProduct = vectorA.dot(vectorB);
// 输出点积的结果
console.log("Dot Product:", dotProduct);

参考

相关推荐
夜焱辰8 小时前
浏览器端 Agent 的文件版本管理:不用 Git,基于 OPFS + SQLite 自己造了一个
前端·人工智能
梦想的颜色8 小时前
TypeScript 完全指南(下):从类型体操到生产级配置
前端·javascript·typescript
Hi~晴天大圣9 小时前
npm使用介绍
前端·npm·node.js
888CC++10 小时前
如何在 C 语言中进行程序调试?
前端·javascript·算法
喵个咪10 小时前
基于 Taro 的 Headless CMS 多端前端架构:技术解析与二次开发导引
前端·react.js·taro
狂炫冰美式10 小时前
你还在古法PPT吗,试试HTML呢?免费编辑导出工具给 xdm 放这了
前端·后端·github
万少11 小时前
未来组织的分水岭不是员工数量,而是人才密度
前端·后端·面试
任磊abc11 小时前
nextjs16配置eslint+prettier
前端·eslint·nextjs·prettier
x***r15111 小时前
Another-Redis-Desktop-Manager.1.3.7安装步骤详解(附Redis可视化连接与Key管理教程)
前端·bootstrap·html
Captaincc11 小时前
你真的知道自己把 AI 用在了哪里吗?这是 Vibe Usage 想回答的问题
前端·vibecoding