2016-02-28 5 views

ответ

7

Это действительно вопрос математики. В Swift, вы хотите что-то вроде:

func rotatePoint(target: CGPoint, aroundOrigin origin: CGPoint, byDegrees: CGFloat) -> CGPoint { 
    let dx = target.x - origin.x 
    let dy = target.y - origin.y 
    let radius = sqrt(dx * dx + dy * dy) 
    let azimuth = atan2(dy, dx) // in radians 
    let newAzimuth = azimuth + byDegrees * CGFloat(M_PI/180.0) // convert it to radians 
    let x = origin.x + radius * cos(newAzimuth) 
    let y = origin.y + radius * sin(newAzimuth) 
    return CGPoint(x: x, y: y) 
} 

Есть много способов, чтобы упростить это, и это идеальный случай для расширения к CGPoint, но я оставил его многословным для ясности.

+0

Спасибо, это сработало отлично – Benja0906

+0

Это работало отлично! Единственный ответ, который я нашел, работает без использования CGAffineTransform – bevbomb

0
public extension CGFloat { 
    ///Returns radians if given degrees 
    var radians: CGFloat{return self * .pi/180} 
}  

public extension CGPoint { 
    ///Rotates point by given degrees 
    func rotate(origin: CGPoint? = CGPoint(x: 0.5, y: 0.5), _ byDegrees: CGFloat) -> CGPoint { 
     guard let origin = origin else {return self} 

     let rotationSin = sin(byDegrees.radians) 
     let rotationCos = cos(byDegrees.radians) 

     let x = (self.x * rotationCos - self.y * rotationSin) + origin.x 
     let y = (self.x * rotationSin + self.y * rotationCos) + origin.y 

     return CGPoint(x: x, y: y) 
    } 
} 

Использование

var myPoint = CGPoint(x: 40, y: 50).rotate(45) 
var myPoint = CGPoint(x: 40, y: 50).rotate(origin: CGPoint(x: 0, y: 0), 45) 
Смежные вопросы