-
Notifications
You must be signed in to change notification settings - Fork 1
已知圆上的两点坐标和半径,求圆心
pfan edited this page Apr 25, 2019
·
1 revision
数学分析:这个题目,涉及到简单的数学问题,但是计算比较繁琐。
假设已知圆上的两点坐标分别为 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
}