Получить N количество CGPoints вокруг круга на UIView - PullRequest
0 голосов
/ 03 мая 2018

У меня есть центр CGPoint и радиус Float, мне нужно получить N точек вокруг окружности, например, на рисунке ниже показано, как получить 12 точек, соответствующих красным точкам.

enter image description here

Это моя неполная функция:

func getCirclePoints(centerPoint point: CGPoint, and radius: CGFloat, n: Int) [CGPoint] {
    let result: [CGPoint] = stride(from: 0.0, to: 360.0, by: CGFloat(360 / n)).map {
        let bearing = $0 * .pi / 180
        // NO IDEA WHERE TO MOVE FURTHER
    }
    return result
}

getCirclePoints(centerPoint: CGPoint(x: 160, y: 240), radius: 120.0, n: 12)

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Вы были почти там!

func getCirclePoints(centerPoint point: CGPoint, radius: CGFloat, n: Int)->[CGPoint] {
    let result: [CGPoint] = stride(from: 0.0, to: 360.0, by: Double(360 / n)).map {
        let bearing = CGFloat($0) * .pi / 180
        let x = point.x + radius * cos(bearing)
        let y = point.y + radius * sin(bearing)
        return CGPoint(x: x, y: y)
    }
    return result
}
let points = getCirclePoints(centerPoint: CGPoint(x: 160, y: 240), radius: 120.0, n: 12)

Я не думаю, что and было очень ясно в качестве имени аргумента, поэтому я удалил это.

0 голосов
/ 03 мая 2018

Для получения ссылки на ничью

import UIKit

let numOfItems = 10

class customView : UIView {

    // Only override draw() if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.

    override func draw(_ rect: CGRect) {

        for i in 0...numOfItems
        {

            let angle   = 360/CGFloat(numOfItems)  * CGFloat(i) * .pi / 180

            let rad = self.bounds.size.width/2 - 10

            let x =  bounds.midX + cos(angle) * rad

            let y =  bounds.midY + sin(angle) * rad

            let circlePath = UIBezierPath(
                arcCenter: CGPoint(x:x,y:y),
                radius:10,
                startAngle:0,
                endAngle:360,
                clockwise: true)

            let shapeLayer = CAShapeLayer()

            shapeLayer.fillColor = UIColor.red.cgColor
            shapeLayer.strokeColor = UIColor.blue.cgColor
            shapeLayer.lineWidth = 3
            shapeLayer.path = circlePath.cgPath
            layer.addSublayer(shapeLayer)

        }

    }

}

enter image description here

0 голосов
/ 03 мая 2018

Используйте радианы вместо градусов. Они нужны внутри тригонометрических функций

func getCirclePoints(centerPoint point: CGPoint, and radius: CGFloat, n: Int) -> [CGPoint] {
    return Array(repeating: 0, count: n).enumerated().map { offset, element in
        let cgFloatIndex = CGFloat(offset)
        let radiansStep = CGFloat.pi * CGFloat(2.0) / CGFloat(n)
        let radians = radiansStep * cgFloatIndex
        let x = cos(radians) * radius + point.x
        let y = sin(radians) * radius + point.y
        return CGPoint(x: x, y: y)
    }
}
func getCirclePoints1(centerPoint point: CGPoint, and radius: CGFloat, n: Int) -> [CGPoint] {
    var resultPoints: [CGPoint] = []
    let radianStep = CGFloat.pi * CGFloat(2.0) / CGFloat(n)
    for radians in stride(from: CGFloat(0.0), to: CGFloat.pi * CGFloat(2.0), by: radianStep) {
        let x = cos(radians) * radius + point.x
        let y = sin(radians) * radius + point.y
        resultPoints.append(CGPoint(x: x, y: y))
    }
    return resultPoints
}
func getCirclePoints2(centerPoint point: CGPoint, and radius: CGFloat, n: Int) -> [CGPoint] {
    let radianStep = CGFloat.pi * CGFloat(2.0) / CGFloat(n)
    return stride(from: CGFloat(0.0), to: CGFloat.pi * CGFloat(2.0), by: radianStep).map { element in
        let cgFloatIndex = CGFloat(element)
        let radiansStep = CGFloat.pi * CGFloat(2.0) / CGFloat(n)
        let radians = radiansStep * cgFloatIndex
        let x = cos(radians) * radius + point.x
        let y = sin(radians) * radius + point.y
        return CGPoint(x: x, y: y)
    }
}

getCirclePoints(centerPoint: CGPoint(x: 160, y: 240), and: 120.0, n: 12)
...