点积应用-求两个向量夹角

本文详细介绍了如何使用点积来计算两个向量或两条直线之间的夹角,并通过具体的数学推导解释了背后的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 之前,由点积求两条直线的夹角,只知道会用,不知道原量,今天看计算机图形学,才知道其原量,待记录如下:

 

 点积最重要的应用时计算两个向量的夹角,或者两条直线的夹角。图给出了二维的情况,其中向量b和向量c与x轴的夹角分别为B,C,从基本三角函数可得:

   b = (|b| cosB, |b| sinB)

   c = (|c| cosC, |c| sinC)

   将上式代入点积等式,将它们的对应的分量相乘,再把结果相加,于是得到:

   b.c = |b| |c| cosB cosC + |b| |c| sinB sinC

  再次应用三角函数等式,得到

 b.c = |b| |c| cos(B-C)

 最终,对于任意两个向量b和c,我们有

b.c = |b| |c| cos(@),即con(@) = b.c / (|b| |c|)

注:@为b和c之间的夹角。

### 计算两个向量之间的夹角 为了计算两个向量间的夹角,可以采用的方式。对于给定的三个 \( p_1 \),\( p_2 \),和 \( p_3 \),要得到夹角 \( p_1p_2p_3 \) (以弧度为单位),需先向量 \( p_1p_2 \) 和 \( p_1p_3 \) 的分量[^1]。 #### 使用Eigen库实现C++代码示例 ```cpp #include <iostream> #include <Eigen/Dense> using namespace Eigen; double computeAngle(const Vector2d& v1, const Vector2d& v2){ double dotProduct = v1.dot(v2); double magnitudeV1 = v1.norm(); double magnitudeV2 = v2.norm(); // Calculate cosine of the angle using dot product formula. double cosTheta = dotProduct / (magnitudeV1 * magnitudeV2); // Ensure numerical stability before applying acos function. if(cosTheta > 1.0) cosTheta = 1.0; if(cosTheta < -1.0) cosTheta = -1.0; return std::acos(cosTheta); // Return theta in radians. } ``` 上述函数接收两个`Vector2d`类型的参数并返回它们间的角度(以弧度计)。这里通过调用Eigen库中的`.dot()`方法获取,并借助`.norm()`取得各向量模长。 #### 寻找具有相同夹角的新向量 假设已知一固定向量 \( V_a \) 及其与另一未知向量 \( V_b \) 形成的目标角度 θ 。那么可以通过旋转操作来构建满足条件的不同方向上的新向量- **二维平面内**:如果仅限于XY平面上,则可通过简单的极坐标转换获得新的终位置; - **三维空间中**:则可能涉及到绕特定轴线做一定角度的旋转变换矩阵应用到原始起上; 具体来说,在二维情况下,设原O(0,0), 给定A(x₁,y₁),欲构造B(x₂,y₂)使得∠AOB=θ ,可按如下方式定义x₂ ,y₂ : \[ x_{2} = r\cdot\cos(\alpha+\theta)\] \[ y_{2}=r\cdot\sin (\alpha +\theta )\] 其中α代表OA相对于X正半轴的方向角,而r即|OA|=sqrt((x₁)^2+(y₁)^2)[^5]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值