空间四点确定球心坐标

19 篇文章 0 订阅

 球面拟合的公式推导:最小二乘法,matlab版本,可以很容易转化为C:

https://blog.csdn.net/hj199404182515/article/details/53462512?g_f=2000000393

 

 

不在同一平面上的四个点确定一个球C++:

 void getCircle3d(const cv::Point3d& point1, const cv::Point3d& point2,
    const cv::Point3d& point3, const cv::Point3d& point4, cv::Point3d& center, double &radius) {

    std::vector<double> p1 = { point1.x,point1.y,point1.z};
    std::vector<double> p2 = { point2.x,point2.y,point2.z };
    std::vector<double> p3 = { point3.x,point3.y,point3.z };
    std::vector<double> p4 = { point4.x,point4.y,point4.z };

    double a = p1[0] - p2[0], b = p1[1] - p2[1], c = p1[2] - p2[2];
    double a1 = p3[0] - p4[0], b1 = p3[1] - p4[1], c1 = p3[2] - p3[2];
    double a2 = p2[0] - p3[0], b2 = p2[1] - p3[1], c2 = p2[2] - p3[2];
    double D = a * b1*c2 + a2 * b*c1 + c * a1*b2 - (a2*b1*c + a1 * b*c2 + a * b2*c1);
    if (D == 0)
    {
        return;
    }

    double A = p1[0] * p1[0] - p2[0] * p2[0];
    double B = p1[1] * p1[1] - p2[1] * p2[1];
    double C = p1[2] * p1[2] - p2[2] * p2[2];
    double A1 = p3[0] * p3[0] - p4[0] * p4[0];
    double B1 = p3[1] * p3[1] - p4[1] * p4[1];
    double C1 = p3[2] * p3[2] - p4[2] * p4[2];
    double A2 = p2[0] * p2[0] - p3[0] * p3[0];
    double B2 = p2[1] * p2[1] - p3[1] * p3[1];
    double C2 = p2[2] * p2[2] - p3[2] * p3[2];
    double P = (A + B + C) / 2;
    double Q = (A1 + B1 + C1) / 2;
    double R = (A2 + B2 + C2) / 2;

    double Dx = P * b1*c2 + b * c1*R + c * Q*b2 - (c*b1*R + P * c1*b2 + Q * b*c2);
    double Dy = a * Q*c2 + P * c1*a2 + c * a1*R - (c*Q*a2 + a * c1*R + c2 * P*a1);
    double Dz = a * b1*R + b * Q*a2 + P * a1*b2 - (a2*b1*P + a * Q*b2 + R * b*a1);

    center.x = Dx / D;
    center.y = Dy / D;
    center.z = Dz / D;
    radius = sqrt((p1[0] - center.x)*(p1[0] - center.x) +
        (p1[1] - center.y)*(p1[1] - center.y) +
        (p1[2] - center.z)*(p1[2] - center.z));

}

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值