1 三维向量点乘
1.1 三维向量点乘的概念
两个三维向量的点乘又称为点积、数量积或者标量积(Scalar Product)。
假设三维空间中有两个三维向量:\vec{a}=(x_1,y_1,z_1),\vec{b}=(x_2,y_2,z_2),\vec{a}和\vec{b}之间的夹角为\theta。
数学角度上,两个三维向量的点积是两个向量对应位置的值相乘然后相加,如下
几何角度上,两个三维向量的点积是两个向量的长度与它们夹角余弦的积,如下
1.2 三维向量点乘的几何意义
三维向量的点积表示向量\vec{a}在向量\vec{b}方向上的投影与\left|\vec{b}\right|的乘积,反应两个向量在方向上的相似度,结果越大越相似。
通过三维向量点乘结果可以判断两个向量是否同向、垂直,比如
(1)\vec{a}\cdot\vec{b}>0,点乘结果大于0,则表示两个向量方向基本相同,两个向量的夹角在\text{0°}和\text{90°}之间
(2)\vec{a}\cdot\vec{b}=0,点乘结果等于0,则表示两个向量正交,相互垂直
(3)\vec{a}\cdot\vec{b}<0,点乘结果小于0,则表示两个向量方向基本相反,两个向量的夹角在\text{90°}和\text{180°}之间
1.3 根据三维向量点乘求解两个向量之间的夹角
可以根据以下公式求解两个向量之间的夹角
其推导过程如下。
假设\vec{a}的终点为A(x_1,y_1,z_1),\vec{b}的终点为B(x_2,y_2,z_2),原点为O。
则
在\triangle OAB中,由余弦定理
使用距离公式进行处理,可得:
去括号后合并
换位即可得上面求解夹角的公式。
1.4 使用C++计算两个三维向量的点乘
示例代码如下
#include <iostream>
struct Point3f
{
float x;
float y;
float z;
Point3f()
{
x = 0.0;
y = 0.0;
z = 0.0;
}
Point3f(float x_in, float y_in, float z_in)
{
x = x_in;
y = y_in;
z = z_in;
}
};
typedef Point3f Vector3f;
// 计算两个三维向量的点积
float DotProduct(Vector3f u, Vector3f v)
{
return u.x * v.x + u.y * v.y + u.z * v.z;
}
int main()
{
Vector3f vector_a(1.0, 2.0, 3.0);
Vector3f vector_b(4.0, 5.0, 6.0);
float dot_product_res = DotProduct(vector_a, vector_b);
std::cout << "向量点乘 = " << dot_product_res << std::endl;
return 0;
}
2 三维向量叉乘
2.1 三维向量叉乘的概念
两个三维向量的叉乘又称为外积、向量积。
假设三维空间中有两个三维向量:\vec{a}=(x_1,y_1,z_1),\vec{b}=(x_2,y_2,z_2),\vec{a}和\vec{b}之间的夹角为\theta。
数学角度上,两个三维向量的叉乘计算如下
几何角度上,两个三维向量的叉乘计算如下
其中,\vec{n}为垂直于\vec{a}与\vec{b}所在平面的单位向量。
两个三维向量叉乘的结果是一个三维向量,并且该向量垂直于\vec{a}与\vec{b}所构成的平面,也就是与\vec{a}与\vec{b}都垂直,是\vec{a}与\vec{b}所在平面的法线向量,其方向通过右手法则进行判断,如下图所示
2.2 三维向量叉乘的几何意义
如果以向量\vec{a}与向量\vec{b}的边构成一个平行四边形,那么这两个向量外积的模长与这个平行四边形的面积相等。
2.3 使用C++计算两个三维向量的叉乘
示例代码如下
#include <iostream>
struct Point3f
{
float x;
float y;
float z;
Point3f()
{
x = 0.0;
y = 0.0;
z = 0.0;
}
Point3f(float x_in, float y_in, float z_in)
{
x = x_in;
y = y_in;
z = z_in;
}
};
typedef Point3f Vector3f;
// 计算两个三维向量的叉积
Vector3f CrossProduct(Vector3f u, Vector3f v) {
Vector3f retult;
retult.x = u.y * v.z - v.y * u.z;
retult.y = u.z * v.x - u.x * v.z;
retult.z = u.x * v.y - u.y * v.x;
return retult;
}
int main()
{
Vector3f vector_a(1.0, 2.0, 3.0);
Vector3f vector_b(4.0, 5.0, 6.0);
Vector3f cross_product_res = CrossProduct(vector_a, vector_b);
std::cout << "向量叉乘 = " << cross_product_res.x << "," << cross_product_res.y << "," << cross_product_res.z << std::endl;
return 0;
}
参考链接
本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:计算几何 – 三维向量的点乘、叉乘的概念、几何意义以及如何使用C++计算
原文链接:https://www.stubbornhuang.com/2736/
发布于:2023年07月28日 11:06:33
修改于:2023年08月03日 16:44:10
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论
52