簡體   English   中英

CGContext繪圖圍繞任意點旋轉

[英]CGContext drawing rotated around arbitrary point

我有一個非常煩人的問題,試圖繪制到位圖CGContext中。 我想做的是將幾個圖像繪制成完整的圖像尺寸。 任何UIImageOrientation都可以輸入,我已經編寫了正確正確旋轉代碼的代碼,但是我在努力嘗試第二個位,它試圖圍繞其中心任意旋轉繪制另一種視圖。

另一個視圖包括可能在其邊界之外繪制的圖像。 我有一個問題是將它們以旋轉角度繪制,就好像是對其應用了仿射變換的UIView一樣。 例如,假設尺寸為{20,20}的{100,300}的UIView和仿射變換將其旋轉45度。 它將繞{110,310}旋轉。

我試過的是:

- (void)drawOtherViewInContext:(CGContextRef)context atRect:(CGRect)rect withRotation:(CGFloat)rotation contextSize:(CGSize)contextSize {
    CGRect thisFrame = <SOLVED_FEATURE_FRAME_RELATIVE_TO_RECT_SIZE>;
    thisFrame.origin.y = contextSize.height - thisFrame.origin.y - thisFrame.size.height;

    CGRect rotatedRect = CGRectApplyAffineTransform(CGRectMake(0.0f, 0.0f, rect.size.width, rect.size.height), CGAffineTransformMakeRotation(-rotation));

    CGAffineTransform transform = CGAffineTransformIdentity;
    transform = CGAffineTransformTranslate(transform, rect.origin.x, contextSize.height - rect.origin.y - rect.size.height);
    transform = CGAffineTransformTranslate(transform, 
                                           +(rotatedRect.size.width/2.0f), 
                                           +(rotatedRect.size.height/2.0f));
    transform = CGAffineTransformRotate(transform, -rotation);
    transform = CGAffineTransformTranslate(transform, 
                                           -(rect.size.width/2.0f), 
                                           -(rect.size.height/2.0f));

    CGContextConcatCTM(context, transform);
    CGContextDrawImage(context, thisFrame, theCGImageToDraw);
    CGContextConcatCTM(context, CGAffineTransformInvert(transform));
}

所以我想在這里做的是:

  1. 平移到rect左下角,這就是要繪制此視圖的位置。

  2. 在x和y中平移旋轉大小的一半。

  3. 旋轉所需的角度。

  4. 將原始大小的一半折回x和y。

我認為這是我想要做的,因為第一步將坐標系轉換為相對於被告知要繪制的位置正確地繪制thisFrame (通過rect方法參數)。 然后,圍繞矩形的中心進行非常正常的旋轉。

問題是,當旋轉45度時,圖像會略微偏離原位。 這幾乎是正確的,但並非完全正確。 當處於0度,90度,180度或270度時,該位置會出現很多斑點,可能會向外伸出幾個像素,但是當處於45度,135度,225度和315度時,該位置會偏右。

有人可以在這里看到我在做什么錯嗎?

更新:

愚蠢的我,它更大,因為我傳遞的是錯誤的矩形! 編輯以擺脫對其尺寸錯誤的引用。 不過,它仍然不是正確的地方。

好,我已經解決了。 第一點是,我剛從一個UIView抓取幀時傳入了錯誤的矩形,該UIView對其應用了仿射變換,並且眾所周知,這種情況下的幀是不確定的。 更可能是來自CGRectApplyAffineTransform(bounds, transform)但是無論如何,我修復了那個。

然后,通過將我的變換更改為此來解決圖形偏移的主要問題:

CGAffineTransform transform = CGAffineTransformIdentity;
transform = CGAffineTransformTranslate(transform, rect.origin.x, contextSize.height - rect.origin.y - rect.size.height);
transform = CGAffineTransformTranslate(transform, 
                                       +(rect.size.width/2.0f), 
                                       +(rect.size.height/2.0f));
transform = CGAffineTransformRotate(transform, -rotation);
transform = CGAffineTransformTranslate(transform, 
                                       -(rect.size.width/2.0f), 
                                       -(rect.size.height/2.0f));

這就是我原本應該做的,但是由於某種原因,我將其更改為使用旋轉的CGRect。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM