Как повернуть UIBezierPath вокруг центра своих границ? - PullRequest
0 голосов
/ 25 апреля 2018

Допустим, у нас есть UIBezierPath ... границы которого совершенно квадратные ... как это:

func getExponentPath(rotate180: Bool) -> UIBezierPath {

    // establish unit of measure (grid) based on this containing view's bounds... (not to be confused with this bezierpath's bounds)

    let G = bounds.width / 5

    let exponentPath = UIBezierPath()

    let sstartPoint = CGPoint(x:(3.8)*G,y:(1.2)*G)
    exponentPath.move(to: sstartPoint)
    exponentPath.addLine(to: CGPoint(x:(5)*G,y:(1.2)*G))
    exponentPath.addLine(to: CGPoint(x:(4.4)*G,y:(0.2)*G))
    exponentPath.addLine(to: CGPoint(x:(5)*G,y:(0.2)*G))
    exponentPath.addLine(to: CGPoint(x:(5)*G,y:(0)*G))
    exponentPath.addLine(to: CGPoint(x:(3.8)*G,y:(0)*G))
    exponentPath.addLine(to: CGPoint(x:(3.8)*G,y:(0.2)*G))
    exponentPath.addLine(to: CGPoint(x:(4.4)*G,y:(0.2)*G))
    exponentPath.addLine(to: sstartPoint)

    exponentPath.close()

    // this does not work:
    // if rotate180 { exponentPath.apply(CGAffineTransform(rotationAngle: CGFloat.pi)) }

    return exponentPath

}

Если повернуть, этот bezierpath все еще должен занимать ту же самую область в пределах его содержанияview.

Я могу только предположить, что это не работает, потому что есть некоторая проблема с центром вращения, не являющимся тем, что я намереваюсь ... хотя я получаю тот же (неправильный) результат, даже когда говорю "повернуть на 0."

Итак, как можно повернуть траекторию вокруг своей центральной точки?

Кажется, что должен существовать простой тип умножения матрицы линейной алгебры, который можно применить к множеству точек.= Т

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

Так что, если кто-то еще пытается повернуть UIBezierPath в центре своего ограничивающего прямоугольника ... это фактическое рабочее решение, полученное с помощью предыдущих ответов / комментариев:

func getExponentPath(rotationAngle: CGFloat) -> UIBezierPath {

    // ...

    let x_translation = -( (bounds.width) - ( exponentPath.bounds.width/2) )
    let y_translation = -exponentPath.bounds.height/2

    exponentPath.apply(CGAffineTransform(translationX: x_translation, y: y_translation))
    exponentPath.apply(CGAffineTransform(rotationAngle: rotationAngle))
    exponentPath.apply(CGAffineTransform(translationX: -x_translation, y: -y_translation))

    // ...

}
0 голосов
/ 08 ноября 2018
extension UIBezierPath
{
    func rotateAroundCenter(angle: CGFloat)
    {
        let center = self.bounds.getCenter()
        var transform = CGAffineTransform.identity
        transform = transform.translatedBy(x: center.x, y: center.y)
        transform = transform.rotated(by: angle)
        transform = transform.translatedBy(x: -center.x, y: -center.y)
        self.apply(transform)
    }
}
0 голосов
/ 25 апреля 2018

Я не думаю, что вам нужно вращение.Чтобы нарисовать ту же фигуру вверх ногами, просто переверните ее:

        exponentPath.apply(CGAffineTransform(scaleX: 1, y: -1))
        exponentPath.apply(CGAffineTransform(translationX: 0, y: G))
...