如何在Core Graphics中于任意两点间绘制完美半圆?
在Core Graphics中用Swift绘制两点间指定方向的完美半圆
要实现这个需求,我们需要利用Core Graphics的addArc(center:radius:startAngle:endAngle:clockwise:)方法,核心是通过两点计算出半圆的圆心、半径,再结合指定的绘制方向确定角度参数。以下是针对你给出的示例点(CGPoint(x: 8, y: 92)和CGPoint(x: 28, y: 66))顺时针绘制半圆的完整参数推导和代码实现:
1. 核心前提
完美半圆的两个端点必须是直径的两端,因此我们可以基于这个特性推导所有参数:
2. 参数计算与代码实现
let p1 = CGPoint(x: 8, y: 92) let p2 = CGPoint(x: 28, y: 66) // 假设你已经获取了CGContext实例,比如在draw(_ rect: CGRect)方法中 guard let context = UIGraphicsGetCurrentContext() else { return } // 步骤1:计算半圆的圆心(两点连线的中点) let center = CGPoint(x: (p1.x + p2.x) / 2, y: (p1.y + p2.y) / 2) // 示例中计算结果:CGPoint(x: 18, y: 79) // 步骤2:计算半圆的半径(两点距离的一半) let dx = p2.x - p1.x let dy = p2.y - p1.y let radius = sqrt(dx * dx + dy * dy) / 2 // 示例中计算结果:≈16.4(精确值为√1076/2) // 步骤3:计算起始角度(圆心指向p1的向量对应的角度) // Core Graphics中角度以x轴正方向为0,逆时针为正,使用atan2(y, x)计算 let startAngle = atan2(p1.y - center.y, p1.x - center.x) // 示例中计算结果:≈2.268弧度(约130°) // 步骤4:计算结束角度(顺时针绘制半圆,角度跨度为π弧度,顺时针角度递减) let endAngle = startAngle - .pi // 示例中计算结果:≈-0.873弧度(约-50°,与p2对应的角度几乎一致,误差源于浮点计算) // 步骤5:调用addArc绘制顺时针半圆 context.addArc(center: center, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: true) // 可选:绘制路径(比如描边) context.setStrokeColor(UIColor.black.cgColor) context.setLineWidth(2) context.strokePath()
3. 参数解释
- center:半圆的圆心,由两个端点的中点得出——因为完美半圆的端点是直径两端,中点必然是圆心。
- radius:直径长度的一半,通过两点间的直线距离公式计算后除以2得到。
- startAngle:以圆心为原点,指向第一个端点(p1)的向量角度,
atan2(y, x)中的y是p1与圆心的纵向差值,x是横向差值,符合Core Graphics的角度规则。 - endAngle:因为要绘制半圆,角度跨度固定为π弧度(180°);顺时针绘制时,Core Graphics的角度是递减的,因此用起始角度减去π即可。
- clockwise:设为
true,明确指定绘制方向为顺时针。
4. 切换绘制方向
如果需要绘制逆时针方向的半圆,只需调整两个参数:
// 逆时针绘制时,结束角度为起始角度加上π弧度 let endAngle = startAngle + .pi // 同时将clockwise设为false context.addArc(center: center, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: false)
内容的提问来源于stack exchange,提问作者Gregory Higley
相关产品推荐
相关产品推荐

