球面拟合的公式推导:最小二乘法,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));
}