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

如何根据圆心CGPoint和半径获取圆形周边的N个CGPoint?

解决Swift中获取圆周N个点的问题

嘿,我来帮你把这个函数补全!你的思路已经找对方向了,只差最后一步计算每个点的坐标,直接看完整实现吧:

func getCirclePoints(centerPoint point: CGPoint, and radius: CGFloat, n: Int) -> [CGPoint] {
    // 注意这里要把360和n都转成CGFloat,避免整数除法导致的精度问题
    let angleStep = CGFloat(360) / CGFloat(n)
    let result: [CGPoint] = stride(from: 0.0, to: 360.0, by: angleStep).map { angle in
        // 将角度转换为弧度(三角函数只接受弧度参数)
        let bearing = angle * .pi / 180
        // 计算当前点的x、y坐标
        let x = point.x + radius * cos(bearing)
        // 如果你希望点按顺时针排列(适配iOS屏幕y轴向下的特性),把下面的+改成-即可
        let y = point.y + radius * sin(bearing)
        return CGPoint(x: x, y: y)
    }
    return result
}

// 调用示例:获取圆心在(160,160)、半径100的圆周上12个点
let circlePoints = getCirclePoints(centerPoint: CGPoint(x: 160, y: 160), and: 100, n: 12)

关键细节说明:

  • 角度步长修正:原来的CGFloat(360 / n)会因为整数除法丢失精度(比如n=7时,360/7整数除法得到51,实际应该是约51.428),改成CGFloat(360)/CGFloat(n)就能保证精度。
  • 坐标系适配:iOS屏幕坐标系的y轴是向下的,而标准三角函数的坐标系y轴向上。如果希望点从右侧开始顺时针排列,把y坐标的计算改成point.y - radius * sin(bearing);保持+的话,点会是逆时针排列。
  • 弧度转换:Swift的cos/sin函数只接受弧度参数,所以必须通过角度 * π / 180完成角度到弧度的转换。

内容的提问来源于stack exchange,提问作者AamirR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:39:01