已知圆上三点坐标求圆心

//求圆心坐标
    getCenterPos:function(x1,y1,x2,y2,x3,y3){
        var a=2*(x2-x1);
        var b=2*(y2-y1);
        var c=x2*x2+y2*y2-x1*x1-y1*y1;
        var d=2*(x3-x2);
        var e=2*(y3-y2);
        var f=x3*x3+y3*y3-x2*x2-y2*y2;
        var x=(b*f-e*c)/(b*d-e*a);
        var y=(d*c-a*f)/(b*d-e*a);
        cc.log("x:"+x+"y:"+y);
        r=sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1));//半径
    },

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
圆心坐标,需要知道的方程,因此我们需要先的方程,然后再圆心坐标。 假设已知圆上三点为 (x1, y1), (x2, y2), (x3, y3),则的方程可以表示为: ``` (x - a)^2 + (y - b)^2 = r^2 ``` 其中,(a, b)为圆心坐标,r为的半径。将三个点带入上述方程,可以得到一个关于a, b, r的方程组,可以通过解方程组圆心坐标。 为了方便起见,我们可以先将方程转化为以下形式: ``` x^2 + y^2 + Ax + By + C = 0 ``` 其中, ``` A = -2a B = -2b C = a^2 + b^2 - r^2 ``` 将三个点带入上述方程,可以得到三个方程: ``` x1^2 + y1^2 + Ax1 + By1 + C = 0 x2^2 + y2^2 + Ax2 + By2 + C = 0 x3^2 + y3^2 + Ax3 + By3 + C = 0 ``` 将其写成矩阵形式: ``` | x1^2 + y1^2 x1 y1 1 | | A | | -C | | x2^2 + y2^2 x2 y2 1 | * | B | = | -C | | x3^2 + y3^2 x3 y3 1 | | C | | -C | ``` 可以通过解上述线性方程组得到A、B、C的值,从而圆心坐标和半径。 在Qt中可以使用QMatrix类来表示矩阵,使用QVector类来表示向量,可以通过QMatrix::inverted()函数解矩阵的逆矩阵,进而解线性方程组。具体实现如下: ```cpp #include <QCoreApplication> #include <QVector> #include <QMatrix> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 已知圆上三个点 double x1 = 0, y1 = 0; double x2 = 1, y2 = 1; double x3 = 2, y3 = 0; // 构造系数矩阵 QMatrix A; A(0, 0) = x1 * x1 + y1 * y1; A(0, 1) = x1; A(0, 2) = y1; A(0, 3) = 1; A(1, 0) = x2 * x2 + y2 * y2; A(1, 1) = x2; A(1, 2) = y2; A(1, 3) = 1; A(2, 0) = x3 * x3 + y3 * y3; A(2, 1) = x3; A(2, 2) = y3; A(2, 3) = 1; A(3, 0) = 2 * x1; A(3, 1) = 1; A(3, 2) = 0; A(3, 3) = 0; A(4, 0) = 2 * x2; A(4, 1) = 1; A(4, 2) = 0; A(4, 3) = 0; A(5, 0) = 2 * x3; A(5, 1) = 1; A(5, 2) = 0; A(5, 3) = 0; A(6, 0) = 0; A(6, 1) = 0; A(6, 2) = 2 * y1; A(6, 3) = 1; A(7, 0) = 0; A(7, 1) = 0; A(7, 2) = 2 * y2; A(7, 3) = 1; A(8, 0) = 0; A(8, 1) = 0; A(8, 2) = 2 * y3; A(8, 3) = 1; // 构造常数向量 QVector<double> b(9); b[0] = -x1 * x1 - y1 * y1; b[1] = -x2 * x2 - y2 * y2; b[2] = -x3 * x3 - y3 * y3; b[3] = -2 * x1; b[4] = -2 * x2; b[5] = -2 * x3; b[6] = -2 * y1; b[7] = -2 * y2; b[8] = -2 * y3; // 解线性方程组 QMatrix A_inv = A.inverted(); QVector<double> x = A_inv * b; // 提取圆心坐标和半径 double a = -x[1] / 2; double b = -x[2] / 2; double r = sqrt(a * a + b * b - x[0]); qDebug() << "圆心坐标:" << a << "," << b; qDebug() << "半径:" << r; return a.exec(); } ``` 注意,这里的解方法只适用于三个点不共线的情况,如果三个点共线,则无法构造出的方程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值