【问题标题】:Eigen, dot product method:特征点积法:
【发布时间】:2018-09-26 22:27:47
【问题描述】:

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

假名是:

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

【问题讨论】:

标签: c++ eigen


【解决方案1】:

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 了解更多信息。

【讨论】:

  • 谢谢。最后一件事,我怎样才能得到两个Eigen::Vector3f 的点积? dot(c_minus_a_normalized, b_minus_a_normalized)?
  • 我错过了这一点,显然,std::dot 不起作用,我用正确的方式编辑了我的答案:c_minus_a_normalized.dot(b_minus_a_normalized)。请注意,如果您打开 Eigen 快速参考链接并搜索 dot ... 您会在 2 分钟内找到解决方案 ;-)...
  • 我刚刚找到它并在您回答时点击返回!抱歉,非常感谢!
  • #include <Eigen/Geometry> vec3 = vec1.cross(vec2);
  • 所以 :Eigen::Vector3f axis0 = ((c - a).cross(b - a)).normalized();
猜你喜欢
  • 1970-01-01
  • 2020-11-08
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 2020-07-23
  • 2016-12-14
相关资源
最近更新 更多