如何在其自身范围的中心旋转UibezierPath



,假设我们有一个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仍然需要占据其包含视图中完全相同的区域。

我只能假定这是不起作用的,因为旋转中心不是我打算的问题……尽管即使说"旋转0",我也会得到相同的(错误(结果。

那么如何围绕自己的中心点旋转路径?

似乎应该有一个简单的线性代数矩阵乘法类型的东西,可以应用于点集。= t

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)
    }
}

我认为您不需要旋转。要将相同的形状倒置,只需将其翻转:

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

因此,如果其他任何人都试图在其自身边界矩形的中心旋转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))
    // ...
}

最新更新