Skip to content

已知圆上的两点坐标和半径,求圆心

pfan edited this page Apr 25, 2019 · 1 revision

数学分析:这个题目,涉及到简单的数学问题,但是计算比较繁琐。

arc弧形

假设已知圆上的两点坐标分别为 N(X1,Y1) 和 M(X2,Y2),半径为R,圆心坐标为o(a,b),根据数学知识可得到:

(1) 式

// 弧线上点坐标与圆心链接 勾三股四
(x1 - a)^2 + (y1 - b)^2 = R^2

(2) 式

// 弧线上点坐标与圆心链接 勾三股四
(x2 - a)^2 + (y2 - b)^2 = R^2

分别展开上述两个式子得到

(3) 式

(x1)^2 - 2x1a + a^2 + (y1)^2 - 2y1b + b^2 = R^2   

(4) 式

(x2)^2 - 2x2a + a^2 + (y2)^2 - 2y2b + b^2 = R^2  

(3) 式 - (4) 式,得到 a 与 b 转换关系

 x1^2 - x2^2 + 2(x2 - x1)a + y1^2 - y2^2 + 2(y2 - y1)b = 0

 // 变形转换

 a = (x2^2 - x1^2 + y2^2 - y1^2) / (2 * (x2 - x1)) - (y2 - y1) / (x2 - x1) * b    

根据 a 与 b 转换关系,为了方便计算,再设两个常量:

    C1 = (x2^2 - x1^2 + y2^2 - y1^2)/2/(x2-x1)
    C2 = (y2-y1)/(x2-x1)

替换 ** (3) 式 - (4) 式**得出的转换关系,得到 (5)式

a = C1 - C2 * b 

(5) 式 代入** (1) 式**,得到;

x1^2 - 2 * x1 * (C1 - C2 * b) + (C1 - C2 * b)^2 + y1^2 -2 * y1 * b + b^2 = R^2

展开简化为关于b的一元二次方程一般形式;

(C2^2 + 1) * b^2 + (2 * x1 * C1 - 2 * C1 * C2 - 2 * y1) * b + x1^2 - 2 * x1 * C1 + C1^2 + y1^2 - R^2 = 0

得到求b的方程组 为了简化,再设置三个常量,提取系数:

// 二次项系数
A = (C2^2 + 1)
// 一次项系数
B = (2 * x1 * C1 - 2 * C1 * C2 - 2 * y1)
// 常数项
C = x1^2 - 2 * x1 * C1 + C1^2 + y1^2 - R^2

一元二次方程转化为:

(6) 式

A*b^2 + B*b + C = 0

根据 韦达定理 a^2 + 2 * a * b + b^2 = (a+b)^2解方程,得到:

b = (-B ± sqrt(B*B - 4 * A*C)) / (2 * A); 
// 根据 a = C1 - C2 * b , 得到 a
a = C1 - C2 * (-B ± sqrt(B*B - 4 * A*C)) / (2 * A)

韦达定理

根据以上推论,得出计算圆心算法:

function CircleCenter (x1, y1, x2, y2, R, x, y) {
    const c1 = (x2*x2 - x1*x1 + y2*y2 - y1*y1) / (2 *(x2 - x1))
    const c2 = (y2 - y1) / (x2 - x1)  //斜率
    const A = (c2*c2 + 1)  
    const B = (2 * x1*c2 - 2 * c1*c2 - 2 * y1)
    const C = x1*x1 - 2 * x1*c1 + c1*c1 + y1*y1 - R*R
    y = (-B ± sqrt(B*B - 4 * A*C)) / (2 * A)
    x = c1 - c2 * y    
}