You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:40:13