如何根据圆心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
相关产品推荐
相关产品推荐

