代码实践求解三维空间向量的夹角

#include <iostream>
#include <Eigen/Dense>

using namespace std;

int main() {

    Eigen::Vector3d v1(2, 4, 7), v2(7, 8, 9);


    cout << "dot: " << v1.dot(v2) << endl;
    // https://blog.csdn.net/dcrmg/article/details/52416832
    // 点乘的几何意义: 点乘的几何意义是可以用来表征或计算两个向量之间的夹角,以及在b向量在a向量方向上的投影
    // 点乘的计算方法: 2*7+4*8+7*9=14+32+63=109
    // a.b = |a|*|b|cos角度 = 109


    cout << "cross:\n" << v1.cross(v2) << endl;
    cout << "cross transpose: " << v1.cross(v2).transpose() << endl;
    // https://blog.csdn.net/dcrmg/article/details/52416832
    // 叉乘的几何意义: 在三维几何中,向量a和向量b的叉乘结果是一个向量,更为熟知的叫法是法向量,该向量垂直于a和b向量构成的平面。
    // 叉乘的计算方法: (y1z2-y2z1, -(x1z2-x2z1), x1y2-x2y1)=(4*9-8*7, -(2*9-7*7), 2*9-7*4)=(-20, 31, -12)


    cout << "norm: " << v1.cross(v2).norm() << endl;
    // https://blog.csdn.net/m0_56348460/article/details/117386857
    // 向量的二范数: 欧几里得范数 常用计算向量长度 即向量元素绝对值的平方和再开方
    // 开平方(-20*-20 + 31*31 + -12*-12) = 38.7943
    // 0范数,向量中非零元素的个数。
    // 1范数,为绝对值之和。
    // 2范数,就是通常意义上的模。
    // 无穷范数,就是取向量的最大值。


    cout << "v1:\n" << v1 << endl;
    cout << "v2:\n" << v2 << endl;
    cout << "v1.transpose(): " << v1.transpose() << endl;
    cout << "v1.transpose() * v2: " << v1.transpose() * v2 << endl;


    double angle = atan2(v1.cross(v2).norm(), v1.transpose() * v2);
    // https://blog.csdn.net/KYJL888/article/details/106121978
    // https://www.cnblogs.com/yabin/p/6442922.html
    // 指向(y, x)的射线在坐标平面上与x轴正方向之间的角的角度度。
    // 三维空间中两个向量会有一条公垂线(向量叉乘可以求得),
    // 以公垂线为轴,将第二个向量旋转一个角度,使其与第一个向量平行.这个角度即为两向量的夹角.
    std::cout << "angle: " << angle * 180 / M_PI << "\n";
    return 0;
}

上一篇:php mysql搜索脚本,如何使匹配结果变为粗体


下一篇:拓端tecdat|R语言矩阵特征值分解(谱分解)和奇异值分解(SVD)特征向量分析有价证券数据