• 问题反馈可发送邮件到stubbornhuang@qq.com

  • 工资「喂饱肚子」,副业「养活灵魂」!

  • 感谢大家访问本站,希望本站的内容可以帮助到大家!

  • 在本站开通年度VIP,无限制下载本站资源和阅读本站文章

  • 本站由于前段时间遭受到大量临时和国外邮箱注册,所以对可注册的邮箱类型进行了限制!

  • 如果觉得本站的内容有帮助,可以考虑打赏博主哦!

  • 计算机图形学与计算几何经典必备书单整理,下载链接可参考:https://www.stubbornhuang.com/1256/

  • 本站会放置Google广告用于维持域名以及网站服务器费用。

  • 欢迎大家交换友链,可在https://www.stubbornhuang.com/申请友情链接进行友链交换申请!

计算几何 – 三维向量的点乘、叉乘的概念、几何意义以及如何使用C++计算

计算几何 发布于2023-07-28 阅读 4,162次 0次评论 0次点赞 本文共3086个字,阅读需要8分钟。

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

数学角度上,两个三维向量的点积是两个向量对应位置的值相乘然后相加,如下

\vec{a}\cdot\vec{b}=x_1x_2+y_1y_2+z_1z_2

几何角度上,两个三维向量的点积是两个向量的长度与它们夹角余弦的积,如下

\vec{a}\cdot\vec{b}=|\vec{a}|\begin{vmatrix}\vec{b}\end{vmatrix}\cos\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 根据三维向量点乘求解两个向量之间的夹角

可以根据以下公式求解两个向量之间的夹角

\theta=\arccos(\frac{\vec{a}\cdot\vec{b}}{|\vec{a}|\left|\vec{b}\right|})

其推导过程如下。

假设\vec{a}的终点为A(x_1,y_1,z_1)\vec{b}的终点为B(x_2,y_2,z_2),原点为O

\overrightarrow{AB}=(x_2-x_1,y_2-y_1,z_2-z_1)

\triangle OAB中,由余弦定理

\left|\overrightarrow{AB}\right|^2=|\vec{a}|^2+\left|\vec{b}\right|^2-2\left|\vec{a}\right|\left|\vec{b}\right|\cos\theta

使用距离公式进行处理,可得:

|\vec{a}|\begin{vmatrix}\vec{b}\end{vmatrix}\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}

去括号后合并

|\vec{a}|\begin{vmatrix}\vec{b}\end{vmatrix}\cos\theta=x_1x_2+y_1y_2+z_1z_2=\vec{a}\cdot\vec{b}

换位即可得上面求解夹角的公式。

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{a}\times\vec{b}=(y_1z_2-z_1y_2,z_1x_2-x_1z_2,x_1y_2-y_1x_2)

几何角度上,两个三维向量的叉乘计算如下

\vec{a}\times\vec{b}=|\vec{a}|\begin{vmatrix}\vec{b}\end{vmatrix}\sin\theta\vec{n}

其中,\vec{n}为垂直于\vec{a}\vec{b}所在平面的单位向量。

两个三维向量叉乘的结果是一个三维向量,并且该向量垂直于\vec{a}\vec{b}所构成的平面,也就是与\vec{a}\vec{b}都垂直,是\vec{a}\vec{b}所在平面的法线向量,其方向通过右手法则进行判断,如下图所示

计算几何 -  三维向量的点乘、叉乘的概念、几何意义以及如何使用C++计算-第0张图片

2.2 三维向量叉乘的几何意义

如果以向量\vec{a}与向量\vec{b}的边构成一个平行四边形,那么这两个向量外积的模长与这个平行四边形的面积相等。

计算几何 -  三维向量的点乘、叉乘的概念、几何意义以及如何使用C++计算-第1张图片

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

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

文章末尾
上一篇
资源分享 - Essential Math for AI - Next-Level Mathematics for Efficient and Successful AI Systems英文PDF下载
AI资源
下一篇
计算几何 - 求解三维平面法向量
计算几何
当前分类随机文章推荐

发表评论

您必须 [ 登录 ] 才能发表留言!

关注我们的公众号

微信公众号