【愚公系列】2023年08月 3D数学-点积


前言

点积,也叫内积,是向量运算中的一种。对于两个 n n n 维向量 a ⃗ = ( a 1 , a 2 , … , a n ) \vec{a}=(a_1,a_2,\dots,a_n) a =(a1,a2,,an) b ⃗ = ( b 1 , b 2 , … , b n ) \vec{b}=(b_1,b_2,\dots,b_n) b =(b1,b2,,bn),其点积可以表示为:

a ⃗ ⋅ b ⃗ = ∑ i = 1 n a i b i = a 1 b 1 + a 2 b 2 + ⋯ + a n b n \vec{a}\cdot\vec{b}=\sum_{i=1}^na_ib_i=a_1b_1+a_2b_2+\cdots+a_nb_n a b =i=1naibi=a1b1+a2b2++anbn

点积的本质是将两个向量投影在彼此上的结果相加。点积的值可以告诉我们两个向量的夹角的大小和它们在同一个方向上的程度。如果两个向量的点积为 0 0 0,则它们是正交的(即,它们垂直于彼此)。点积还可以用来计算向量的模长和计算两个向量之间的距离。

一、点积

1.推导过程

假设有两个向量 a ⃗ = ( a 1 , a 2 , a 3 ) \vec{a}=(a_1,a_2,a_3) a =(a1,a2,a3) b ⃗ = ( b 1 , b 2 , b 3 ) \vec{b}=(b_1,b_2,b_3) b =(b1,b2,b3),它们的点积定义为:

a ⃗ ⋅ b ⃗ = a 1 b 1 + a 2 b 2 + a 3 b 3 \vec{a}\cdot\vec{b}=a_1b_1+a_2b_2+a_3b_3 a b =a1b1+a2b2+a3b3

点积也可以写成矩阵乘法的形式,即:

a ⃗ ⋅ b ⃗ = ( a 1 a 2 a 3 ) ( b 1 b 2 b 3 ) \vec{a}\cdot\vec{b}=\begin{pmatrix}a_1&a_2&a_3\end{pmatrix}\begin{pmatrix}b_1\\b_2\\b_3\end{pmatrix} a b =(a1a2a3) b1b2b3

下面通过矩阵乘法的性质来推导点积的式子。

首先,矩阵乘法的分配律告诉我们:

( a 1 a 2 a 3 ) ( b 1 b 2 b 3 ) = a 1 ( b 1 b 2 b 3 ) + a 2 ( b 1 b 2 b 3 ) + a 3 ( b 1 b 2 b 3 ) \begin{pmatrix}a_1&a_2&a_3\end{pmatrix}\begin{pmatrix}b_1\\b_2\\b_3\end{pmatrix}=a_1\begin{pmatrix}b_1\\b_2\\b_3\end{pmatrix}+a_2\begin{pmatrix}b_1\\b_2\\b_3\end{pmatrix}+a_3\begin{pmatrix}b_1\\b_2\\b_3\end{pmatrix} (a1a2a3) b1b2b3 =a1 b1b2b3 +a2 b1b2b3 +a3 b1b2b3

展开上式,得到:

( a 1 b 1 a 1 b 2 a 1 b 3 ) + ( a 2 b 1 a 2 b 2 a 2 b 3 ) + ( a 3 b 1 a 3 b 2 a 3 b 3 ) \begin{pmatrix}a_1b_1\\a_1b_2\\a_1b_3\end{pmatrix}+\begin{pmatrix}a_2b_1\\a_2b_2\\a_2b_3\end{pmatrix}+\begin{pmatrix}a_3b_1\\a_3b_2\\a_3b_3\end{pmatrix} a1b1a1b2a1b3 + a2b1a2b2a2b3 + a3b1a3b2a3b3

接着,矩阵乘法的结合律告诉我们:

( a 1 b 1 + a 2 b 2 + a 3 b 3 ) = ( a 1 a 2 a 3 ) ( b 1 b 2 b 3 ) (a_1b_1+a_2b_2+a_3b_3)=\begin{pmatrix}a_1&a_2&a_3\end{pmatrix}\begin{pmatrix}b_1\\b_2\\b_3\end{pmatrix} (a1b1+a2b2+a3b3)=(a1a2a3) b1b2b3

因此,点积的式子 a ⃗ ⋅ b ⃗ = a 1 b 1 + a 2 b 2 + a 3 b 3 \vec{a}\cdot\vec{b}=a_1b_1+a_2b_2+a_3b_3 a b =a1b1+a2b2+a3b3 得到了证明。

2.应用场景

点积应用场景比较广泛,以下是一些典型的应用场景:

  1. 计算两个向量之间的夹角。由于两个向量的点积公式为:A·B = |A| × |B| × cosθ,可以通过求解余弦值来计算向量的夹角。

  2. 计算向量在某个方向上的投影。对于给定的向量A和单位向量u,向量A在u方向上的投影为:proj_u A = (A·u) u。

  3. 判断两个向量是否垂直。当两个向量A和B垂直时,它们的点积为0;若不为0,则表示它们不垂直。

  4. 计算向量的长度(模)。由于一个向量的长度为:|A| = √(A·A),因此可以通过点积公式来计算向量的长度。

  5. 判断向量的方向。当两个向量A和B夹角小于180度时,它们的点积为正;而当它们夹角大于180度时,点积为负,因此可以通过点积的正负来判断向量的方向。

  6. 在计算机图形学中,点积还常用于计算颜色、光照、阴影等效果。

3.案例

以下是几个点积的相关案例:

  1. 计算工作:

假设有一个力F和一个位移向量d,它们的点积可以用来计算力沿着位移向量的功(即工作)。用以下公式可以计算:W = F · d。

例如,如果一个力是10 N,一个物体向右移动5米,则力沿着物体移动的工作为50焦耳。

  1. 判断两个向量是否垂直:

向量A和向量B垂直,当且仅当它们的点积为零,即A·B=0。例如,如果A = (1, 2, -3)和B = (-2, 1, 2),则它们不是垂直的,因为它们的点积为-4。

  1. 计算投影:

向量A在另一个向量B上的投影可以用点积来计算,如下所示:projB(A) = (A·B / ||B||²) · B,其中projB(A)表示A在B上的投影,||B||表示向量B的长度。

例如,如果A = (2, 4, 6)和B = (1, 0, 0),则A在B上的投影为projB(A) = (2, 0, 0)。

  1. 计算夹角:

两个向量之间的夹角可以用点积来计算,如下所示:cosθ = A·B / (||A|| ||B||),其中θ是夹角,||A||和||B||分别是向量A和向量B的长度。

例如,如果A = (1, 2, 3)和B = (2, -1, 2),则它们之间的夹角为cosθ = (1×2 + 2×(-1) + 3×2) / (√(1² + 2² + 3²) × √(2² + (-1)² + 2²)) = 0.612。

这些案例展示了点积的实际应用。

二、点积函数封装

点积函数是指对两个向量进行内积运算,输出一个标量。可以使用如下的代码实现:

def dot_product(v1, v2):
    """
    计算两个向量的点积
    :param v1: 第一个向量,列表类型
    :param v2: 第二个向量,列表类型
    :return: 两个向量的点积,标量类型
    """
    if len(v1) != len(v2):
        raise ValueError("向量长度不一致")
    return sum([i*j for i,j in zip(v1,v2)])

该函数首先判断两个向量的长度是否一致,如果不一致,会抛出ValueError异常。然后使用zip函数对两个向量进行对应元素的相乘,并使用sum函数对所有元素相加。最终输出点积结果。

使用该函数的示例:

vector1 = [1, 2, 3]
vector2 = [4, 5, 6]
dot_product_res = dot_product(vector1, vector2)
print(dot_product_res) # 输出 32

猜你喜欢

转载自blog.csdn.net/aa2528877987/article/details/132418529