已知三点求圆的中心坐标,用c++
时间: 2024-02-27 13:51:34 浏览: 30
下面是用 C++ 实现已知三点求圆的中心坐标和半径的代码,其中使用了高斯消元法求解线性方程组:
```c++
#include <iostream>
#include <cmath>
using namespace std;
const double eps = 1e-8;
struct Point {
double x, y;
};
Point p1, p2, p3;
double A[3][4]; // 线性方程组的系数矩阵
double X[3]; // 线性方程组的解向量
// 高斯消元法求解线性方程组
bool Gauss() {
for (int i = 0; i < 3; i++) {
// 找到一行中绝对值最大的元素所在的行
int r = i;
for (int j = i + 1; j < 3; j++) {
if (fabs(A[j][i]) > fabs(A[r][i])) {
r = j;
}
}
if (fabs(A[r][i]) < eps) {
// 系数矩阵中该列所有元素都是 0,无唯一解
return false;
}
if (r != i) {
// 将第 r 行与第 i 行交换
for (int j = i; j <= 3; j++) {
swap(A[i][j], A[r][j]);
}
}
// 消元
for (int j = i + 1; j < 3; j++) {
double f = A[j][i] / A[i][i];
for (int k = i + 1; k <= 3; k++) {
A[j][k] -= f * A[i][k];
}
}
}
// 回带求解
for (int i = 2; i >= 0; i--) {
for (int j = i + 1; j < 3; j++) {
A[i][3] -= A[i][j] * X[j];
}
if (fabs(A[i][i]) < eps) {
// 系数矩阵中该列所有元素都是 0,无唯一解
return false;
}
X[i] = A[i][3] / A[i][i];
}
return true;
}
int main() {
cout << "请输入三个点的坐标:" << endl;
cin >> p1.x >> p1.y >> p2.x >> p2.y >> p3.x >> p3.y;
// 构造系数矩阵
A[0][0] = 2 * (p1.x - p2.x);
A[0][1] = 2 * (p1.y - p2.y);
A[0][2] = p2.x * p2.x - p1.x * p1.x + p2.y * p2.y - p1.y * p1.y;
A[0][3] = p1.x * p1.x - 2 * p1.x * X[0] + X[0] * X[0] + p1.y * p1.y - 2 * p1.y * X[1] + X[1] * X[1];
A[1][0] = 2 * (p2.x - p3.x);
A[1][1] = 2 * (p2.y - p3.y);
A[1][2] = p3.x * p3.x - p2.x * p2.x + p3.y * p3.y - p2.y * p2.y;
A[1][3] = p2.x * p2.x - 2 * p2.x * X[0] + X[0] * X[0] + p2.y * p2.y - 2 * p2.y * X[1] + X[1] * X[1];
A[2][0] = 2 * (p3.x - p1.x);
A[2][1] = 2 * (p3.y - p1.y);
A[2][2] = p1.x * p1.x - p3.x * p3.x + p1.y * p1.y - p3.y * p3.y;
A[2][3] = p3.x * p3.x - 2 * p3.x * X[0] + X[0] * X[0] + p3.y * p3.y - 2 * p3.y * X[1] + X[1] * X[1];
if (Gauss()) {
double x0 = X[0], y0 = X[1], r = sqrt(X[2] + x0 * x0 + y0 * y0);
cout << "圆的中心坐标为:" << "(" << x0 << ", " << y0 << ")" << endl;
cout << "圆的半径为:" << r << endl;
} else {
cout << "无法确定圆的中心坐标和半径" << endl;
}
return 0;
}
```
在程序中,我们首先输入三个点的坐标,并构造出线性方程组的系数矩阵 $A$ 和常数向量 $B$。然后使用高斯消元法求解线性方程组 $AX=B$,得到解向量 $X$。最后根据解向量 $X$ 计算圆的中心坐标和半径,并输出结果。需要注意的是,由于浮点数计算存在误差,我们需要定义一个很小的精度 eps,用于判断浮点数是否为 0。