2012-01-30 2 views
1

У меня есть действительно раздражающая проблема, пытающаяся рисовать в растровом CGContext. То, что я пытаюсь сделать, это то, что у меня есть несколько изображений, чтобы вставить в полный размер изображения. Можно войти в любую UIImageOrientation, и я написал код, чтобы правильно повернуть это правильно, но я борюсь со вторым битом, который пытается нарисовать другой вид при произвольном вращении вокруг своего центра.Рисунок CGContext, повернутый вокруг произвольной точки

Другой вид содержит изображение, выполненное, возможно, за пределами его границ. У меня возникает проблема с этим поворотным углом, как если бы это был UIView, который применял к нему аффинное преобразование. например представьте себе UIView в {100, 300} размера {20, 20} и аффинное преобразование, вращающее его на 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 градусов положение слишком далеко вверх и направо.

Может ли кто-нибудь увидеть, что я делаю неправильно здесь?

Update:

Глупый я, это больше, потому что я проходил в неправильном прямоугольнику! Отредактировано, чтобы избавиться от ссылок на неправильный размер. Тем не менее, это все еще не совсем верно.

ответ

4

OK Я исправил его. Первый момент заключался в том, что я сначала пропадал в неправильном прямоугольнике, когда я захватывал кадр из UIView, который применял к нему аффинное преобразование, и, как мы все знаем, фрейм в этом случае не определен. Скорее всего, это CGRect, который исходит от 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 ,

+0

Есть ли способ их перемещения в контексте? –

Смежные вопросы