2016-11-22 4 views
0

Ich habe versucht, ein Beispiel für die Verwendung der 2D-Transformationsmatrix zu finden, um einen CGPoint um den Mittelpunkt eines anderen CGPoint zu drehen, aber ich hatte kein Glück, etwas Neues zu finden.Rotierender CGPoint um einen Mittelpunkt

Hat es jemand geschafft, dies zu erreichen? Die Verwendung von CGAffineTransform ist in diesem Anwendungsfall keine Option, da ich die Punkte benötige.

Dank im Voraus

Antwort

1

Der einfachste Weg, einen beliebigen Punkt drehen sich um diesen Punkt ist auf Null, Drehen um den gewünschten Winkel zu bewegen, und zurück zum Ursprung bewegen. CGAffineTransform kann sehr gut mit CGPoint arbeiten:

let transform = CGAffineTransform(translationX:-center.x y:-center.y) 
        .rotate(by:angle) 
        .translateBy(x:center.x, y:center.y) 
let newPoint = point.applying(transform) 
+0

Diese Methode funktionierte nicht wirklich in meinem Anwendungsfall. Die Methode von hier funktioniert perfekt! http://StackOverflow.com/a/1595337/3591202 – bevbomb

+0

Was funktioniert wirklich nicht? Ihre Lösung ist manchmal unnötig, weil Sie Quadratwurzeln und die inversen Tangens verwenden. Hinweis: "Winkel" ist im Bogenmaß nicht in Grad angegeben. – clemens

0

CGAffineTransform Verwendung war nicht wirklich eine Option in meinem Anwendungsfall, aber ich konnte erfolgreich eine Reihe von CGPoints unter Verwendung des Verfahrens aus dieser https://stackoverflow.com/a/35683523/3591202 Antwort drehen. Unten ist die Erweiterung, die ich verwendet habe, um die CGPoints zu drehen.

func rotate(around center: CGPoint, with degrees: CGFloat) -> CGPoint { 
    let dx = self.x - center.x 
    let dy = self.y - center.y 
    let radius = sqrt(dx * dx + dy * dy) 
    let azimuth = atan2(dy, dx) // in radians 
    let newAzimuth = azimuth + degrees * CGFloat(M_PI/180.0) // convert it to radians 
    let x = center.x + radius * cos(newAzimuth) 
    let y = center.y + radius * sin(newAzimuth) 
    return CGPoint(x: x, y: y) 
} 
Verwandte Themen