代码之家  ›  专栏  ›  技术社区  ›  anti

本征点积法:

  •  0
  • anti  · 技术社区  · 6 年前

    我正在将一些psuedo代码转换成实际的c++。

    psuedo是:

    float ac_ab_0 = acos(clamp(dot(
            normalize(c - a),
            normalize(b - a)), -1, 1));
    

    我的代码是:

    Eigen::Vector3f a = Eigen::Vector3f(0, 0, 0);
    Eigen::Vector3f b = Eigen::Vector3f(0, -5.579, -6.747);
    Eigen::Vector3f c = Eigen::Vector3f(0, -13.637, -9.751);
    

    我正在尝试:

    float ac_ab_0 = acos(std::clamp(std::dot(
            normalize(c - a),
            normalize(b - a)), -1, 1));
    

    但我被困住了。这条线应该是什么: normalize(c - a) 看起来像 Eigen::Vector3f ?

    1 回复  |  直到 6 年前
        1
  •  5
  •   VB_overflow    6 年前

    Eigen::Vector3f 有一个 normalized() 方法返回向量的规范化副本。

    所以你可以这样做:

    Eigen::Vector3f c_minus_a_normalized = (c - a).normalized();
    Eigen::Vector3f b_minus_a_normalized = (b - a).normalized();
    
    float ac_ab_0 = acos(std::clamp(c_minus_a_normalized.dot(b_minus_a_normalized), -1.f, 1.f));
    

    你应该检查一下 Eigen quick reference 更多信息。