【C++】【初三知识我忘了。。】三维点最小二乘法拟合平面并求平面和轴的夹角

该博客介绍了如何使用最小二乘法来拟合三维点云数据以确定平面,并计算出平面的法向量。通过Eigen库实现C++代码,展示了从点集计算平面参数的过程,以及如何求解平面与坐标轴的夹角。此外,还提供了计算夹角的数学公式和弧度到角度转换的方法。
摘要由CSDN通过智能技术生成

三维点最小二乘法拟合平面

这里是用三维点拟合三维平面 网上的代码乱七八糟 这个应该是最小二乘法拟合三维平面的正确答案 输入的点的个数要三个或多于三个哈

    Eigen::Vector4d PlaneFitting(const std::vector<Eigen::Vector3d>& plane_pts)
    {
        Eigen::Vector3d center = Eigen::Vector3d::Zero();
        for (const auto& pt : plane_pts)
            center += pt;
        center /= plane_pts.size();

        Eigen::MatrixXd A(plane_pts.size(), 3);
        for (size_t i = 0; i < plane_pts.size(); i++)
        {
            A(i, 0) = plane_pts[i][0] - center[0];
            A(i, 1) = plane_pts[i][1] - center[1];
            A(i, 2) = plane_pts[i][2] - center[2];
        }

        Eigen::JacobiSVD<Eigen::MatrixXd> svd(A, Eigen::ComputeThinV);
        const float                       a = svd.matrixV()(0, 2);
        const float                       b = svd.matrixV()(1, 2);
        const float                       c = svd.matrixV()(2, 2);
        const float                       d = -(a * center[0] + b * center[1] + c * center[2]);
        return Eigen::Vector4d(a, b, c, d);
    }

求三维平面的法向量

A x + B y + C z + D = 0 Ax + By + Cz + D = 0 Ax+By+Cz+D=0
法向量为:
( A , B , C ) (A, B, C) (A,B,C)

求三维平面和xyz轴的夹角

平面的法向量和轴的夹角的余弦值等于平面和轴夹角的正弦值
xyz轴的方向向量分别为:
x : ( 1 , 0 , 0 ) x: (1, 0, 0) x:(1,0,0)
y : ( 0 , 1 , 0 ) y: (0, 1, 0) y:(0,1,0)
z : ( 0 , 0 , 1 ) z:(0, 0, 1) z:(0,0,1)
所以与x轴夹角为:
a r c s i n ( ( A , B , C ) ( 1 , 0 , 0 ) A 2 + B 2 + C 2 1 2 + 0 2 + 0 2 ) arcsin(\frac {(A, B, C)(1, 0, 0)}{\sqrt{A^2+B^2+C^2} \quad\sqrt{1^2+0^2+0^2} \quad}) arcsin(A2+B2+C2 12+02+02 (A,B,C)(1,0,0))
C++代码:
向量乘法等于对应项相乘最后求和

//开平方:
double result = sqrt(x);
//求arcsin:
double theta = asin(x)

得到的结果是弧度制
弧度制转角度:弧度乘以57.3

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铃灵狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值