2016-11-22 7 views
0

Я пытаюсь найти пример использования матрицы 2D преобразования, чтобы повернуть CGPoint вокруг центра другого CGPoint, но мне не повезло найти что-то новое.Вращение CGPoint вокруг центральной точки

Неужели кому-то удалось это достичь? Использование CGAffineTransform не является вариантом в этом случае, так как мне нужны точки.

Заранее спасибо

ответ

1

Самый простой способ вращаться вокруг произвольной точки, чтобы переместить эту точку к нулю, поворот на требуемый угол, и двигаться обратно к началу координат. CGAffineTransform может работать с CGPoint очень хорошо:

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

Этот метод фактически не работает в моем случае использования. Метод отсюда отлично работал! http://stackoverflow.com/a/1595337/3591202 – bevbomb

+0

Что действительно не работает? Ваше решение иногда не нужно, потому что вы используете квадратные корни и обратные тангенсы. Примечание: 'angle' находится в радианах не в градусах. – clemens

0

Использование CGAffineTransform не был действительно вариант в моем случае использования, но я был в состоянии успешно повернуть серию CGPoints, используя метод из этого ответа https://stackoverflow.com/a/35683523/3591202. Ниже приведено расширение, которое я использовал для поворота CGPoints.

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) 
} 
Смежные вопросы