Полукруг между 2 CGPoints - PullRequest
       67

Полукруг между 2 CGPoints

0 голосов
/ 15 января 2020

Я хочу нарисовать полукруг между 2 точками на окружности. Основное представляет часы, и я хочу нарисовать еще одну линию, чтобы представить прогресс от одного часа к другому, чтобы положение точек могло меняться. Прежде всего, я знаю X и Y двух интересующих меня точек. Вот как я пытаюсь добавить углы в UIBezierPath. Моя проблема в том, что новый круг начинается правильно, но заканчивается в совершенно случайном месте

let firstAngle = atan2(redPoint.y - circleCenter.y, redPoint.x - circleCenter.x)

let secondAngle = atan2(bluePoint.y - circleCenter.y, bluePoint.x - circleCenter.x) ```

    let circlePath1 = UIBezierPath(arcCenter: circleCenter,
                                   radius: circleRadius,
                                   startAngle: firstAngle,
                                   endAngle: secondAngle,
                                   clockwise: true) ```

Где бы я ни установил redPoint, круг начинается в правильном месте, но круг никогда не совпадает с bluePoint.

circle representation and points

Ответы [ 2 ]

1 голос
/ 15 января 2020

Я попробовал ваш код, и он работает для меня, если баллы на самом деле на , что окружность

    let redPoint = CGPoint(x: 100.0, y: 200.0)
    let bluePoint = CGPoint(x: 100.0, y: 0.0)
    let circleCenter = CGPoint(x: 100.0, y: 100.0)

    let circleRadius = CGFloat(100.0)

    let firstAngle = atan2(redPoint.y - circleCenter.y, redPoint.x - circleCenter.x)

    let secondAngle = atan2(bluePoint.y - circleCenter.y, bluePoint.x - circleCenter.x)

    let path = UIBezierPath(arcCenter: circleCenter,
                                radius: circleRadius,
                                startAngle: firstAngle,
                                endAngle: secondAngle,
                                clockwise: true)

    //Path in layer
    let shapeLayer = CAShapeLayer()
    shapeLayer.path = path.cgPath
    shapeLayer.strokeColor = UIColor.red.cgColor
    shapeLayer.lineWidth = 1.0

    self.view.layer.addSublayer(shapeLayer)

enter image description here

или например:

    let redPoint = CGPoint(x: 200.0, y: 100.0)
    let bluePoint = CGPoint(x: 100.0, y: 0.0)
    let circleCenter = CGPoint(x: 100.0, y: 100.0)

    let circleRadius = CGFloat(100.0)

Вы получаете:

enter image description here

Но если вы используете координаты, которые на самом деле не находятся на вашей окружности, вы получите неправильные результаты. Я предлагаю проверить ваши входные данные и, в конечном итоге, если точки принадлежат к желаемой окружности или нет.

0 голосов
/ 15 января 2020

Вы делаете это задом наперед. Не пытайтесь угадать угол, начав с расположения маленьких красных и синих кружков. Используйте угол, чтобы разместить маленькие красные и синие кружки.

enter image description here

В этом примере мои углы равны -1 и 2,8 (радианы). Сначала я рисую ар c (так же, как вы сделали); затем я накладываю круги, что тривиально, потому что я знаю, где находятся их центры (конечные точки ar c), путем преобразования полярных в декартовы координаты.

...