2009-10-20 42 views
9

Tôi muốn xoay một CGPoint trên màn hình tùy thuộc vào góc và xoay được neo vào một điểm khác. Đã tự hỏi cách hiệu quả nhất để làm điều này là gì?Cách tốt nhất để xoay CGPoint trên lưới là gì?

+0

Bạn có nghĩa là bạn muốn xoay một cái gì đó xung quanh một điểm? – Jasarien

+0

Yea hiển nhiên từ một điểm xuất phát. – Frank

Trả lời

24

Bạn cũng có thể sử dụng:

rotatedPoint = CGPointApplyAffineTransform(initialPoint, CGAffineTransformMakeRotation(angle)); 

EDIT: để thực hiện luân chuyển quanh điểm tùy chỉnh bạn phải làm như Adam được mô tả trong câu trả lời của mình. Sử dụng CGAffineTransform phải có dạng như sau:

CGAffineTransform translateTransform = CGAffineTransformMakeTranslation(customCenter.x, customCenter.y); 
CGAffineTransform rotationTransform = CGAffineTransformMakeRotation(angle); 

CGAffineTransform customRotation = CGAffineTransformConcat(CGAffineTransformConcat(CGAffineTransformInvert(translateTransform), rotationTransform), translateTransform); 

rotatedPoint = CGPointApplyAffineTransform(initialPoint, customRotation); 
+0

hiện điều này xoay vòng xử lý trên một điểm khác sang một mình trên chính nó? – Frank

+0

chỉ thực hiện một vài thay đổi trên mã đó, CGAffineTransformMakeTransation là CGAffineTransformMakeTranslation, typo nhỏ. và cho góc, nó phải là radian nhưng khác hơn là công trình này thx! – Frank

10

Sử dụng 2D rotation matrix. Nếu bạn muốn xoay một điểm ngược về nguồn gốc của một góc angle, sau đó bạn sẽ làm điều này:

CGPoint RotatePointAboutOrigin(CGPoint point, float angle) 
{ 
    float s = sinf(angle); 
    float c = cosf(angle); 
    return CGPointMake(c * point.x - s * point.y, s * point.x + c * point.y); 
} 

Nếu bạn muốn xoay quanh một điểm khác so với xuất xứ, bạn sẽ phải trừ đi đầu tiên trung tâm quay vòng từ điểm của bạn, xoay nó bằng cách sử dụng ở trên, và sau đó thêm trở lại trong tâm quay (điều này được gọi là cách chia động từ trong lý thuyết ma trận).

+0

Adam, Bạn đã cứu mạng tôi với lời giải thích về cách chia động từ. Cảm ơn bạn :) –

1

Bạn cũng có thể để Core Animation làm điều đó cho bạn. Hãy nhìn vào tài liệu của Apple trên lớp hình học và biến đổi trong Core Animation Programming Guide

Tất cả bạn phải làm là thiết lập các anchorPoint của lớp và sau đó bạn có thể áp dụng các thay đổi với một cái gì đó như thế này:

CABasicAnimation *rotationAnimation; 
rotationAnimation = [CABasicAnimation 
        animationWithKeyPath:@"transform.rotation.z"]; 

[rotationAnimation setFromValue:DegreesToNumber(0)]; 
[rotationAnimation setToValue:DegreesToNumber(360)]; 

DegreesToNumber chuyển đổi độ thành radian và trả về một biểu diễn NSNumber.

Tôi không chắc chắn những gì bạn đang cố gắng làm chính xác, nhưng thường Hoạt ảnh cốt lõi là lựa chọn tuyệt vời cho việc hiển thị trực quan.

0

Sử dụng Vladimir’s answer, dưới đây là Swift 3 câu trả lời:

let initialPoint = CGPoint(x: 100, y: 100) // the point you want to rotate 
    let translateTransform = CGAffineTransform(translationX: initialPoint.x, y: initialPoint.y) 
    let rotationTransform = CGAffineTransform(rotationAngle: angle) 
    let customRotation = (rotationTransform.concatenating(translateTransform.inverted())).concatenating(translateTransform) 
    rotatedPoint = initialPoint.applying(customRotation) 
Các vấn đề liên quan