从圆上的三个点计算圆心和半径

12

请问有谁能快速展示代码?假设我们得到了按从左到右顺序排列的三个点 p1、p2、p3。因此,解决方案还应该检查圆是否有效,即 (p1, p2, p3) 是否为逆时针。

3个回答

14

正是我所需要的,解释详尽清晰。谢谢! - themaestro
两个链接都失效了。还有其他的链接吗? - Sharjith N.
@SharjithN./M.Hassan - 链接已修复。 - Maple
任何依赖于斜率(m =(y2-y1)/(x2-x1))的解决方案在直线垂直时不起作用(x2-x1 = 0,你会除以零)。线性代数是正确的方法。 - NovaDenizen

7
  • 在圆上连接任意两点,就形成了一条弦。

  • 一条弦的垂直平分线必须通过圆心。

  • 两条弦的平分线的交点将是圆心。

剩余部分(将其化为最有效计算的形式)留给读者作为练习...


2
这里有一个只有一个if语句的简短函数(使用Swift语言)。
enum Result {
    case circle(center: CGPoint, radius: CGFloat)
    case invalid
}

func circleTouching3Points(a: CGPoint, b: CGPoint, c: CGPoint) -> Result {
    let d1 = CGPoint(x: b.y - a.y, y: a.x - b.x)
    let d2 = CGPoint(x: c.y - a.y, y: a.x - c.x)
    let k: CGFloat = d2.x * d1.y - d2.y * d1.x
    guard k < -0.00001 || k > 0.00001 else {
        return Result.invalid
    }
    let s1 = CGPoint(x: (a.x + b.x) / 2, y: (a.y + b.y) / 2)
    let s2 = CGPoint(x: (a.x + c.x) / 2, y: (a.y + c.y) / 2)
    let l: CGFloat = d1.x * (s2.y - s1.y) - d1.y * (s2.x - s1.x)
    let m: CGFloat = l / k
    let center = CGPoint(x: s2.x + m * d2.x, y: s2.y + m * d2.y)
    let dx = center.x - a.x
    let dy = center.y - a.y
    let radius = sqrt(dx * dx + dy * dy)
    return Result.circle(center: center, radius: radius)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接