有人可以显示可以快速执行此操作的代码吗?假设我们以左->右的顺序得到三个点 p1、p2、p3。因此,解决方案还应检查圆是否有效,即 (p1, p2, p3) 是否逆时针。
问问题
22499 次
3 回答
14
要计算圆参数,请查看:
http://paulbourke.net/geometry/circlesphere/ 查找“3 点圆方程(2 维)”
要确定方向,您可以使用多边形面积公式:
http://paulbourke.net/geometry/polygonmesh/ 寻找“计算多边形的面积和质心”
如果您需要特定的编程语言,请告诉我。
于 2012-05-02T04:36:14.883 回答
7
连接圆上的任意两点,你就有了和弦。
弦的垂直平分线必须通过中心。
两条和弦平分线的交点将是中心。
余数(简化为最有效计算的形式)留给读者作为练习......
于 2012-05-02T04:33:33.323 回答
1
这是一个只有一个 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)
}
于 2018-11-15T11:17:39.140 回答