问题描述:已知三维空间中的三个点P1P_1P1​,P2P_2P2​和P3P_3P3​,求向量P1P2→\overrightarrow{P_1P_2}P1​P2​​和P1P3→\overrightarrow{P_1P_3}P1​P3​​之间的夹角,要求必须能够计算出[0, 2π\piπ)之间的数值,而不仅仅是只能求出锐角,并用C++或Python或MATLAB语言进行算法实现。

问题分析:为了求解出这个问题,首先需要引入三维向量的点乘和叉乘的知识。最后,根据点乘和叉乘推导出两个空间向量之间夹角的求解公式。
空间三维向量的叉乘:
C→=A→×B→\overrightarrow{C} = \overrightarrow{A} \times \overrightarrow{B}C=A×B,C→\overrightarrow{C}C也是一个空间三维向量,方向通过右手定则来判断,即一个垂直于向量 A→\overrightarrow{A}A和向量 B→\overrightarrow{B}B所在平面的向量。
(0)∣C→∣=∣A→×B→∣=∣A→∣∗∣B→∣∗sin(θ)|\overrightarrow{C}|=|\overrightarrow{A} \times \overrightarrow{B}|=|\overrightarrow{A} |*| \overrightarrow{B}|*sin(\theta) \tag{0} ∣C∣=∣A×B∣=∣A∣∗∣B∣∗sin(θ)(0)

向量A→∗B→\overrightarrow{A}*\overrightarrow{B}A∗B是一个数,它的大小是:
(1)A→∗B→=∣A→∣∗∣B→∣∗cos(θ)\overrightarrow{A}*\overrightarrow{B}=|\overrightarrow{A}|*|\overrightarrow{B}|*cos(\theta) \tag{1} A∗B=∣A∣∗∣B∣∗cos(θ)(1)
现在,将C→=A→×B→\overrightarrow{C}=\overrightarrow{A} \times \overrightarrow{B}C=A×B 和 C→\overrightarrow{C}C 代入上述公式(1),则有如下的表达式:
(2)C→∗C→=(A→×B→)∗C→=∣A→×B→∣∗∣C→∣∗cos(θ)\overrightarrow{C} * \overrightarrow{C}=(\overrightarrow{A} \times \overrightarrow{B}) * \overrightarrow{C}=|\overrightarrow{A} \times \overrightarrow{B}| * |\overrightarrow{C}| * cos(\theta) \tag{2} C∗C=(A×B)∗C=∣A×B∣∗∣C∣∗cos(θ)(2)
因此,有:
(3)cos(θ)=(A→×B→)∗C→∣A→×B→∣∗∣C→∣=cos(0)=1cos(\theta)=\frac{(\overrightarrow{A} \times \overrightarrow{B}) * \overrightarrow{C}}{|\overrightarrow{A} \times \overrightarrow{B}| * |\overrightarrow{C}|} = cos(0) = 1 \tag{3} cos(θ)=∣A×B∣∗∣C∣(A×B)∗C​=cos(0)=1(3)
注意:在公式(3)中,之所以为cos(θ)=cos(0)cos(\theta)=cos(0)cos(θ)=cos(0),因为A→×B→=C→\overrightarrow{A} \times \overrightarrow{B}=\overrightarrow{C}A×B=C。
由公式(3)结合公式(0),有:
(4)∣C→∣=∣A→×B→∣=(A→×B→)∗C→∣C→∣=(A→×B→)∗n→=∣A→∣∗∣B→∣∗sin(θ)|\overrightarrow{C}|=|\overrightarrow{A} \times \overrightarrow{B}|=\frac{(\overrightarrow{A} \times \overrightarrow{B}) * \overrightarrow{C}}{|\overrightarrow{C}|}=(\overrightarrow{A} \times \overrightarrow{B})*\overrightarrow{n}=|\overrightarrow{A}|*|\overrightarrow{B}|*sin(\theta) \tag{4} ∣C∣=∣A×B∣=∣C∣(A×B)∗C​=(A×B)∗n=∣A∣∗∣B∣∗sin(θ)(4)
注意:n→\overrightarrow{n}n是C→\overrightarrow{C}C的单位向量,即A→×B→\overrightarrow{A} \times \overrightarrow{B}A×B的单位法向量。
接下来,我们再来推导如何求解 θ\thetaθ 的公式:
综合公式(4)和公式(2),可得:
(5)θ=atan2(sin(θ),cos(θ))=atan2((A→×B→)∗n→,A→∗B→)=atan2((A→×B→).norm(),A→∗B→)\theta = atan2(sin(\theta), cos(\theta))=atan2((\overrightarrow{A} \times \overrightarrow{B})*\overrightarrow{n}, \overrightarrow{A}*\overrightarrow{B}) =atan2((\overrightarrow{A} \times \overrightarrow{B}).norm(), \overrightarrow{A}*\overrightarrow{B}) \tag{5} θ=atan2(sin(θ),cos(θ))=atan2((A×B)∗n,A∗B)=atan2((A×B).norm(),A∗B)(5)
但是,存在一个问题,即公式(5)返回的数值是一个范围在 0 到 π\piπ 之间的数值,而不是我们想要的 0 到 2π\piπ的数值,即存在旋转的方向问题,当旋转的角度超过 180∘180^{\circ}180∘ 时,就会就会计算出一个反向旋转的角度小于 180∘180^{\circ}180∘的角度值。为此,我们需要判断旋转的方向,即在向量叉乘的过程中得到的法向量的 zzz 值是正的还是负的。通过这个来判断法向量的方向问题,通常当法向量的 zzz 值如果是负的,那么需要通过 2π−θ2\pi-\theta2π−θ 来得到真实的旋转角度,此时得到的旋转角度是一个大于 π\piπ 的数值。


公式推导完毕之后,我们就可以通过C++编程来实现该求解算法。我们会使用到Eigen线性代数库,这是一个在数值计算和机器人以及计算机视觉、图像处理等领域非常重要的一个基础库,很多重量级的开源算法库都是在Eigen基础上构建的。Eigen也非常好用,甚至直接从官网下载源代码解压就可以用,因为这个库只有头文件,不需要编译源码,解压即安装。
CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
set(CMAKE_CXX_STANDARD 14)
project(Demo)
find_package(Eigen3 REQUIRED)
add_executable(${PROJECT_NAME} "main.cpp")

main.cpp

#include <iostream>
#include <Eigen/Dense>typedef Eigen::Vector3d Point;double getDegAngle(Point p1, Point p2, Point p3) {Eigen::Vector3d v1 = p2 - p1;Eigen::Vector3d v2 = p3 - p1;//one method, radian_angle belong to 0~pi//double radian_angle = atan2(v1.cross(v2).transpose() * (v1.cross(v2) / v1.cross(v2).norm()), v1.transpose() * v2);//another method, radian_angle belong to 0~pidouble radian_angle = atan2(v1.cross(v2).norm(), v1.transpose() * v2);if (v1.cross(v2).z() < 0) {radian_angle = 2 * M_PI - radian_angle;}return radian_angle * 180 / M_PI;
}int main() {//Point p1(0, 0, 0), p2(1, 0, 0), p3(0, -1, 0);//Point p1(0, 0, 0), p2(1, 0, 0), p3(0, 1, 0);//Point p1(0, 0, 0), p2(1, 0, 0), p3(0.5, 0.5, 0);Point p1(0, 0, 0), p2(1, 0, 0), p3(0.5, -0.5, 0);std::cout << "The Degree Angle is: " << getDegAngle(p1, p2, p3) << "\n";return 0;
}

测试结果:

The Degree Angle is: 270
The Degree Angle is: 90
The Degree Angle is: 45
The Degree Angle is: 315

求解三维空间中两向量之间的夹角相关推荐

  1. 两个向量之间的夹角公式_Python 计算任意两向量之间的夹角方法

    如图所示,我们要计算任意两个向量之间的夹角. (图中的坐标数字是估计值,随手给定) python代码如下 import math AB = [1,-3,5,-1] CD = [4,1,4.5,4.5] ...

  2. Python 计算任意两向量之间的夹角

    如图所示,我们要计算任意两个向量之间的夹角. (图中的坐标数字是估计值,随手给定) python代码如下 import math AB = [1,-3,5,-1] CD = [4,1,4.5,4.5] ...

  3. Python 求解向量夹角:如何计算两个向量之间的夹角?

    Python 求解向量夹角:如何计算两个向量之间的夹角? 向量夹角是计算机视觉和人工智能等多个领域中常用的数学概念,它可以用于判断两个向量之间的相似度和相关性.在 Python 程序中,我们可以使用 ...

  4. c++ 用 eigen与opencv计算两个向量的夹角,两个向量之间的夹角,向量的朝向

    计算两个向量的夹角,两个向量之间的夹角 eigen: #include "Eigen/Dense" #include "Eigen/Geometry" usin ...

  5. Python计算向量夹角代码:如何用代码计算两个向量之间的夹角?

    Python计算向量夹角代码:如何用代码计算两个向量之间的夹角? 向量夹角是指两个向量之间的夹角,通常用cosine来表示.在机器学习和数据科学领域,计算向量夹角是一个非常基本的概念.Python是一 ...

  6. 两个向量之间的夹角公式_关于平面向量夹角求参数取值范围的两种基本解法介绍...

    平面向量的夹角问题是考察高中向量知识掌握程度的常考内容,主要涉及到的知识点是平面向量的数量积公式.在这里介绍一道常见的平面向量题目,通过两种最基本的解法,来帮助同学们理解向量之间的夹角. 填空题第15 ...

  7. python 计算两个向量之间的夹角

    python 计算两个向量之间的夹角 使用python计算两个向量的夹角代码如下: import numpy as np def dot_product_angle(v1, v2):if np.lin ...

  8. 游戏中 ----三维空间中的 向量

    三维空间中的 向量: 1.向量相等: 几何中,有相同的方向 跟  长度 的向量 被规定为 相等.                      而 代数 上 我们 说有着相同的 维数 ,而在 各个方向上的 ...

  9. 向量叉乘求三维空间中两直线(或线段)的交点

    1.2D空间的直线相交 在二维空间中,利用两个直线方程y = kx + b我们可以直接计算出交点,但是这种方法麻烦了些,并且套用到三维空间用公式就更麻烦了,接下来介绍的是如何利用向量叉乘求出直线交点. ...

最新文章

  1. spark连接Oracle数据库,Spark通过jdbc采用分区的方式从oracle读数据
  2. parents()和parent()
  3. shlve模块 序列化 python任意的数据
  4. Android异步下载网络图片(其三:ExecutorService)
  5. 忙的连自己姓什么都不知道啦...
  6. tf.control_dependencies()函数用法
  7. java打出三角形乘法表_Java 练习(输出三角形,九九乘法表, 100以内的质数)
  8. 你真的知道 Python 字符串怎么用吗?
  9. 课设(房屋出租系统)
  10. Emmagee 不支持android7.0以上,社区努力中~
  11. HyperLynx(十八)DDR(一)DDR简介和DDR的数据仿真
  12. java web分层和层间数据传递 vo bo po
  13. 【2021-05-06】JS逆向之微店登入ua
  14. Nagios-config
  15. 智能硬件产品经理需要哪些技术基础?
  16. vue v-for 中 img图片渲染不出来的解决方法
  17. 使用ultraISO 制作多种系统的启动U盘和文件U盘
  18. Coursera-Internet_History
  19. Python基于CycleGAN&pix2pix的黑白图像AI上色(源码&部署教程)
  20. vega8显卡和mx250哪个好_集成Vega 8 GPU游戏性能出色,远超GeForce MX250

热门文章

  1. 搜狗浏览器默认皮肤无法修改问题
  2. 区块链存储优化——从MPT树到KV存储
  3. 前端 HTML5 Svg 画板(支持视频、图片上涂鸦,支持缩放、修改、颜色、复选...)
  4. python中的美元符号_Python学习笔模式匹配与正则表达式之插入字符和美元字符
  5. 教师资格证2023年报名时间来了!
  6. php正负数都转成正数,PHP将数组中负数全部变为正数的方法
  7. 欧几里得算法求解最大公因数详解
  8. studio one 3 机架声道设置_PotPlayer:最强电脑影音视频播放器 | 附基础设置和精美皮肤推荐...
  9. 计算机毕业设计-基于ssm的问卷调查管理系统
  10. jsp页面链接下载文件