从3个点计算圆的中心和半径

时间:2012-05-02 04:25:54

标签: center geometry

有人可以展示能够快速完成此操作的代码吗?假设我们得到三分 p1,p2,p3在左 - 右;右。因此,解决方案还应检查圆是否有效,即(p1,p2,p3)是逆时针。

3 个答案:

答案 0 :(得分:12)

要计算圆参数,请查看:

http://paulbourke.net/geometry/circlesphere/ 寻找“3点(2维)圆的方程”

确定方向,可以使用多边形区域公式:

http://paulbourke.net/geometry/polygonmesh/ 查找“计算多边形的面积和质心”

如果您需要使用特定的编程语言,请告诉我。

答案 1 :(得分:7)

  • 连接圆圈上的任意两个点,你就有一个和弦。

  • 和弦的垂直二等分线必须穿过中心。

  • 两个和弦的平分线的交点将成为中心。

剩余(减少到最有效计算的形式)留给读者练习......

答案 2 :(得分:1)

这是一个短函数(Swift语言),只有一个if。

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)
}