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

提高直线相交法(3D)的数值精度

  •  -1
  • Makogan  · 技术社区  · 6 年前

    我编码了以下线条相交方法:

    double LineLineIntersection(
        const Eigen::Vector3d& origin1,
        const Eigen::Vector3d& ray1,
        const Eigen::Vector3d& origin2,
        const Eigen::Vector3d& ray2)
    {
        if(abs((origin1 - origin2).norm() - 1.0) < 0.000001) return 0;
        auto n1 = (origin2 - origin1).cross(ray2);
        auto n2 = ray1.cross(ray2);
    
        // Use this to test whether the vectors point in the same or opposite directions
        auto n = n2.normalized();
        // If n2 is the 0 vector or if the cross products are not colinear, no solution exists
        if(n2.norm() < 0.00001 || abs(abs(n1.dot(n)) - n1.norm()) > 0.000001)
            return std::numeric_limits<double>::infinity();;
    
        return n1.dot(n) / n2.dot(n);
    }
    

    here

    这在技术上是可行的,但我遇到了很大的数值错误。例如,在我的一次测试中,我得到:

    The difference between i1.x() and Eigen::Vector3d(-0.581, 1.232, 0).x() is 0.0024061184231309873, which exceeds 0.001, where
    i1.x() evaluates to -0.58340611842313095,
    Eigen::Vector3d(-0.581, 1.232, 0).x() evaluates to -0.58099999999999996, and
    0.001 evaluates to 0.001.
    

    大于0.001的误差是巨大的。我该怎么做才能使方法更准确?

    这是 i1 -0.583406 1.23237 0 很抱歉以前没有包括在内。

    0 回复  |  直到 6 年前
        1
  •  1
  •   Geek1999    6 年前